Запуск Ruby on Rails на VPS с Debian Linux
08 ноября 2011, 22:51
Итак, прочитав наши недавние посты и успешно установив Rails на ваш VPS или ruby-хостинг, пора ознакомиться с самым главным - непосредственно запуском RoR на хостинге. Следуя традициям, я расскажу как это делается на VPS с Debian Linux на борту, однако с остальными дистрибутивами последовательность действий будет примерно та же.
Для начала устанавливаем сам сервер:
Теперь добавляем конфигурационный файл для нашего веб-приложения (сайта). Для этого в каталоге /etc/nginx/sites-available создаем файл с именем домена, на котором будет размещаться веб-сайт. Допустим это my.o1host.net :-)
Тогда содержимое файла /etc/nginx/sites-available/my.o1host.net должно выглядеть примерно так:
Что происходит в этом конфигурационном файле? Мы указали, что при приходе запросов к сайту http://my.o1host.net/, nginx должен перенаправить их на локальный Unicorn, который ожидает соединений используя unix-сокет, расположенный в папке нашего приложения. И заодно мы указали несколько таймаутов, по истечению которых (если от веб-приложения не будет ответа) - мы увидим всем знакомое сообщение.
Хочу предупредить, что указанный конфиг - минимально работоспособный и не самый оптимальный. Со временем, вам понадобится более тонкая настройка некоторых параметров. Но когда до этого дойдет дело, думаю вы уже без проблем справитесь :)
Теперь, согласно концепции Debian, нам необходимо включить только что настроенный сайт. Для этого необходимо в каталоге /etc/nginx/sites-enabled разместить символическую ссылку на конфигурационный файл.
Сделать это можно с помощью команды:
И затем попросить nginx перечитать конфигурацию:
Если все сделано правильно, nginx скажет что с конфигурационным файлом все окей и зайдя по ссылке на ваш веб-проект, вы увидите радостное сообщение о том, что пора приступать к запуску unicorn!
Итак. Первым делом установим gem под названием unicorn и, зайдя в каталог config нашего приложения, создадим там файл unicorn.rb с таким содержанием:
Более подробно о конфигурировании Unicorn можно узнать на официальном сайте и в огромном количестве источников в интернете, поэтому не будем уделять внимание данному файлу.
Мы лучше перейдем к самому главному - запуску!
Сделать это довольно просто. Зайдя в каталог с приложением, выполним команду:
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;
}
}
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
# 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
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
Вместо заключения
На самом деле, в данной статье мы опустили большое количество деталей и нюансов, просто указав самые простые и распространенные умолчания. Если вдруг у вас есть интересный вопрос или пожелание раскрыть какой-нибудь аспект более подробно, пишите. Постараемся помочь :)Размещено в категории: ruby and rails
