在Nginx搭建配置Https与WSS环境
这几天一直忙着折腾websocket的连接问题。在http下使用new WebSocket('ws://xxx');
没有问题,但是在切换到https之后这个连接浏览器就开始报错甚至直接抛出异常。之前没有注意过websocket在两个不同协议下有什么不同,实际上按照标准来是有如下对应关系的:
http | -> |
|
https | -> |
|
也就是在https下应该使用wss协议,且wss下不支持ip地址形式,必须写成域名形式。
但是,有可能还是会提示无法连接到 wss://xxx
,那么这个时候就需要使用代理了:nginx代理wss
前提条件及准备工作:
1、已经安装nginx,版本不低于1.3
2、假设Workerman监听的是2345端口(websocket协议)
3、已经申请了证书(pem/crt文件及key文件),并且已经正确配置好SSL
4、打算利用nginx开启443端口对外提供wss代理服务(端口可以根据需要修改)
5、nginx一般作为网站服务器运行着其它服务,为了不影响原来的站点使用,这里使用地址 域名/wss
作为wss的代理入口。也就是客户端连接地址为 wss://域名/wss
nginx配置类似如下(lnmp的配置文件位置:/usr/local/nginx/confvhost\域名.conf
):
server {
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/server/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/server/server.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
location /wss
{
proxy_pass http://127.0.0.1:2345;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
# location / {} 站点的其它配置...
}
测试
// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://域名/wss");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};