vlambda博客
学习文章列表

nginx如何把日志推送到远程服务器与其如何配置websocket

Nginx作为最常用的反向代理和负载均衡服务器,被广泛的应用在众多互联网项目的前置服务中,很多互联网项目直接将Nginx服务器作为整个项目的流量入口。因此可以通过对Nginx服务器日志的分析就可了解整个网站的访问总量、PV、UV、VV等信息。实际上,企业的业务线众多,很难使用一台Nginx服务器来代理所有的线上服务,这就导致企业会在线上部署多台Nginx服务器。因此要分析所有Nginx服务器的总流量信息时,如果分别对每个Nginx服务器进行分析,再汇总所有的信息,一方面增加了分析的复杂度,另一方面也不好维护这些日志信息。因此大部分企业会将这些日志信息统一汇总到某个数据存储集群中,以方便进行数据存储、维护与分析统计。
nginx的日志如何格式化推送到远程服务器
在nginx.conf配置如下配置即
log_format common "$remote_addr,$http_ip,$http_mac,$time_local,$status,$request_length,$bytes_sent,$body_bytes_sent,$http_user_agent,$http_referer,$request_method,$request_time,$request_uri,$server_protocol,$request_body,$http_token";
log_format main "$remote_addr,$http_ip,$http_mac,$time_local,$status,$request_length,$bytes_sent,$body_bytes_sent,$http_user_agent,$http_referer,$request_method,$request_time,$request_uri,$server_protocol,$request_body,$http_token";
access_log logs/access.log common;
access_log syslog:server=192.168.1.10:9999,facility=local7,tag=nginx,severity=info main; map $http_upgrade $connection_upgrade { default upgrade; '' close; }

配置解析:将nginx的日志各项参数以逗号分割形式输出,同时nginx将nginx日志实时推送到192.168.1.10:9999上,这时候我们可以在192.168.1.10服务器上部署一个tcp/udp服务,监听端口9999,并在防火墙开放9999端口,我们编写的tcp/udp就能实时接收到nginx推送过来的日志,然后将nginx日志实时收集到某个存储集群中,就可以对nginx日志进行统一存储、维护和分析。

互联网领域,很多h5/app/小程序的产品,为了增加用户的交互感和用户粘度,多多少少都会涉及到聊天功能。而对于Web端与H5来说,实现聊天最简单的就是使用WebSocket,但是实现WebSocket聊天的过程中,后台通常要部署多个WebSocket服务,多个WebSocket服务之间就可以通过Nginx进行负载均衡。
nginx配置websocket
在nginx.conf进行如下配置,实际运用修改ip和端口接口,这种方式不仅简单,而且很有效,能够横向扩展websocket服务端的服务能力。
map $http_upgrade $connection_upgrade {  default upgrade;  '' close; } upstream wsbackend{  server ip1:port1;  server ip2:port2;  keepalive 1000; server {  listen 20038;  location /{  proxy_http_version 1.1;  proxy_pass http://wsbackend;  proxy_redirect off;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_read_timeout 3600s;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection $connection_upgrade;  } }
接着我们对这个配置进行详细说明一下
map $http_upgrade $connection_upgrade {  default upgrade;  '' close; }

该配置表达的是如果$http_upgrade不为空,则$connection_upgrade为upgrade,如果$http_upgrade为空,则$connection_upgrade为close。

upstream wsbackend{  server ip1:port1;  server ip2:port2;  keepalive 1000; }
该段是nginx的负载均衡配置,俩台服务器(ip1:port1和ip2:port2),keeplive 1000表示每个nginx进程中上游服务器保持的空闲连接,当空闲连接过多时,会关闭最少使用的空闲连接。但这个不是限制连接总数的,可以理解为空闲连接池的大小,设置的值应该是上游服务器能接受的。
server {  listen 20038;  location /{  proxy_http_version 1.1;  proxy_pass http://wsbackend;  proxy_redirect off;  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_read_timeout 3600s;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection $connection_upgrade;  } }
这段是监听服务器的配置:
listen 20038:表示nginx监听的端口
locations / :表示监听的路径(/表示所有路径,通用匹配,相当于default)
proxt_http_version 1.1L表示反向代理发送的HTTP协议的版本是1.1,HTTP1.1支持长连接
proxy_pass http://wsbackend;:表示反向代理的uri,可以使用负载均衡变量
proxy_redirect off; 表示不要替换路径,如果是/,这个有没有都没关系,因为default也是将路径替换到proxy_pass的后边
proxy_set_header Host $host; 表示传递时请求头不变, $host是nginx内置变量,表示的是当前的请求头,proxy_set_header表示设置请求头
proxy_set_header X-Real-IP $remote_addr; 表示传递时来源的ip还是现在的客户端的ip
proxy_read_timeout 3600s;表的两次请求之间的间隔超过 3600s 后才关闭这个连接,默认的60s,自动关闭的元凶
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 表示X-Forwarded-For头不发生改变
proxy_set_header Upgrade $http_upgrade; 表示设置Upgrade不变
proxy_set_header Connection $connection_upgrade; 表示如果 $http_upgrade为upgrade,则请求为upgrade(websocket),如果不是,就关闭连接