Ruby on Rails 3 + Apache 2 + Thin (Ubuntu)

Ostatnio zainteresowałem się językiem programowania Ruby, a w szczególności frameworkiem Ruby on Rails i to w wersji 3.0[rc2].

Próbowałem w sieci odnaleźć prosty tutorial opisujący krok po kroku instalację samego Ruby 1.9.2, RoR w wersji 3.0 jak i serwera Mongrel/Thin w połączeniu z Apache2.
Nic ciekawego nie znalazłem, więc postawiłem napisać samemu.

Poniższy opis dotyczy świeżej instalacji Ubuntu Server 10.4, ale pod Debianem powinno również zadziałać.

Wszystkie komendy wykonujemy z prawami administratora systemu (root), tak więc albo od razu się na niego zalogujmy, albo z konta użytkownika, który posiada uprawnienia do sudo, wykonujemy polecenie:

sudo su -

Rozpocząć należy od aktualizacji listy pakietów w systemie:

apt-get update
apt-get upgrade

Instalujemy całą listę pakietów:

apt-get install build-essential libreadline-dev libncurses-dev zlib1g-dev libssl-dev libsqlite3-dev apache2

Pobieramy i rozpakowujemy najnowszą wersję Ruby (w chwili pisania tego tesktu jest to 1.9.2-p0 oraz 1.8.7-p302):

wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p302.tar.gz
tar zxvf ruby-1.9.2-p0.tar.gz
tar zxvf ruby-1.8.7-p302.tar.gz

Przechodzimy do katalogu ruby-1.8.7-p302 i kompilujemy Ruby 1.8.7 (jest wymagane przed przejściem do 1.9.2):

cd ~/ruby-1.8.7-p302
./configure
make
make install

Teraz czas na najnowszą wersję Ruby:

cd ~/ruby-1.9.2-p0
./configure
make
make install

Aktualizujemy RubyGems i zainstalowane gemy (dodatkowo instalujemy gem do sqlite3):

gem update --system
gem update
gem install sqlite3-ruby

Instalacja Railsów:

gem install rails --pre

Teraz potrzebujemy jeszcze serwer Thin (Mongrel to zło i nie działa poprawnie z pakietem Rails3+Ruby1.9.2):

gem install thin
thin install
sudo /usr/sbin/update-rc.d -f thin defaults

Przyszedł czas na stworzenie pierwszej strony (oczywiście wszystkie wystąpienia mysite.pl zmieniamy na odpowiednią domenę) i ustawienie odpowiednich praw:

cd /var/www
rails new mysite.pl
chown -R www-data: mysite.pl

Przechodzimy do konfiguracji. Najpierw ustawiamy Thin:

thin -a 127.0.0.1 -p 4000 -c /var/www/mysite.pl -e production -d -u www-data -g www-data -s 5 -C /var/www/mysite.pl/config/thin.yml -O config

To polecenie wygeneruje nam plik /var/www/mysite.pl/config/thin.yml z taką oto zawartością (komentarzy tam jednakże nie będzie):

---
# katalog z naszą aplikacją
chdir: /var/www/mysite.pl

# środowisko uruchomieniowe
environment: production

# adres na którym będzie działał Thin
# (potrzebny podczas ustawiania Apache'a)
address: 127.0.0.1

# pierwszy port
port: 4000

timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []
wait: 30
daemonize: true
user: www-data
group: www-data

# ilość instancji serwerów Thin
# porty, na których Thin się uruchomi to (wcześniej podany)
# 4000 i kolejne (w tym przypadku: 4000, 4001, 4002, 4003, 4004)
servers: 5

# przy tej opcji ustawionej na true podczas restartu Thin
# nie wyłączy od razu wszystkich serwerów tylko będzie się restartował jeden po drugim
onebyone: true

Jeszcze tylko podlinkowanie pliku konfiguracyjnego do katalogu Thina, aby ten mógł automatycznie uruchomić serwery:

ln -s /var/www/mysite.pl/config/thin.yml /etc/thin/mysite.pl.yml

Teraz przechodzimy do konfiguracji Apache’a.
Uaktywniamy wymagane moduły:

a2enmod rewrite
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer

i tworzymy plik z konfiguracją naszego hosta /etc/apache2/sites-available/mysite.pl z taką oto zawartością:

<VirtualHost *:80>
  ServerName mysite.pl

  # ścieżka do katalogu "public" w naszym projekcie
  DocumentRoot /var/www/mysite.pl/public

  LogLevel warn
  ErrorLog /var/log/apache2/mysite.pl-error.log
  CustomLog /var/log/apache2/mysite.pl-access.log combined

  # zgodnie z konfiguracją Thina podajemy tutaj lokalne serwery
  <Proxy balancer://thin_mysite>
    BalancerMember http://127.0.0.1:4000
    BalancerMember http://127.0.0.1:4001
    BalancerMember http://127.0.0.1:4002
    BalancerMember http://127.0.0.1:4003
    BalancerMember http://127.0.0.1:4004
  </Proxy>

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  <Directory "/var/www/mysite.pl/public">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  RewriteEngine On
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule ^/(.*)$ balancer://thin_mysite%{REQUEST_URI} [P,QSA,L]
</VirtualHost>

Teraz już tylko należy uaktywnić naszą stronę, uruchomić Thina i zrestartować Apache’a:

a2ensite mysite.pl
/etc/init.d/thin start
/etc/init.d/apache2 restart

To już koniec. 🙂 Pod adresem http://mysite.pl (czyli pod Twoją domeną) powinna pojawić się taka witryna:

czyli czas zabrać się do pracy!

Powodzenia! 🙂

  1. Hej,

    dzięki za super post. Bardzo mi pomógł!

    Dodałbym tylko jeszcze jedną komendę aby wyłączyć default’ową stronę startową apache:

    a2dissite default

    Pozdrawiam

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.