我正在尝试在我的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与其他位置设置混合。