Před dávnými časy jsem se tímto tématem zaobíral na blogu abclinuxu.cz, od těch dob jsem stihl pochytit pár drobností ohledně linuxu a zjistil jsem, jak moc zoufalé bylo moje minulé počínání. Takže tenhle článek můžeme považovat jako 2.0 verzi článku minulého, kde uvedu pár drobných zlepšení a rad pro provoz Sinatrových aplikací na linuxovém stroji.
Máme ruby?
Samozřejmě, že nemáme. Pokud chcete nejnovější verzi ruby - budete muset použít RVM a nebo budete muset sáhnout po ‘klasické’ kompilaci. Pokud vám ale bude stačit ruby 1.9.2p0 - můžete si ho nainstalovat příkazem apt-get install ruby1.9.1 rubygems1.9.1 ruby1.9.1-dev build-essential. Příkaz jsem trochu rozšířil, abychom mohli vykonávat všechny důležité kroky hned.
Balík build-essential je bezpodmínečně nutné nainstalovat pro budoucí upotřebení při získávání některých gemů, které se při procesu instalace sami kompilují.
Výběr gemů
gem install sinatra
gem install passenger
Těmito příkazy jsme si nainstalovali samotný framework a instalátor nginx s modulem Passenger.
Instalace Nginx a Passenger
Pokud jste použili standardní instalaci ruby (balík ruby1.9.1) - instalátor naleznete ve zhruba takto vypadajícím adresáři: /var/lib/gems/1.9.1/gems/passenger-3.0.11/bin/passenger-install-nginx-module . V opačném případě to prokonzultujte s find. find / -name ‘passenger-install-nginx-module’
Instalátor vás vždy nasměruje na správnou cestu, například v mém případě v systému chyběli některé knihovny, a tak o ně instalátor požádal. Po kontrole proběhne samotná kompilace a nahrání konfiguračních souborů tak, aby nginx fungoval s modulem Passenger. Na prográmku se mi hodně líbilo, že mi vypsal jména balíků přímo pro můj operační systém (Debian 6). Předpokládám, že to samé udělá i u ostatních normálních unix-like systémů.
Většina konfigurace se v průběhu instalace v podstatě nechá odbýt ponecháním standardních nastavení. Budete-li se držet standardních nastavení - Nginx včetně všech konfiguračních souborů naleznete v /opt/nginx.
Nastavení prvního VirtualHostu
Konfigurační soubory serveru Nginx hledejte v umístění, které jste zadali při instalaci. Právě tam by měl být adresář conf a v něm nginx.conf.
Upravte ho. Najděte v něm sekci http, tam se můžete podívat, jak instalátor nastavil Passenger. Tam však nic nemusíme měnit, zajímá nás totiž jen odkomentovaná sekce server. Prostě tuto sekci smažte a nahraďte jí následující konfigurací.
1 server {
2 listen 80;
3 server_name localhost;
4 root /var/ruby/main/public;
5 passenger_enabled on;
6 }
Direktivu root samozřejmě musíte změnit v závislosti na vaší adresářové struktuře, se zbytkem už ale nemusíte hýbat. Bude vám muset stačit mé slovo, že to funguje.
Organizační struktura root adresáře aplikace
- public/
- log/
- tmp/
- restart.txt
- application.rb
- config.ru
Jméno ‘hlavního’ souboru (v našem případě application.rb) je samozřejmě pouze a jenom na vašem uvážení.
Rackup soubor
Po zvolení toho pravého jména vytvořte config.ru (tzv. rackup soubor) a zajistěte, aby obsahoval něco podobného následujícím řádkům.
1 require 'sinatra'
2 require 'sinatra/flash'
3 require 'mongo'
4 require 'digest/sha1'
5
6 require File.join(File.dirname(__FILE__), 'application')
7
8 set :run, false
9 set :environment, :development
10
11 FileUtils.mkdir_p 'log' unless File.exists?('log')
12 log = File.new("log/sinatra.log", "a+")
13 $stdout.reopen(log)
14 $stderr.reopen(log)
15
16 run Sinatra::Application
Application na 6. řádku pochopitelně značí soubor s vaší aplikací. Koncovka .rb není podstatná (nemusí tam být).
Hlavní aplikační soubor (v našem případě soubor application.rb) pak může vypadat jako ta nejvágnější věc v naší galaxii.
1 get '/' do
2 "Ahoj světe!"
3 end
Spojením všech zmíněných elementů získáte server naslouchající na portu 80, po příchodu vás slušně pozdraví. Tak se z toho klišé hlavně nepozvracejte.
Přidružené problémy
Jestli jste si pozorně pročetli organizační strukturu - v adresáři tmp se nachází soubor restart.txt. Tento soubor slouží přesně k tomu, co o něm říká jeho název. Pokud potřebujete aplikaci restartovat - poprvé stačí soubor v adresáři tmp vytvořit a při dalších požadavcích na restart změnit jeho časové razítko příkazem touch.
Další problém, kterému jsem musel čelit, byla absence automatického startu serveru Nginx. K tomu se v Unix(like) světě samozřejmě používají init skripty. Tak jsem si jeden takový napsal.
1 #!/bin/bash
2 #start /opt/nginx/sbin/nginx
3 #restart /opt/nginx/sbin/nginx -s reload
4 #stop /opt/nginx/sbin/nginx -s stop
5
6 #----------------------------------------------------
7
8 case $1 in
9 start) echo "starting NGINX"
10 /opt/nginx/sbin/nginx
11 ;;
12 stop) echo "stoping NGINX"
13 /opt/nginx/sbin/nginx -s stop
14 ;;
15 restart) echo "restarting NGINX"
16 /opt/nginx/sbin/nginx -s reload
17 ;;
18 *) echo "Ussage:"
19 echo "${0} (start|stop|restart)"
20 ;;
21 esac
Soubor je třeba nakopírovat do adresáře /etc/init.d a nastavit mu práva na spuštění. ( chmod +x /etc/init.d/nginx ) Příkazem update-rc.d nginx defaults jsem si pak zajistil správnou distribuci symbolického linku do příslušných adresářů, aby docházelo ke spuštění a vypínání při ‘defaultních’ runlevelech.
Jak sami můžete vidět - můj init soubor je prostě jen hloupá kostra, ale svému účelu poslouží. Tím ovšem nechci říct, že bych mu svěřil osud nějakého produkčního serveru. Jednou patlal navždy patlal :D