socket.io/websockets的nginx配置

时间:2014-10-29 18:33:05

标签: nginx websocket socket.io

我在配置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连接到它?我很难过,任何帮助都会受到赞赏。

2 个答案:

答案 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; }