| PartyZan ( @ 2006-09-08 23:56:00 |
| Current music: | Гости Из Будущего - Звёзды смотрят вниз (часть 2) |
| Entry tags: | debian, deploy, howto, mongrel, mongrel_cluster, nginx, rails |
nginx+mongrel+rails+debian HOWTO
nginx [engine x] — это HTTP-сервер и IMAP/POP3-прокси сервер.
Mongrel - это быстрая HTTP-библиотека и сервер для Ruby, предназначенные для хостинга Ruby веб-приложений и использующая HTTP вместо FastCGI или SGI.
Mongrel_cluster - Gem плагин, предназначенный для упрощения развертывания веб приложений, использующих кластер Mongrel серверов.
1. Устанавливаем mongrel и mongrel_cluster:
#gem install mongrel
#gem install mongrel_cluster
#gem install mongrel_cluster
2. Берем последнюю версию nginx здесь в виде сырцов или в виде собранного пакета/порта.
Для Debian готового пакета под последнюю версию не нашлось, поэтому я взял необходимые для сборки пакета файлы от предыдущей версии, немного подправил и собрал deb пакет для debian sarge.
3. Для хранения рельсовых приложений я предпочел использовать централизованное место, поэтому создал директорию /var/www/nginx/rails.
Переходим в эту директорию и создаем тестовое RoR приложение:
#rails demo
4. Генерируем конфигурационный файл для нашего приложения, используя команду mongrel_rails:
#cd /var/www/nginx/rails/demo
#mongrel_rails cluster::configure -e production -p 8000 -N 2 \
-c /var/www/nginx/rails/demo -a 127.0.0.1 \
-l log/mongrel.log -P /var/run/mongrel_cluster/demo.pid \
--user www-data --group www-data
#mongrel_rails cluster::configure -e production -p 8000 -N 2 \
-c /var/www/nginx/rails/demo -a 127.0.0.1 \
-l log/mongrel.log -P /var/run/mongrel_cluster/demo.pid \
--user www-data --group www-data
Опции:
-e - Rails environment (в данном случае указываем production)
-p - Mongrel будет слушать порты начиная с указанного порта до +(N-1) (т.е. в нашем случае порты 8000 и 8001)
-N - количестов Mongrel серверов
-c - директория в которую перейдет Mongrel сервер перед запуском
-a - IP адресс для прослушивания Mongrel сервером
-l - лог файл
-P - файл в который будет записан PID процесса (с версии mongrel_cluster 1.0.x должен находится в каталоге /var/run/mongrel_cluster/)
--user и --group - имя пользователя и группа от имени которых будут запущены Mongrel серверы (я использую www-data, т.к. под этим пользователям у меня работает nginx. Перед запуском необходимо убедится, что данный пользователь имеет права записи в директорию с приложением)
Для получения полной справки можно выполнить команду mongrel_rails cluster::configure -h
После выполнения этой команды будет создан файл config/mongrel_cluster.yml
5. Настраиваем mongrel_cluster таким образом, чтобы он запускался при каждом запуске системы:
#mkdir /etc/mongrel_cluster
#cp /path/to/mongrel_cluster_gem/resources/m ongrel_cluster /etc/init.d/
#chmod +x /etc/init.d/mongrel_cluster
#update-rc.d -f mongrel_cluster defaults
#cp /path/to/mongrel_cluster_gem/resources/m
#chmod +x /etc/init.d/mongrel_cluster
#update-rc.d -f mongrel_cluster defaults
Если используется mongrel_cluster версии 1.0.x, то необходимо присвоить правильное значение переменной USER в скрипте mongrel_cluster (в нашем случае www-data)
Теперь при каждом запуске системы будут запускаться Mongrel серверы для приложений, чьи конфиги находятся в /etc/mongrel_cluster
Для того чтобы наше приложение запускалось необходимо выполнить следующую команду:
#ln -s /var/www/nginx/rails/demo/config/mongrel _cluster.yml /etc/mongrel_cluster/demo.yml
6. Настраиваем nginx.
Допустим мы хотим, чтобы наше RoR приложение было доступно по адресу demo.xxx.com.
Для этого изменяем nginx.conf следующим образом:
В основную конфигурацию сервера добавляем:
upstream mongrel {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
И добавляем виртуальный хост demo.xxx.com:
server {
listen 80;
server_name demo.xxx.com;
charset off;
location / {
root /var/www/nginx/rails/demo;
index index.html index.htm;
}
# / -> first search for local index.html then go to mongrel
location ~ ^/$ {
if (-f /index.html) {
rewrite (.*) /index.html last;
}
proxy_pass http://mongrel;
}
# rails caching: searching first for $action.html local pages
location / {
if (!-f $request_filename.html) {
proxy_pass http://mongrel;
}
rewrite (.*) $1.html last;
}
# serve static files directly
location ~ .html {
root /var/www/nginx/rails/demo/public;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|g z|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mi d|midi|wav|bmp|rtf|js|mov)$ {
root /var/www/nginx/rails/demo/public;
}
# resend everything else to mongrel
location / {
proxy_pass http://mongrel;
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;
}
}
listen 80;
server_name demo.xxx.com;
charset off;
location / {
root /var/www/nginx/rails/demo;
index index.html index.htm;
}
# / -> first search for local index.html then go to mongrel
location ~ ^/$ {
if (-f /index.html) {
rewrite (.*) /index.html last;
}
proxy_pass http://mongrel;
}
# rails caching: searching first for $action.html local pages
location / {
if (!-f $request_filename.html) {
proxy_pass http://mongrel;
}
rewrite (.*) $1.html last;
}
# serve static files directly
location ~ .html {
root /var/www/nginx/rails/demo/public;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|g
root /var/www/nginx/rails/demo/public;
}
# resend everything else to mongrel
location / {
proxy_pass http://mongrel;
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;
}
}
7. Перезапускаем серверы:
#/etc/init.d/mongrel_cluster restart
#/etc/init.d/nginx restart
#/etc/init.d/nginx restart
и видим по адресу demo.xxx.com стартовую страничку нашего RoR приложения
Замечания:
- Т.к. настраивать хостинг несколько RoR приложений на одном хосте довольно геморно, то я использовал виртуальные хосты.
- Если кто-то может предложить безгоморный вариант настройки нескольких приложений для доступа в виде xxx.com/rails/app1 xxx.com/rails/app2, то, как говорится, вэлкам ;)