具有主要应用程序的Websockets(nginx+乘客+faye)



我正在尝试在我的rails应用程序上设置websockets。我的应用程序适用于使用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";
    }

我遇到了类似的问题,经过一段时间的挣扎,我终于可以让它工作了。

我正在使用带有宝石"faye-rails"的服务器的 nginx 1.8,我的挂载点是 /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"时。在我尝试"位置/faye"和"位置~/faye"之前,它失败了。看起来等号"="可以防止nginx与其他位置设置混合。

相关内容

  • 没有找到相关文章

最新更新