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)

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

blaster

  • 13 липня 2009, 17:44
+
0
чим відрізняється така зв'язка від fastcgi?
avatar

lemon

  • 14 липня 2009, 10:10
+
0
Уявлення не маю ). Ніколи не доводилось стикатися з fastcgi.
Наскільки мені здається, mod_ruby тільки і придатний для того щоб парсити *.rhtml файли.
Для важчих задач є зручний Phusion Passenger.
avatar

mamantoha

  • 14 липня 2009, 19:02
+
0
життєва розповідь про fastcgi vs mongrel vs mod_rails з РубіКлабу.
avatar

zenyk

  • 23 липня 2009, 11:35

Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.