我在配置nginx代理websockets方面遇到了一些麻烦。我有一个node.js应用程序,它使用socket.io v0.9.16监听端口9090上的连接,nginx v1.6.2监听端口9000,并且(据称)配置为将请求代理到我的node.js应用程序。 nginx配置如下所示:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 9000;
server_name mysite.com;
location / {
root /var/www/mysite/web;
}
location /socket.io/ {
proxy_pass http://localhost:9090;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
我很确定问题出在nginx上,因为如果我直接在端口9090上访问我的节点应用程序,那么/var/www/mysite/web
中的静态内容和websockets都能正常工作,但如果我尝试通过nginx在端口9000上,只有正确提供静态内容。
Chrome开发工具显示对socket.io(http://my.ip.add.ress:9000/socket.io/1/?t=1414606847141)的初始请求被浏览器“取消”(我在Firefox和Safari上尝试过类似的结果)。
这可能是一个安全问题吗?浏览器是否“知道”socket.io在端口9090上运行并拒绝通过9000连接到它?我很难过,任何帮助都会受到赞赏。
答案 0 :(得分:0)
好的,我修好了。问题是在我的客户端代码中,我使用IP地址而不是主机名连接到服务器:
io.connect('http://my.ip.add.ress')
所以socket.io请求没有被nginx配置匹配,改变上面一行使用'mysite.com'主机名解决了它。
答案 1 :(得分:0)
由于您使用的是websockets / socket.io,您应该使用ip_hash。
upstream project {
ip_hash;
server 127.0.0.2:4000;
server 127.0.0.3:4000;
}