昨天公司刚刚提出微信小程序过审必须支持wss,当时蒙圈开始以为C++要加入OpenSSL,来支持wss。后来上网查找发现nginx进行代理中转(不需要更改任何C++代码)就可以实现协议支持,不禁感慨nginx强大与自己知识薄弱。 言归正传。
1、C++支持WS请求(略)
2、C++进一步支持WSS请求
不用修改任何C++代码,方法流程
upstream websocket_7003{
server 192.168.199.152:7003; #C++服务器ip port ws://192.168.199.152:7003能够访问
}
server {
listen 80;
listen 443 ssl http2; #SSL 监听443端口
server_name 192.168.199.152 test.game.net; #ip port对应域名
ssl on;
ssl_certificate /data/ssl/test.game.net.pem; #证书
ssl_certificate_key /data/ssl/test.game.net.key;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3; #支持协议
ssl_prefer_server_ciphers on;
access_log /data/nginx_log/test.game.net_access.log;
error_log /data/nginx_log/test.game.net_error.log;
location /wss7003 {
access_log /data/nginx_log/come-websocket.log;
proxy_pass http://websocket_7003; #向上中转地址
proxy_read_timeout 500s; #500s没有数据传输,中断连接
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'Upgrade';
}
location ~ /\.ht {
deny all;
}
}
1、test.game.net 域名与证书是绑定的
2、C:\Windows\System32\drivers\etc\hosts 添加 192.168.199.152 test.game.net 看下本地能不能ping
3、client->send msg->nginx(wss://test.game.net/wss7003)->向上传输->C++服务器(192.168.199.152:7003),此过程从wss->nginx->ws->C++server对于用户来说是透明的,非常方便简洁。
4、如果做分布式,upstream websocket配置多个ip port,ip_hash来保证玩家能够随机分配服务器登录,同时nginx能够做到负载均衡,非常强大。但是这样做有个缺点,就是如果要求制定登录ip和port就没有办法做到了。
upstream websocket{
ip_hash;
server 192.168.199.152:7001;
server 192.168.199.152:7002;
server 192.168.199.152:7003;
.
.
.
server 192.168.199.152:7010;
}
5、指定ip port登录,多个ip port就要对应多个二级域名,这样登录wss://test.game.net/wss7001就是登录C++服务器(192.168.199.152:7001)。
upstream websocket_7001{
server 192.168.199.152:7001;
}
upstream websocket_7002{
server 192.168.199.152:7002;
}
upstream websocket_7003{
server 192.168.199.152:7003;
}
server {
...
location /wss7001 {
...
}
location /wss7002 {
...
}
location /wss7003 {
...
}
...
}
6、nginx相当于网关服务器,能够保持服务器安全。