Faye-rails, ngnix, пассажирский медленный ответ от Фэй

Я хочу создать простой чат. Я не гуру администрирования сервера. Так что у меня есть вопрос по поводу ngnix и faye.

Я использую ngnix + passenger для моего производственного сервера. У меня есть дроплет на digitalocean и я хочу развернуть на нем свое приложение. Поэтому для развертывания я использую официальное учебное пособие для пассажиров https://www.phusionpassenger.com/library/install/nginx/install/oss/trusty/

Для обратных вызовов моделей я использую гем faye-rails. Как говорят фэй-рельсы, если я использую пассажира, мне нужно использовать эту конфигурацию

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

В моем развитии 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;

}

Нужно ли мне обновить мой /etc/ngnix/sites-enabled/myapp.conf и как? Или что мне нужно сделать?

1 ответ

В настоящее время я использую 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;
     }

}

Эта ссылка должна немного рассказать о том, как она работает. 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)

После запуска нового экрана запустите сервер Faye на этом экране, используя rackup: rackup faye.ru -s thin -E production

Как примечание, с этой опцией каждый раз, когда вы перезагружаете свой сервер Digital Ocean (т.е. если вы создаете снимок экрана в качестве резервной копии), вам нужно будет создать новый экран и снова запустить сервер faye; однако, использование чего-то вроде Daemon было бы лучшей реализацией, чтобы обойти это (я просто еще не реализовал это...). Зайдите на Github и найдите FooBarWidget/daemon_controller.

Дайте мне знать, если у вас есть другие вопросы, и я постараюсь помочь!

Другие вопросы по тегам