Nginx支持WebSocket配置

Posted 失之淡然,得之坦然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx支持WebSocket配置相关的知识,希望对你有一定的参考价值。

记录一下nginx代理WebSocket的配置

1 添加协议升级

在http模块添加协议升级配置

	http {
	      ... // 省略其它
		
	      map $http_upgrade $connection_upgrade {
                    default upgrade;
                    ‘‘ close;
	      }
	}

该配置用于将http协议升级为websocket协议

map说明:根据客户端请求中$http_upgrade的值,设定$connection_upgrade的值。{}内容是设定规则。即$connection_upgrade的值默认是upgrade;如果$http_upgrade为空字符串,则$connection_upgrade的值是close。

2 添加虚拟主机配置

	server {
              listen       8000;
              server_name  127.0.0.1;
		
	      ... // 省略其它
		
	      location /ws/ {
	          proxy_pass   http://wsserver/;
	          proxy_http_version 1.1;
                  proxy_set_header Upgrade $http_upgrade;
                  proxy_set_header Connection $connection_upgrade;
                  proxy_set_header Host $host;
	      }
	}
	
	upstream wsserver {
		server 127.0.0.1:10101;
		server 127.0.0.1:10102;
	}

前端或其他应用可以通过ws://127.0.0.1:8000/ws/wsServer访问该服务

3 超时中断问题

Nginx默认超时时间为60s。

当Nginx代理websocket,客户端与服务端建立连接后,若60s内无交互,则nginx会断开此连接。

为了解决这个问题,我们可以配置超时时间。

	location /ws/ {
		... // 省略其他
		proxy_connect_timeout 4s;            
		proxy_read_timeout 600s;                  # 10分钟无消息交互关闭连接
		proxy_send_timeout 12s;                  
	}

这样10分钟无交互才会断开。

但依旧不妥,如果应用程序就是11分钟才来消息呢。我们可以让客户端定时发送一个心跳。以前端为例:

	// 每5分钟发送一次心跳
	function keepSocket() {
		window.setInterval(function(){
			socket.send(‘ping‘);
		}, 300000);
	}

ps: 后台接收到ping后可以回复一个pong

以上是关于Nginx支持WebSocket配置的主要内容,如果未能解决你的问题,请参考以下文章

Nginx支持WebSocket配置

centos nginx配置支持WebSocket(signalR)

nginx配置websocket支持wss

ini 具有websocket支持的nodejs最简单的nginx站点配置

nginx配置支持https和wss(websocket)协议

Nginx 入口控制器 websocket 支持