2014-10-29 94 views
1

我在配置nginx代理websockets时遇到了一些麻烦。我有一个node.js应用程序,它使用socket.io v0.9.16监听端口9090上的连接,监听端口9000上的nginx v1.6.2,并且(据说)配置为将请求代理到我的node.js应用程序中。 nginx的配置如下:nginx配置socket.io/websockets

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的做工精细,但如果我尝试通过端口9000上的nginx,然后只有静态内容得到正确的服务。

Chrome开发工具显示,socket.io(http://my.ip.add.ress:9000/socket.io/1/?t=1414606847141)的初始请求被浏览器取消(我试过Firefox和Safari,结果类似)。

这可能是一个安全问题?浏览器是否“知道”socket.io在端口9090上运行并拒绝通过9000连接它?我很难过,任何帮助将不胜感激。

回答

0

好的,我弄明白了。问题是,在我的客户端代码,我连接到服务器使用的IP地址,而不是主机名:

io.connect('http://my.ip.add.ress') 

所以socket.io请求并没有被nginx的配置相匹配,改变了上面一行用'mysite.com'主机名解决了它。

0

由于您使用的是websockets/socket.io,因此您应该使用ip_hash。

upstream project { ip_hash; server 127.0.0.2:4000; server 127.0.0.3:4000; }

+0

确实ip_hash提供任何好处,如果你没有负载均衡?我只在1台服务器上运行我的应用程序 – codebox 2014-10-30 11:09:18

+0

是的,客户端可以连接到不同的服务器上,并且每当一台服务器出现故障时,您就可以在不加载静态内容的情况下向下一台服务器发送消息。 – Darkerz 2014-10-30 11:16:40