Websockets 与主要应用程序(nginx + 乘客 + faye)
Posted
技术标签:
【中文标题】Websockets 与主要应用程序(nginx + 乘客 + faye)【英文标题】:Websockets with the main application (nginx + passenger + faye) 【发布时间】:2014-12-08 01:41:27 【问题描述】:我正在尝试在我的 rails 应用程序上设置 websocket。我的应用程序适用于使用 SocketRocker 库的 ios 客户端。
作为 websockets 后端,我使用 faye-rails gem。 它作为机架中间件集成到 rails 应用程序
config.middleware.delete Rack::Lock
config.middleware.use FayeRails::Middleware, mount: '/ws', server: 'passenger', engine: type: Faye::Redis, uri: redis_uri, :timeout => 25 do
map default: :block
end
在我使用 nginx 将其上传到生产服务器之前,它可以完美运行。我尝试了很多解决方案将 websocket 请求传递到后端,但没有运气。主要的是有两台服务器正在运行,但我只有一台。我的想法是我只需要代理从 /faye 端点到 /ws 的请求(以更新标头)。就我而言,正确的 proxy_pass 参数应该是什么?
location /faye
proxy_pass http://$server_name/ws;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
【问题讨论】:
运气好能解决这个问题吗?我目前遇到了类似的问题。 我停止使用中间件并单独启动套接字服务器。 正是我要做的,我想它会是这样的。谢谢! 【参考方案1】:我也遇到过类似的问题,经过一段时间的努力,终于搞定了。
我正在使用 nginx 1.8 和带有 gem 'faye-rails' 的 thin 服务器,我的挂载点是 /faye
我的 nginx 配置如下所示:
upstream thin_server
server 127.0.0.1:3000;
map $http_upgrade $connection_upgrade
default upgrade;
'' close;
server
...
proxy_redirect off;
proxy_cache off;
location = /faye
proxy_pass http://thin_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
location /
try_files $uri/index.html $uri.html $uri @proxy;
location @proxy
proxy_pass http://thin_server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
...
我让它发挥作用的最后一个转折点是当我设置“location = /faye”时。在我尝试“location /faye”和“location ~ /faye”之前,它失败了。 看起来等号“=”阻止 nginx 与其他位置设置混合。
【讨论】:
以上是关于Websockets 与主要应用程序(nginx + 乘客 + faye)的主要内容,如果未能解决你的问题,请参考以下文章
使用 nginx 和 daphne 部署 django、channels 和 websockets
Nginx 和 Flask-socketio Websockets:活着但不是消息传递?