在Nginx搭建配置Https与WSS环境

作者: 分类: 服务器 发布时间: 2021-04-08 21:31 浏览人数:110
 

这几天一直忙着折腾websocket的连接问题。在http下使用new WebSocket('ws://xxx');没有问题,但是在切换到https之后这个连接浏览器就开始报错甚至直接抛出异常。之前没有注意过websocket在两个不同协议下有什么不同,实际上按照标准来是有如下对应关系的:

http->
new WebSocket('ws://xxx')
https->
new WebSocket('wss://xxx')


也就是在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);
};

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!