mod_rails!

July 3rd, 2008

Лирическое вступление

Вот давеча надо было сделать виртуальных хост для одного клиента. Он попросил ему сделать хостинг под RoR проект.

Сначала я думал сделать как всегда - mongrel_cluster + nginx, но не тут-то было! Клиент попросил что бы он полностью имел доступ к управлению своего рельсового приложения. И вот тут-то у меня начались проблемы.

Дело в том что у меня на сервере нету реальных пользователей для хостинга. Все пользователи в базе, они имеют только FTP и все. Шелл если и даю , то только jail.

И тут мне пришла мысль! Есть же mod_rails! Я правда его не тестировал на продакшене, но почитать информацию в интернете решил что этот модуль уже готов к полноценной стабильной работе.

Итак, что же нам требуеться?

  • установить gem модуль passenger
  • настроить apache
  • сделать виртуальных хост для рельсового приложения

Итак! Приступим!

Установка mod_rails и настройка apache

root@host ~ # gem install passenger
Building native extensions.  This could take a while...
Successfully installed passenger-2.0.1
1 gem installed
Installing ri documentation for passenger-2.0.1...
Installing RDoc documentation for passenger-2.0.1...
root@host ~ # passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v2.0.1.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.

Последняя команда установит модуль к apache, причем у вас должны быть установлены Apache Portable Runtime (APR) development headers. После этого будет собран модуль и инсталятор выдаст вам информации он том как подключить модуль.

Вот мои настройки модуля:

LoadModule passenger_module /opt/ree/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/mod_passenger.so                                                                 
PassengerRoot /opt/ree/lib/ruby/gems/1.8/gems/passenger-2.0.1                                                                                                            
PassengerRuby /opt/ree/bin/ruby                                                                                                                                          
PassengerLogLevel 3                                                                                                                                                                  
PassengerUserSwitching on                                                                                                                                                            
PassengerDefaultUser wwwrun                                                                                                                                                          
PassengerMaxPoolSize 20 

Для тестинга я включил полное логгирование.

Виртуальный хост

<VirtualHost xxx.xxx.xxx.xxx:80>                                                                                                                                                        
  ServerName example.com                                                                                                                                                          
  ServerAlias www.example.com                                                                                                                                                     
  ServerAdmin admin@example.com                                                                                                                                                
  DocumentRoot "/srv/www/virtuals/example.com/public/"                                                                                                                                        
  ErrorLog "/srv/www/logs/example.com-error.log"                                                                                                                                      
  CustomLog "/srv/www/logs/example.com-access.log" combined                                                                                                                           

    <Directory "/srv/www/virtuals/example.com/public/">                                                                                                                                                                                                                                                                      
        AllowOverride All                                                                                                                                                            
        Order allow,deny                                                                                                                                                             
        Allow from all                                                                                                                                                               
    </Directory>                                                                                                                                                                     
</VirtualHost>

Все! Наш mod_rails настолько умный что если наш каталог public не являеться public рельсового проекта - то он и не будет его обрабатывать как rails app. После этого можно просматривать статистику :)

root@host:~ # /opt/ree/bin/passenger-memory-stats 
------------- Apache processes --------------
PID   PPID  Threads  VMSize    Private  Name
---------------------------------------------
7214  9001  1        302.3 MB  1.6 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7216  9001  1        302.4 MB  2.6 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7233  9001  1        302.5 MB  2.8 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7367  9001  1        302.4 MB  2.5 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7370  9001  1        302.3 MB  1.9 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7375  9001  1        302.2 MB  1.4 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7380  9001  1        302.5 MB  2.6 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7382  9001  1        302.4 MB  2.6 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7386  9001  1        302.2 MB  1.5 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7387  9001  1        302.1 MB  1.3 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7390  9001  1        301.6 MB  0.4 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7394  9001  1        302.2 MB  1.5 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
7879  9001  1        301.6 MB  0.4 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
9001  1     1        301.3 MB  0.4 MB   /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -DSSL -DAWSTATS -DSTATUS
### Processes: 14
### Total private dirty RSS: 23.54 MB

--------- Passenger processes ----------
PID    Threads  VMSize    Private  Name
----------------------------------------
8105   1        75.7 MB   6.6 MB   Passenger FrameworkSpawner: 2.1.0
8134   1        82.9 MB   8.7 MB   Passenger ApplicationSpawner: /srv/www/virtuals/example.com/
8136   1        103.7 MB  25.3 MB  Rails: /srv/www/virtuals/example.com
32446  39       58.4 MB   4.9 MB   /opt/ree/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/ApplicationPoolServerExecutable 3 /opt/ree/lib/ruby/gems/1.8/gems/passenger-2.0.1/bin/passenger-spawn-server  /opt/ree/bin/ruby  /tmp/passenger_status.9001.fifo
32449  1        24.5 MB   7.7 MB   Passenger spawn server
### Processes: 5
### Total private dirty RSS: 53.08 MB

Рестартинг приложения происходит после создания в папке tmp проекта файла restart.txt. Он автоматом потом удаляеться после рестарта приложения!

Выводы :)

Просто, удобно, безопасно. Как для шаред хостинга - то что доктор прописал!

7 Responses to “mod_rails!”

  1. pesdexx Says:
    интересно, в креш он как часто падать будет :)
  2. DeViL Says:
    А хз... Посмотрим... Но как говорят авторы, если падает спавнер, то апач это не затрагивает
  3. savagex Says:
    А у вас фид на блоге вопросики вместо русских букв выдает
  4. Strock Says:
    Как производительность?
  5. DeViL Says:
    Странно... Вы первый кто сказал что есть проблемы. У вас какой клиент для чтения фидов?
  6. DeViL Says:
    Пока разницы не заметил :) Памяти жрет столько-же, по скорости не уступает nginx + mongrel.
  7. Степа Says:
    Да уж Пока это у нас не очень сильно развито, так что придётся немного подождать.

Sorry, comments are closed for this article.