nginx 如何代理websocket

前言

下面是配置nginx websocket 的代码。

# HTTPS server
map $http_upgrade $connection_upgrade {

	default upgrade;
	'' close;
}

upstream websocket {
	server localhost:30000; #本地websocket反向代理地址
}
server {
	listen       443 ssl;
	server_name  www.51kanyisheng.com;

	ssl_certificate      D://ssl//wwwnginx//value.crt;
	ssl_certificate_key  D://ssl//wwwnginx//cert.key;

	ssl_session_cache    shared:SSL:1m;
	ssl_session_timeout  5m;

	ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

	location / {
		#root   html;
		#index  index.html index.htm;

		proxy_pass https://www.xxxx:10000;
	}
	# 监听app
	location /websocket {  
		proxy_pass http://websocket;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $connection_upgrade;
	   #proxy_set_header Host $host;
	}   

}

正文

为什么这么配置呢?

看一下如何建立websocket 配置:

首先浏览器会和我们沟通发布:

GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

然后我们会一个:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

这其实是http协议,在websocket 连接建立之前我们需要去沟通切换协议。

$http_upgrade 客户端请求中$http_upgrade 的值,来构造改变$connection_upgrade的值,即根据变量$http_upgrade的值创建新的变量$connection_upgrade

map 的详解是:

https://blog.51cto.com/tchuairen/2175525?source=dra

在websocket 代理过程中,过一段时间会出现断开的现象,这是因为nginx 代理默认了一段时间没有响应就会断开。

我们需要设置一个心跳包,合理的调整nginx 的断开时间。

posted @ 2020-06-24 18:31  敖毛毛  阅读(1737)  评论(0编辑  收藏  举报