版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}