Показ дописів із міткою apache. Показати всі дописи
Показ дописів із міткою apache. Показати всі дописи

понеділок, 3 травня 2010 р.

Запуск web-додатку на Sinatra з Phusion Passenger

На сьогоднішній день одним з найпростіших способів запуску Rails і Rack web-додатків є Phusion Passenger, що представляє собою модуль для Apache і Nginx. Фреймворк Sinatra базується на Rack, отже, додатки на його основі Passenger здатний легко запускати.

Для програми необхідна базова структура директорій:
APP_DIRECTORY/
  |-- app.rb       <-- безпосередньо додаток
  |-- config.ru    <-- Rackup файл для запуску
  |-- public/      <-- директорія для статичних файлів (зображення, css, javascript)
  |-- tmp/         <-- тимчасова директорія

Встановлюємо Apache2:
$ sudo apt-get install apache2-mpm-prefork apache2-prefork-dev libapr1-dev libaprutil1-dev

Встановлюємо Phusion Passenger:
$ sudo gem1.9.1 install passenger

Налаштування модуля для Apache:
$ sudo /opt/ruby191/bin/passenger-install-apache2-module

Далі слідуємо інструкції.
Створюємо файл /etc/apache2/mods-available/passenger.load і додаємо наступні рядки:
LoadModule passenger_module /opt/ruby191/lib/ruby/gems/1.9.1/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby191/lib/ruby/gems/1.9.1/gems/passenger-2.2.11
PassengerRuby /opt/ruby191/bin/ruby

Застосовуємо зміни і перезапускаємо сервіс:
$ sudo a2enmod passenger
$ sudo service apache2 restart

Припустимо наш додаток Sinatra знаходиться у /somewhere. Додамо віртуальний хост до конфігурації Apache і встановимо DocumentRoot у /somewhere/public
# /etc/apache2/sites-enabled/000-default
<VirtualHost *:80>
  ServerName www.yourhost.com
  DocumentRoot /somewhere/public
  <Directory /somewhere/public>
    AllowOverride all
    Options -MultiViews
  </Directory>
</VirtualHost>

Для запуску додатку із статті Привіт, Sinatra! створимо Rackup файл config.ru:
require 'sinatra'
require 'app.rb'

run Sinatra::Application

# app.rb
require 'rubygems'
require 'sinatra'

get '/' do
 "Привіт, Sinatra!"
end

четвер, 13 вересня 2007 р.

Apache 2 + Ruby 1.8 + mod_ruby + eruby

В цій статі ми розглянемо встановлення і настройку 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

Настройка:
В дистрибутивах Ubuntu/Debian(можливо і в інших) конфігураційний файл httpd.conf розбитий на велику кількість менших файлів у директорії /etc/apache2.
Для конфігурації mod_ruby створимо файл /etc/apache2/mods-available/ruby.conf. Також необхідно створити посилання на нього до каталогу /etc/apache2/mods-enabled, щоб він завантажувався автоматично.
sudo ln -s /etc/apache2/mods-available/ruby.conf /etc/apache2/mods-enabled/ruby.conf

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

Я буду використовувати зв'язку eRuby + mod_ruby.
eruby - це виконання eRuby(Embedded Ruby), що служить для включення коду Ruby у HTML та інші документи. Має розширення *.rhtml. Код включається за допомогою пари роздільників "<%" і "%>". Коли мене запитують про eRuby, я завжди відповідаю що це типу PHP, тільки для Ruby :). Докладніше про eRuby тут i тут .
Додамо наступні рядки до /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


Існує одна проблема, коли ви здійснюєте запит до директорії(наприклад, http://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-броузері за адресою http://localhost/eruby і побачимо поточну дату і час.
Вуаля, готово!

Відображення помилок mod_ruby:
mod_ruby не терпить невдачу з попередженнями(warnings) і повідомлення про попередження не записуються до log-файлу (наприклад, /var/log/apache2/error.log чи будь-який інший), тільки повідомлення про помилки записуються до цього файлу. Так що забудьте про попередження під 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


Тепер при виникненні помилки(але не попередження) фактичне повідомлення про невдачу буде показане не сторінці. Рекомендую використовувати даний метод лише під час розробки і відналагодження.