nginx可以用作后端websocket服务器的反向代理吗?

我们正在研究一个需要利用html5 websockets的Ruby on Rails应用程序。 目前,我们有两个独立的“服务器”可以这么说:我们的主要应用程序运行在nginx +乘客上,另一个服务器使用Pratik Naik的Cramp框架(运行在Thin上 )来处理websocket连接。

理想情况下,当部署的时候,我们应该在nginx + passenger上运行rails应用程序,而websocket服务器将在nginx后面代理,所以我们不需要让websocket服务器运行在不同的端口上。

问题是,在这个设置中,似乎nginx过早地closures了Thin的连接。 连接成功build立到瘦服务器,然后立即closures200响应代码。 我们的猜测是,nginx并没有意识到客户端正在尝试为websocketstream量build立一个长期运行的连接。

不可否认的是,我并不是那么了解nginxconfiguration,所以,甚至有可能configurationnginx作为websocket服务器的反向代理吗? 还是我必须等待nginx提供新的websocket握手的支持? 假设让应用服务器和websocket服务器在端口80上侦听是必需的,那么可能意味着我现在必须在没有nginx的单独的服务器上运行Thin。

提前感谢您的任何意见或build议。 🙂

-约翰

目前你不能使用nginx [这不是真的了] ,但我会build议看看HAProxy。 我已经用它来达到这个目的。

诀窍是设置长时间超时,以便套接字连接不closures。 就像是:

timeout client 86400000 # In the frontend timeout server 86400000 # In the backend 

如果你想在同一个端口上使用rails和cramp应用程序,你可以使用ACL规则来检测一个websocket连接并使用不同的后端。 所以你的haproxy前端configuration看起来像

 frontend all 0.0.0.0:80 timeout client 86400000 default_backend rails_backend acl websocket hdr(Upgrade) -i WebSocket use_backend cramp_backend if websocket 

为了完整性,后端将看起来像

 backend cramp_backend timeout server 86400000 server cramp1 localhost:8090 maxconn 200 check 

如何使用我的nginx_tcp_proxy_module模块 ?

这个模块是为使用Nginx的通用TCP代理而devise的。 我认为这也适合websocket。 我只是在开发分支中添加tcp_ssl_module。

nginx(> = 1.3.13)现在支持反向代理websocket。

 # the upstream server doesn't need a prefix! # no need for wss:// or http:// because nginx will upgrade to http1.1 in the config below upstream app_server { server localhost:3000; } server { # ... location / { proxy_pass http://app_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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_redirect off; } } 

开箱即用(正式来源)Nginx可以只build立到上游(=后端)的HTTP 1.0连接,这意味着不会存在keepalive:Nginx将select一个上游服务器,打开连接,代理,caching(如果你想)并closures连接。 而已。

这是需要持久连接到后端的框架不能通过Nginx工作的根本原因(没有HTTP / 1.1 =没有keepalive和我猜测没有websockets)。 尽pipe有这样的缺点,但有一个明显的好处:Nginx可以从多个上游(负载均衡)中select一个,并在故障转移的情况下进行故障切换。

编辑 :Nginx从版本1.1.4开始支持HTTP 1.1到后端和Keepalive。 支持“fastcgi”和“proxy”上游。 这里是文档

对于任何想知道同样问题的人来说,nginx现在正式支持HTTP 1.1上游。 有关“keepalive”和“proxy_http_version 1.1”,请参见nginx文档。

如何使用新的HTTP Push模块Nginx: http : //pushmodule.slact.net/ 。 它负责连接杂耍(可以这么说),可能不得不担心使用反向代理。 Websockets当然是一个可行的替代scheme,但它还没有完全实现。 我知道HTTP Push模块的开发者仍然在一个完全稳定的版本上工作,但是正在积极的开发中。 在生产代码库中有它的版本。 引用作者的话:“一个有趣的工具,一个无聊的名字。”

我使用nginx将代理转换为长轮询连接的彗星式服务器,效果很好。 确保将proxy_send_timeout和proxy_read_timeoutconfiguration为适当的值。 另外请确保您的后端服务器,nginx代理支持http 1.0,因为我不认为nginx的代理模块的http 1.1还没有。

只是为了解决一些困惑中的一些答案:Keepalive允许客户端重用连接发送另一个HTTP请求。 这与长时间的投票或者保持关系是无关紧要的,直到事件发生,这就是最初的问题。 所以没关系,nginx的代理模块只支持没有keepalive的HTTP 1.0。

Interesting Posts