1. 申请相关
照着腾讯云教程走了一遍没走啥弯路,懒得写了待填坑
2. WebSocket & Nginx
目前我的个人网站上只有一个基于ws模块的WebSocket聊天室,在服务器认证完https之后,发现原来的WebSocket失效了
Google浏览器的提示
当时只是觉得因为在前端没有将WebSocket的地址从
ws://...
更新为wss://...
后来在前端更改请求地址为
wss://...
以后仍然提示错误failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR
查阅了别的朋友走过的坑才发现
const WebSocket = require('ws');
const server = new WebSocket.Server({port: 3000});
以这种方式建立的服务器不能处理经SSL加密过的请求,这种情况有两种解决方案:
- 利用Nginx反向代理,将服务器发给客户端的消息转发到
/websocket
路由上
向Nginx配置文件中https部分添加location /websocket {...}
,如下所示
server {
listen 443 ssl;
# ...
# 其他设置
# ...
location /websocket {
proxy_pass http://localhost:3000; # example
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
之后重启Nginx服务
nginx -s reload
然后在前端使用
const ws = new WebSocket("wss://yourhost.com/websocket");
即可解决
- 在服务端以以下这种方式创建服务器(ws作者在GitHub上的建议):
const server = https.createServer({
cert: fs.readFileSync('/etc/letsencrypt/live/xxx.xxx/fullchain.pem'),
key: fs.readFileSync('/etc/letsencrypt/live/xxx.xxx/privkey.pem')
});
const wss = new WebSocket.Server({ server });
server.listen(4321);
即可通过端口方式请求wss
const ws = new WebSocket("wss://example.org:4321");