Запуск Ruby on Rails на VPS с Debian Linux

08 ноября 2011, 22:51
Итак, прочитав наши недавние посты и успешно установив Rails на ваш VPS или ruby-хостинг, пора ознакомиться с самым главным - непосредственно запуском RoR на хостинге. Следуя традициям, я расскажу как это делается на VPS с Debian Linux на борту, однако с остальными дистрибутивами последовательность действий будет примерно та же.

Nginx

Естественно, в качестве фронтенда мы будем использовать сервер nginx. Думаю, почему мы сделали такой выбор, объяснять не нужно.

Для начала устанавливаем сам сервер:
# sudo apt-get install nginx
Напомню, что если вы вошли в систему под пользователем root, то необходимости в команде sudo - нет.

Теперь добавляем конфигурационный файл для нашего веб-приложения (сайта). Для этого в каталоге /etc/nginx/sites-available создаем файл с именем домена, на котором будет размещаться веб-сайт. Допустим это my.o1host.net :-)

Тогда содержимое файла /etc/nginx/sites-available/my.o1host.net должно выглядеть примерно так:
server {
 listen 80;
 server_name my.o1host.net;
 access_log /var/log/nginx/my.o1host.net-access.log # путь к файлу с логами

 location / {
  proxy_pass http://unix:/путь/к/приложению/tmp/sockets/unicorn.sock/;

  # чтобы rails могли определить IP клиента:
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  proxy_connect_timeout 90;
  proxy_read_timeout 600;
  proxy_send_timeout 600;
 }
}

Что происходит в этом конфигурационном файле? Мы указали, что при приходе запросов к сайту http://my.o1host.net/, nginx должен перенаправить их на локальный Unicorn, который ожидает соединений используя unix-сокет, расположенный в папке нашего приложения. И заодно мы указали несколько таймаутов, по истечению которых (если от веб-приложения не будет ответа) - мы увидим всем знакомое сообщение.
Хочу предупредить, что указанный конфиг - минимально работоспособный и не самый оптимальный. Со временем, вам понадобится более тонкая настройка некоторых параметров. Но когда до этого дойдет дело, думаю вы уже без проблем справитесь :)

Теперь, согласно концепции Debian, нам необходимо включить только что настроенный сайт. Для этого необходимо в каталоге /etc/nginx/sites-enabled разместить символическую ссылку на конфигурационный файл.
Сделать это можно с помощью команды:
# cd /etc/nginx/sites-enabled
# sudo ln -s ../sites-available/my.o1host.net my.o1host.net

И затем попросить nginx перечитать конфигурацию:
# sudo /etc/init.d/nginx reload

Если все сделано правильно, nginx скажет что с конфигурационным файлом все окей и зайдя по ссылке на ваш веб-проект, вы увидите радостное сообщение о том, что пора приступать к запуску unicorn!

Unicorn

Вообще, выбор серверов для запуска Rails - многое множество. Сначала это был старина Mongrel, затем многие переключились на Passenger. В последнее время набрал популярность Unicorn. Отметим также, что еще хорошо известен сервер Thin, но в отличие от перечисленных ранее, мы не имели возможности с ним поработать.

Итак. Первым делом установим gem под названием unicorn и, зайдя в каталог config нашего приложения, создадим там файл unicorn.rb с таким содержанием:
worker_processes 2
working_directory "/путь/к/приложению/"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "/путь/к/приложению/tmp/sockets/unicorn.sock", :backlog => 64

pid "/путь/к/приложению/tmp/pids/unicorn.pid"

# Set the path of the log files inside the log folder of the app
stderr_path "/путь/к/приложению/log/unicorn.stderr.log"
stdout_path "/путь/к/приложению/log/unicorn.stdout.log"

before_fork do |server, worker|
# This option works in together with preload_app true setting
# What is does is prevent the master process from holding
# the database connection
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
# Here we are establishing the connection after forking worker
# processes
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end

Более подробно о конфигурировании Unicorn можно узнать на официальном сайте и в огромном количестве источников в интернете, поэтому не будем уделять внимание данному файлу.
Мы лучше перейдем к самому главному - запуску!
Сделать это довольно просто. Зайдя в каталог с приложением, выполним команду:
# unicorn_rails -c config/unicorn.rb

Вместо заключения

На самом деле, в данной статье мы опустили большое количество деталей и нюансов, просто указав самые простые и распространенные умолчания. Если вдруг у вас есть интересный вопрос или пожелание раскрыть какой-нибудь аспект более подробно, пишите. Постараемся помочь :)