Как развернуть приложение Ruby Rack с помощью NGINX

Я хочу развернуть простую службу Ruby Rack с NGINX. Я читал разные вещи в Интернете, ни одна из которых не была достаточно полезна. Допустим, у меня это (на самом деле это немного сложнее, но все еще < 200 строк службы кода):

require 'rack'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

Rack::Handler::Mongrel.run HelloWorld, Port: 9292

Я хотел бы знать, что было бы лучшим способом развернуть это с помощью NGINX. Может быть, FCGI или что-то еще?

Ответ 1

вот базовая конфигурация nginx для случая, когда вы идете с решением unicorn/thin:

upstream rack_upstream {
  server 127.0.0.1:9292;
}

server {
  listen       80;
  server_name  domain.tld;
  charset UTF-8;

  location / {

    proxy_pass http://rack_upstream;
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }

  location ~* ^.+\.(jpg|jpeg|gif|png|css|js)$ {
    root /path/to/static/files;
  }
}

Если вы запустите nginx как root, вы сможете обслуживать свой сайт на порту 80.

иначе измените listen 80 на listen SOME-AVAILABLE-PORT

замените domain.tld на название вашего сайта

также вы можете добавить расширения файлов, которые будут обслуживаться nginx в regex (jpg|jpeg|gif|png|css|js), разделив их на |

подробнее см.:

http://wiki.nginx.org/DirectiveIndex

http://wiki.nginx.org/ServerBlockExample

http://wiki.nginx.org/FullExample

Ответ 2

Проще всего, вероятно, пассажир, который позволяет nginx обслуживать (помимо всего прочего) любое приложение на стойке. Он довольно прост в настройке, но поскольку у nginx нет загружаемых модулей, вам нужно установить nginx из исходного кода (установщик справляется со всем этим для вас).

Другой популярный способ - иметь nginx-прокси для единорога. Единорог - это рубиновый веб-сервер, который может размещать любое приложение в стойке. Как правило, вы позволяете nginx обрабатывать статические активы и отправлять остальные единорогам. У Единорога есть некоторые приятные функции по сравнению с тонким, mongrel и т.д., Например, он обрабатывает бесшовные перезагрузки в значительной степени из коробки.

Ответ 3

Развертывание nginx + пассажира довольно легко при использовании предварительно скомпилированных бинарных файлов для пассажиров (для Debian/Ubuntu). Важно иметь следующую структуру каталогов вашего проекта:

/var/www/my_app:
    \-- public/   <- public root of webserver
    \-- config.ru <- that where you place hello world
    \-- tmp
        \-- restart.txt

nginx config (возможно, например, в /etc/nginx/sites-available/my_site):

server {
  listen 80;
  server_name example.com;
  root /var/www/my_app/public;

  passenger_enabled on;
  passenger_ruby /usr/bin/ruby;    
}

Если вы хотите перезапустить приложение, просто запустите

touch /var/www/my_app/tmp/restart.txt

Чтобы включить ваш сайт в Debian, создайте symlik

ln -s /etc/nginx/sites-available/my_site /etc/nginx/sites-enabled/my_site

и перезагрузить nginx /etc/init.d/nginx reload