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:活着但不是消息传递?

nginx 反向代理 websockets

Elastic Beanstalk 上的 WebSockets 与 Docker

修改 nginx 配置以正确反向代理 websockets

Nginx 作为 websockets 和 post 请求的转发代理