我有一个带有websocket-rails gem的Ruby on Rails 3.2应用程序,在nginx反向代理后面的瘦web服务器中运行.
除了nginx反向代理,一切正常.通过删除nginx反向代理,websocket通信工作正常.(开发和生产).使用nginx作为websockets的反向代理是问题的起点.
Nginx 1.3.13及更高版本应该能够支持websocket代理.根据这里和这里的文档,我创建了以下nginx配置:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream ravecy {
server localhost:3000;
server localhost:3001;
}
server {
listen 80;
server_name test.ravecy.com;
root /var/www/ravecy.com/public;
location / {
try_files $uri @ravecy;
}
location @ravecy {
proxy_pass http://ravecy;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $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;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,遗憾的是,这不起作用.我不知道为什么,但在我看来,nginx并没有处理我的websocket连接尝试作为websocket连接而是常规HTTP连接,如日志所示:
==> production.log <==
Started GET "/chat" …Run Code Online (Sandbox Code Playgroud)