所以我尝试使用Bryan Bate的private_pub gem(faye gem的包装器)设置一个rails应用程序来创建聊天频道。它在开发模式下在我的本地机器上运行良好。
我也在我的rails应用程序启动的同时启动了端口8080上的private_pub服务器,其中包含一行初始化文件:
Thread.new do
system("rackup private_pub.ru -s thin -E production -p 8080")
end
然而,在使用nginx webserver和puma app sever部署到aws ec2 ubuntu实例之后,chrome控制台每2秒就会显示一次,并且实时聊天功能不起作用。
GET http://localhost:8080/faye.js net::ERR_CONNECTION_REFUSED
如果我在我的aws安全组中打开端口8080,当我进入实例时,我可以使用来自localhost:8080 / faye.js的curl在faye.js中看到大量的javascript代码。如果我转到http://my.apps.public.ip:8080/faye.js,我也可以从浏览器访问它。如果我从安全组中删除8080,则无法访问它,因此我认为这不是防火墙问题。
此外,如果我将地址从localhost更改为0.0.0.0或我的ec2实例的公共IP,Chrome控制台错误消失了,但实时聊天仍然无法正常工作。
我怀疑我可能需要对nginx进行更多配置,因为到目前为止我所做的所有配置nginx服务器都在/ etc / nginx / sites-available / default中,我有:
upstream app {
server unix:/home/deploy/myappname/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /home/deploy/myappname/public;
try_files $uri/index.html $uri @app;
location / {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_pass http://app;
}
location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
gzip_static on;
expires max;
add_header Cache-Control public;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
但也许这与nginx无关,我很遗憾。有没有人经历过这个或者可以提出替代解决方案?如果需要,我可以在这里发布任何其他配置文件。
答案 0 :(得分:1)
<强>解决强>
首先我接受了Ian的建议并将server_name设置为我的公共IP
然后
基于http://www.johng.co.uk/2014/02/18/running-faye-on-port-80/
的指南我添加了位置块
location ^~ /faye {
proxy_pass http://127.0.0.1:9292/faye;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_buffering off;
proxy_cache_bypass $http_pragma $http_authorization;
proxy_no_cache $http_pragma $http_authorization;
}
最后,对于我的private_pub.yml,我设置了生产的faye入口点:
production:
server: "http://my.public.ip:80/faye/faye"
secret_token: "mysecrettoken"
signature_expiration: 3600 # one hour
现在我的应用程序中的聊天响应速度比我在heroku上使用远程独立聊天服务器的速度要快得多,因为聊天服务器和我的主应用程序都在同一个实例中运行。