使用 nginx 和 faye 的 Websocket 连接失败
Websocket connection failed with nginx and faye
我想在我的 Rails 应用程序中引入聊天功能。为此,我使用了 gem private_pub 并且它在开发模式下完美运行。
在生产中我使用的是 Apache + Passenger,但我无法用它配置 Faye,所以我将 Apache 更改为 Nginx。我的主要应用程序仍在 Apache 服务器上,而此演示在端口 8080 的 Nginx 上(仅用于测试)。
我可以通过输入 http://chat.mysite.com:8080/faye.js 连接到 faye.js,但是来自应用程序的连接会抛出错误(浏览器控制台)。
WebSocket connection to 'ws://localhost:9292/faye' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
此错误后,每 5 秒出现另一个错误。
faye.js:2 GET http://localhost:9292/faye?message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fhands…22%2C%22callback-polling%22%5D%2C%22id%22%3A%221%22%7D%5D&jsonp=jsonp2 net::ERR_CONNECTION_REFUSED
我的private_pub.yml
production:
server: "http://localhost:9292/faye"
secret_token: "mysecret"
signature_expiration: 3600 # one hour
我的private_pub.ru
require "bundler/setup"
require "yaml"
require "faye"
require "private_pub"
Faye::WebSocket.load_adapter('thin')
PrivatePub.load_config(File.expand_path("../config/private_pub.yml", __FILE__), ENV["RAILS_ENV"] || "development")
run PrivatePub.faye_app
我的 nginx site.conf
server {
listen 8080;
server_name www.chat.mysite.com;
passenger_enabled on;
passenger_app_env production;
root /var/www/mysite/public;
location ^~ /faye {
proxy_pass http://127.0.0.1:9292;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_buffering off;
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
#proxy_set_header X-Forwarded-Proto https;
proxy_cache_bypass $http_pragma $http_authorization;
proxy_no_cache $http_pragma $http_authorization;
break;
}
}
如果我将 private_pub.yml 更改为 http://localhost:9292/faye/faye
,我会看到类似 "can't load resource /faye/faye.js" 的错误。
我应该如何更改我的 Nginx conf 或应用程序 yml 以解决 websocket 错误?
我看到 private_pub
在设计上与 ActionCable 非常相似。在你走得太远之前,你可能想阅读我关于“ActionAcable - The good and bad parts”的博客 post 因为它解决了像 private_pub
这样的系统好的时候合适的用例,当它不好的时候.
如果您当然已经意识到缺点,那么祝您好运!
我试着按照@niceman 所说的那样配置我的private_pub.yml。现在一切正常。
production:
server: "http://my-ip:8080/faye"
我想在我的 Rails 应用程序中引入聊天功能。为此,我使用了 gem private_pub 并且它在开发模式下完美运行。
在生产中我使用的是 Apache + Passenger,但我无法用它配置 Faye,所以我将 Apache 更改为 Nginx。我的主要应用程序仍在 Apache 服务器上,而此演示在端口 8080 的 Nginx 上(仅用于测试)。
我可以通过输入 http://chat.mysite.com:8080/faye.js 连接到 faye.js,但是来自应用程序的连接会抛出错误(浏览器控制台)。
WebSocket connection to 'ws://localhost:9292/faye' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
此错误后,每 5 秒出现另一个错误。
faye.js:2 GET http://localhost:9292/faye?message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fhands…22%2C%22callback-polling%22%5D%2C%22id%22%3A%221%22%7D%5D&jsonp=jsonp2 net::ERR_CONNECTION_REFUSED
我的private_pub.yml
production:
server: "http://localhost:9292/faye"
secret_token: "mysecret"
signature_expiration: 3600 # one hour
我的private_pub.ru
require "bundler/setup"
require "yaml"
require "faye"
require "private_pub"
Faye::WebSocket.load_adapter('thin')
PrivatePub.load_config(File.expand_path("../config/private_pub.yml", __FILE__), ENV["RAILS_ENV"] || "development")
run PrivatePub.faye_app
我的 nginx site.conf
server {
listen 8080;
server_name www.chat.mysite.com;
passenger_enabled on;
passenger_app_env production;
root /var/www/mysite/public;
location ^~ /faye {
proxy_pass http://127.0.0.1:9292;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_buffering off;
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
#proxy_set_header X-Forwarded-Proto https;
proxy_cache_bypass $http_pragma $http_authorization;
proxy_no_cache $http_pragma $http_authorization;
break;
}
}
如果我将 private_pub.yml 更改为 http://localhost:9292/faye/faye
,我会看到类似 "can't load resource /faye/faye.js" 的错误。
我应该如何更改我的 Nginx conf 或应用程序 yml 以解决 websocket 错误?
我看到 private_pub
在设计上与 ActionCable 非常相似。在你走得太远之前,你可能想阅读我关于“ActionAcable - The good and bad parts”的博客 post 因为它解决了像 private_pub
这样的系统好的时候合适的用例,当它不好的时候.
如果您当然已经意识到缺点,那么祝您好运!
我试着按照@niceman 所说的那样配置我的private_pub.yml。现在一切正常。
production:
server: "http://my-ip:8080/faye"