背景:同事问我一个问题,nginx怎么代理websocket。
前面几天比较忙,今天总算能抽点时间出来折腾一下。
配置 Nginx 反向代理 WebSocket: https://www.hi-linux.com/posts/42176.html
上面的文章其实比较细了,我来给它精简一下。
// app.js
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8010 });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
console.log(`Received from client: %s', ${message}`);
ws.send(`Server received from client: ${message}`);
});
});
coffeescript
测试socket,可以使用wscat这个npm包。
这里假设对/sockjs-node的path进行URL代理。
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /sockjs-node {
proxy_pass http://127.0.0.1:8010;
proxy_read_timeout 300s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
正如网上说的,和普通的HTTP反向代理不同的点就是多加了:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
仅仅配置这个就OK了么?不!会报错的。。
解决方法是:加一个map,与server平级
http {
...
gzip on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
....
}
}
OK,那我们来测试一下吧!
搞定了~~~