Faye-rails,ngnix,乘客对来自faye的反应迟钝

fac*_*ool 5 ruby-on-rails passenger nginx faye

我想创建一个简单的聊天.我不是服务器管理的大师.所以我对ngnix和faye有疑问.

我使用ngnix + passenger作为我的生产服务器.我在digitalocean上有一个Droplet,并且希望在此部署我的应用程序.所以对于部署我使用官方乘客教程https://www.phusionpassenger.com/library/install/nginx/install/oss/trusty/

对于模型回调,我使用faye-rails gem.就像faye-rails所说,如果我使用乘客,我需要使用这种配置

config.middleware.use FayeRails::Middleware, mount: '/faye', :timeout => 25, server: 'passenger', engine: {type: Faye::Redis, host: 'localhost'} do
  map '/announce/**' => SomeController  
end
Run Code Online (Sandbox Code Playgroud)

在我的开发localhost:3000聊天工作非常快.但是当我部署它时,它的工作速度非常慢(响应时间间隔为5到60秒).我不知道如何解决它.

在我的/etc/ngnix/sites-enabled/myapp.conf中我使用此配置:

server {
    listen 80;
    server_name server_ip;

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /project_path_to_public;

    # Turn on Passenger
    passenger_enabled on;
    passenger_ruby /ruby_wrapper_path;

}
Run Code Online (Sandbox Code Playgroud)

需要我升级我的/etc/ngnix/sites-enabled/myapp.conf以及如何?或者我需要做什么?

Rem*_*any 0

我目前正在开发的应用程序中使用 Faye 和 Redis。这不是问题当前设置的直接解决方案,而是我实施的替代方法。下面是我的 nginx 配置,然后我让 Faye 通过rackup 在服务器的屏幕上运行。

/etc/nginx/sites-enabled/application.conf:

server {
     listen 80;
     listen [::]:80;
     server_name beta.application.org;

     # Tell Nginx and Passenger where your app's 'public' directory is
     root /var/www/application/current/public;

     # Turn on Passeger
     passenger_enabled on;
     passenger_ruby /usr/local/rvm/gems/ruby-2.2.1/wrappers/ruby;
     rails_env production;

     location ~* ^/assets/ {
          # Per RFC2616 - 1 year maximum expiry
          # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
          expires 1y;
          add_header Cache-Control public;
          add_header Last-Modified "";
          add_header ETag "";
          break;
     }

}

map $http_upgrade $connection_upgrade {
     default upgrade;
     '' close;
}

upstream websocket {
     server 127.0.0.1:9292;
}

server {
     listen 8020;
     location / {
          proxy_pass http://127.0.0.1:9292/push;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $connection_upgrade;
     }

}
Run Code Online (Sandbox Code Playgroud)

此链接应该提供对其工作原理的一些了解。 https://chrislea.com/2013/02/23/proxying-websockets-with-nginx/

您还可以参考 Faye github,获取有关使用 Passenger 设置它的一些指导。

另外,如果您按照 Digital Ocean 教程进行初始服务器设置并最终启用了防火墙,请确保允许运行 Faye/websockets 的端口。(请参阅此处配置基本防火墙:针对新 Ubuntu 14.04 服务器的其他建议步骤

我的替代方法是在服务器上的单独屏幕中运行 Faye。管理 ubuntu 服务器上的屏幕需要的一些命令是:

screen -S <pick screen name> (new screen)
screen -ls (lists screens)
screen -r <screen number> (attach screen)
to quit from a screen, ctrl + a THEN "d" (detach screen)
Run Code Online (Sandbox Code Playgroud)

运行新屏幕后,使用rackup在该屏幕中运行Faye服务器:rackup faye.ru -s thin -E production

请注意,使用此选项,每次重新启动 Digital Ocean 服务器时(即,如果您创建屏幕截图作为备份),您将需要创建一个新屏幕并再次运行 faye 服务器;然而,使用像 Daemon 这样的东西会是一个更好的实现来规避这个(我只是还没有实现它......)。前往 Github 并查找 FooBarWidget/daemon_controller。

如果您还有任何其他问题,请告诉我,我会尽力提供帮助!