Apache 2 + Ruby 1.8 + mod_ruby

Це перша стаття на Розробці опублікована мною, проба пера так сказати. Прошу не судити строго. Ця стаття була написана мною ще у вересні 2007 року. Хоча і досі не втратила своєї актуальності.

У цій статті ми розглянемо установку і налаштування Web-сервера Apache 2, Ruby 1.8 (mod_ruby + eruby) для використання їх на локальній машині під операційною системою Linux(Ubuntu/Debian).

Інсталяція

Для початку встановлюємо необхідні пакети з репозиторія:

sudo apt-get install ruby
sudo apt-get install apache2
sudo apt-get install libapache2-mod-ruby eruby

Ми будемо використовувати конфігурацію Apache «по замовчуванню».

Після інсталяції mod_ruby, буде створений файл /etc/apache2/mods-available/ruby.load з наступним вмістом:

LoadModule ruby_module /usr/lib/apache2/modules/mod_ruby.so

Конфігурування Apache

В дистрибутивах на базі Ubuntu/Debian конфігураційний файл httpd.conf розбитий на велику кількість менших файлів у директорії /etc/apache2.

Для конфігурації mod_ruby створимо файл /etc/apache2/mods-available/ruby.conf. Також необхідно створити посилання на нього до каталогу /etc/apache2/mods-enabled, щоб він завантажувався автоматично під час старту Apache.

sudo touch /etc/apache2/mods-available/ruby.conf
sudo ln -s /etc/apache2/mods-available/ruby.conf /etc/apache2/mods-enabled/ruby.conf

З докладним описом процесу інсталяції і налаштування можна ознайомитися тут.

Ми будемо використовувати зв'язку eRuby + mod_ruby.

mod_ruby — це вбудований інтерпретатор Ruby для веб-сервера Apache.

eRuby — це система шаблонів, яка вбудовує код Ruby у текстовий документ. Вона часто використовується, щоб вставляти код Ruby в HTML документи, як ASP, JSP і PHP. Зазвичай має розширення *.rhtml. Є шаблонізатором по замовчуванню в Ruby on Rails. Код включається за допомогою пари роздільників "<%" і "%>".

<% print "hello world" %>

Додамо наступні рядки до /etc/apache2/mods-available/ruby.conf:

<IfModule mod_ruby.c>
RubyRequire apache/eruby-run

# Обробляти файлами з директорій /eruby як файли eRuby
<Location /eruby>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Location>

# Обробляти *.rhtml файли як eRuby файли
<Files *.rhtml>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Files>
</IfModule>

<Directory /var/www/eruby>
AllowOverride All
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

AddType text/html .rhtml

Існує одна проблема, коли ви здійснюєте запит (наприклад, localhost/eruby), mod_ruby викликає помилку

/usr/lib/ruby/1.8/apache/eruby-run.rb:101:in `compile_file': Is a directory - /var/www/eruby/ (Errno::EISDIR).

Щоб виправити це додамо наступний рядок до ruby.conf.

RedirectMatch ^/eruby/?$ /eruby/index.rhtml

Перезапустимо веб-сервер командою:

sudo /etc/init.d/apache2 restart

Створимо файл /var/www/eruby/index.rhtml:

<%= Time.now %>

Перейдемо у Web-броузері за адресою localhost/eruby і побачимо поточну дату і час.

Вуаля, готово!

Відображення помилок mod_ruby

mod_ruby не терпить невдачу з попередженнями(warnings) і повідомлення про попередження не записуються до log-файлу (наприклад, /var/log/apache2/error.log). Тільки повідомлення про помилки(errors) записуються до цього файлу. Так що забудьте про попередження під mod_ruby. Можливо є якийсь діагностичний рівень, на якому це можна встановити, але мені не відомо про це :(.

Коли Ruby зазнає синтаксичну або іншу помилку він повертає «Internal Server Error (500)» і повідомлення про помилку записується до log-файлу Apache. Щоб слідкувати за помилками доводиться читати цей файл або використовувати утиліту tail:

sudo tail -f /var/log/apache2/error.log

Постійно доводиться переключатися у консоль, шо не дуже зручно у процесі написання коду.

Для виведення помилок на Web-сторінку використовується опція ErrorDocument Apache.

Створимо файл /var/www/eruby/errors/error_500.rhtml з наступним вмістом:

<%
r = Apache.request
r.content_type = "text/plain"
r.send_http_header
print "Ruby Error: ",r.prev.uri,"\n\n"
print r.prev.error_message
%>

І додамо у /etc/apache2/mods-available/ruby.conf наступний рядок.

ErrorDocument 500 /eruby/errors/error_500.rhtml

Перезапустимо Apache:

sudo /etc/init.d/apache2 restart

Тепер при виникненні помилки(але не попередження) фактичне повідомлення про невдачу буде виведене на web-сторінку.

Дзеркало цієї статті в моєму блозі.

Коментарі 4

blaster - 13 липня 2009, 17:44

дякі. все зрозуміло… думаю ближчим часом попробую на практиці це все :)

lemon - 14 липня 2009, 10:10

чим відрізняється така зв'язка від fastcgi?

mamantoha - 14 липня 2009, 19:02

Уявлення не маю ). Ніколи не доводилось стикатися з fastcgi.

Наскільки мені здається, mod_ruby тільки і придатний для того щоб парсити *.rhtml файли.

Для важчих задач є зручний Phusion Passenger.

zenyk - 23 липня 2009, 11:35

життєва розповідь про fastcgi vs mongrel vs mod_rails з РубіКлабу.

Коментувати
© 2009 - 2018, Розробка - соціальна ІТ спільнота.
Контакти: info@rozrobka.com
Правила користування