PartyZan ([info]ptzn) wrote,
@ 2006-09-08 23:56:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
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

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

Опции:
-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/mongrel_cluster /etc/init.d/
#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;
}

И добавляем виртуальный хост 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|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|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;
    }
}

7. Перезапускаем серверы:
#/etc/init.d/mongrel_cluster restart
#/etc/init.d/nginx restart

и видим по адресу demo.xxx.com стартовую страничку нашего RoR приложения

Замечания:
- Т.к. настраивать хостинг несколько RoR приложений на одном хосте довольно геморно, то я использовал виртуальные хосты.
- Если кто-то может предложить безгоморный вариант настройки нескольких приложений для доступа в виде xxx.com/rails/app1 xxx.com/rails/app2, то, как говорится, вэлкам ;)


(Post a new comment)


[info]angry_elf
2006-09-08 07:51 pm UTC (link)
Нахкадпот...

Тьфу, подкат, нах :)

(Reply to this)(Thread)


[info]ptzn
2006-09-08 08:25 pm UTC (link)
Уговорил, чертяка языкатый :))

(Reply to this)(Parent)


[info]levgem
2006-09-08 10:46 pm UTC (link)
Хм. Не, мне nginx не подходит — я вместе с явовскими чуваками сижу, а как там томкат их настраивается я вообще не в теме.

(Reply to this)(Thread)


[info]ptzn
2006-09-08 11:20 pm UTC (link)
До Java руки еще не дошли, но имхо должен настраиваться легче чем Apache с jk_mode, nginx он жеж по сути как прокся работает

(Reply to this)(Parent)(Thread)


[info]levgem
2006-09-09 09:45 am UTC (link)
Знаешь, я когда предложил поднять tomcat через mod_proxy, мне сказали, что это прошлый век и очень плохо работает.

(Reply to this)(Parent)(Thread)


[info]ptzn
2006-09-09 10:28 am UTC (link)
Ну в случае с апачем это возможно и действительно прошлый век :)

(Reply to this)(Parent)(Thread)


[info]levgem
2006-09-09 11:33 am UTC (link)
а че, у апача сильно убогий mod_proxy?

(Reply to this)(Parent)(Thread)


[info]ptzn
2006-09-09 12:14 pm UTC (link)
хз, просто mod_jk заточен для работы с жаба серверами

(Reply to this)(Parent)(Thread)

Nginx + Tomcat
[info]spyromus
2007-10-05 10:21 am UTC (link)
Tomcat + Nginx -- это довольно просто. Работает на порядок быстрее связки с mod_proxy и главное, не требует так много памяти.

server {
  listen 80;
  server_name my.com;
   # это апачу
   location / {
     proxy_pass http://127.0.0.1:8888;
   }

   # это томкату
   location /tomcat_app {
     proxy_pass http://127.0.0.1:8080;
   }

   # это сами
     location ~* ^.+\.(jpg|jpeg|gif|js)$ {
     root /v/my.com/www;
     access_log off;
     expires 30d;
   }
}

(Reply to this)(Parent)


[info]levgem
2007-10-22 02:41 pm UTC (link)
по прошествии года могу сказать, что nginx во много раз приятнее

(Reply to this)(Parent)


[info]nebm51
2006-09-09 06:27 am UTC (link)
Не возражаешь, если на бинари выложу?

(Reply to this)(Thread)


[info]ptzn
2006-09-09 07:10 am UTC (link)
канэшна нэт, дарагой ;)

(Reply to this)(Parent)(Thread)


[info]nebm51
2006-09-09 08:03 am UTC (link)
Доне :) Если не затруднит там зарегаться, то и автора на тебя поменять смогу :)

(Reply to this)(Parent)(Thread)


[info]ptzn
2006-09-09 10:28 am UTC (link)
лениво регаться :)

(Reply to this)(Parent)(Thread)


[info]nebm51
2006-09-09 10:56 am UTC (link)
Ну дело твое :) Копирайт поставил %)

(Reply to this)(Parent)


[info]dip_au
2006-09-09 03:14 pm UTC (link)
осталось только capistrano прикрутить

(Reply to this)(Thread)


[info]ptzn
2006-09-09 09:30 pm UTC (link)
Понадобится - прикручу. А я так думаю скоро понадобится ;)

(Reply to this)(Parent)(Thread)


[info]dip_au
2006-09-10 10:40 am UTC (link)
да там собсно и прикручивать нечего - всё в пол-тычка :) а вот с WebSVN + acl ! Вот уж с чем я насексовался! Без разделения доступа к проектам - да как нефиг делать.. А вот если с ним - во где задница.. Так толком и не забодал.

(Reply to this)(Parent)


[info]garisson
2006-09-11 05:03 am UTC (link)
django всяко луччше :)

(Reply to this)(Thread)


[info]ptzn
2006-09-11 09:26 am UTC (link)
на вкус и цвет... ну ты понял ;)

(Reply to this)(Parent)


[info]sevkin
2006-10-20 10:00 pm UTC (link)
ну как, не насоветовали еще безгиморный способ для typoblog.example.com -> example.com/blog ?
и собственно чем монгрель лучше scgi ? сравнительные тесты есть где нибудь?

(Reply to this)(Thread)


[info]ptzn
2006-10-20 10:07 pm UTC (link)
1. неа :(
2. http://blog.kovyrin.net/2006/08/28/ruby-performance-results/

(Reply to this)(Parent)

map folder to ruby application
(Anonymous)
2008-05-16 11:04 pm UTC (link)
location /ruby/ {
rewrite ^/ruby/(.*)$ /$1 break;
proxy_pass http://mongrel;
}

(Reply to this)(Parent)(Thread)

Re: map folder to ruby application
[info]ptzn
2008-05-16 11:57 pm UTC (link)
терзают меня сомнения, что в таком случае сломаются хелперы для абсолютных путей

(Reply to this)(Parent)


[info]levgem
2007-07-26 05:34 am UTC (link)
я вот сейчас на другом сервере перешёл на nginx. Всё очень, очень клёво. Я даже настроил так, что бы nginx по возможности брал кеш рельсовых страниц из memcached-а

(Reply to this)(Thread)


[info]ptzn
2007-07-26 06:55 am UTC (link)
Буду знать к кому можно обратиться если придется c memcached возится ;)

(Reply to this)(Parent)


[info]exception13
2007-08-16 11:39 am UTC (link)
--proxy_set_header Host $host;
++proxy_set_header Host $http_host;

если $server_port != 80

(Reply to this)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…