Tengine 添加配置支持Websocket

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nimasike/article/details/91388699

后端使用Netty搭建Websocket服务器,前端可以用Nginx代理Websocket流量。并且配置SSL,Client与Nginx通过SSL加密传输,Nginx卸载SSL, Nginx与Netty内网明文传输,下面给出关键配置。

   //普通Web代理
    upstream favtomcat {
       server 192.168.80.112:80;
       keepalive 32;
    }
	
    //Websocket代理
	upstream websocket {
       server 192.168.80.112:8080;
       keepalive 32;
    }

可以讲Websocket和普通Web代理配置为一个端口,这样服务器防火墙不用增加额外端口。

前端Websocket访问路径:new WebSocket("wss://192.168.80.110:443/websocket");

wss为使用SSL加密传输。  ws为明文传输。

server {
        listen 443 ssl;
        server_name  localhost;

        ssl_certificate      /home/certs/nginx.crt;
        ssl_certificate_key  /home/certs/privkey.pem;

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

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        ssl_session_tickets off; 

       //普通Web代理
        location / {
            proxy_pass http://favtomcat;
            proxy_http_version 1.1;
            #proxy_set_header Connection "";
            #root   html;
            #index  index.html index.htm;
        }
		
        //Websocket代理
		location /websocket {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			proxy_set_header X-Real-IP $remote_addr;
        }
    }

也可以配置不同端口

server {
        listen 444 ssl;
        server_name  localhost;

        ssl_certificate      /home/certs/nginx.crt;
        ssl_certificate_key  /home/certs/privkey.pem;

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

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        ssl_session_tickets off; 

        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			proxy_set_header X-Real-IP $remote_addr;
        }
    }

访问普通WEB-URL的抓包截图,正常走https没问题。

Nginx代理Websocket的流量,可以正常转发。

其中80.1到80.110是Nginx的数据包,接着80.110会把数据包转发到80.112。

返回的数据包从80.112发送到80.110,接着80.110把数据包发送到80.1

可以看到,80.1到80.110的数据包已经通过SSL加密了。

最后补充一下,还可以配置健康检查Netty的状态。

upstream websocket {
    check interval=6000 fall=5 rise=2 timeout=2000 default_down=true type=tcp;
    server 192.168.80.112:8080;
    server 192.168.80.110:8080;
    keepalive 32;
}

猜你喜欢

转载自blog.csdn.net/nimasike/article/details/91388699