我有这个演示设置:
在端口8001上运行的node.js WebSocket服务器#1(使用' socket.io')
在端口8002上运行的node.js WebSocket服务器#2(使用' socket.io')
在端口8000上运行的nginx websocket反向代理:
将任何请求重定向到/ wstest1 /到端口8001(服务器#1)将任何请求重定向到/ wstest2 /到端口8002(服务器#2)
node.js客户端(使用' socket.io-client' ,而不是浏览器JavaScript客户端)尝试连接到服务器#1:
var socket = require('socket.io-client')('ws://localhost:8000/wstest1/');
但它无法连接。 nginx日志说:
127.0.0.1 - - [06/Feb/2015:16:16:04 +0100] "GET /socket.io/?EIO=3&transport=polling&t=1423235764132-1&b64=1 HTTP/1.1" 404 168 "-" "node-XMLHttpRequest"
所以/wstest1/
的路径丢失了。
/wstest1/
?
nginx设置:
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 8000;
location /wstest1/ {
proxy_pass http://localhost:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /wstest2/ {
proxy_pass http://localhost:8002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
更新:我刚刚发现了这个很好的解释(socket.io/docs/client-api/),为什么它不起作用:
为指定的命名空间返回一个Socket实例 URL中的路径名,默认为/。例如,如果网址是 http://localhost/users,将建立传输连接 将建立http://localhost和Socket.IO连接 /用户。
有关此问题的解决方法吗?
羞辱我。 RTFM / RTFC的经典案例(代码为C):
使用正确的路径:
var socket = require('socket.io-client')('ws://localhost:8000', {path: '/wstest1/socket.io'});
使用正确的nginx配置:
proxy_pass http://localhost:8001/;
这个小尾随/
有所不同。
答案 0 :(得分:0)
在/etc/nginx/nginx.conf中设置位置
location /wstest1 {
proxy_pass http://localhost:8001;
}
location /wstest2 {
proxy_pass http://localhost:8002;
}
查看更多: http://nginx.org/en/docs/http/ngx_http_core_module.html#location
答案 1 :(得分:0)
请参阅http://socket.io/docs/rooms-and-namespaces/上的文档。
重要说明:命名空间是Socket.IO协议的实现细节,与底层传输的实际URL无关,默认为/socket.io/...。
如果您希望将socket.io端点托管在' / wstest1'或者' / wstest2'简单地将其作为“路径”传递出去。创建服务器时的参数。