Hopp til innholdet

cjohansen.no

Produksjonsmiljø for Rails under Debian Etch

For en tid tilbake satte jeg opp mitt første produksjonsmiljø for Rails på en Debian-maskin fra scratch. Oppskriften er forsåvidt lett, men som alltid dukker det opp noen uforutsette problemer. Følgende er en hinderfri oppskrift for mongrel cluster + Apache 2.2 under Debian Etch.

Ingredienser

Før vi setter igang, la oss se hva vi trenger for å rulle:

Og om du ikke har egen databaseserver må du selvfølgelig også sette opp det. Jeg antar i dette innlegget at du har en databaseserver tilgjengelig.

Ruby

Første skritt er Ruby-interpreteren. Som Debian-pakker flest er denne splittet opp i mange mindre pakker, flere enn om du laster ned Ruby utenom apt.

sudo apt-get install ruby1.8 ruby1.8-dev irb

Dette gir deg en minimal Ruby-installasjon med header-filene som trengs for å bygge tillegg. irb er også med, det kan komme godt med når du må være doktor for en skadet applikasjon. Dersom du også har behov for dokumentasjon på live-serveren kan du hente det også gjennom apt:

sudo apt-get ri rdoc

Ruby installeres med en kjørbar fil i /usr/bin/ruby1.8. Dette duger ikke, vi trenger en /usr/bin/ruby, så du må symlinke 1.8:

cd /usr/bin
ln -s ruby1.8 ruby

Rubygems

Neste skritt på lista er Rubygems, og her er det duket for den første fallgruven. Rubygems i apt er i versjon 0.9, noe som er for gammelt om du skal bruke Rails 2.0. Bruker du eldre versjoner av Rails kan du kjøre på med sudo apt-get install rubygems, men når du så vil oppgradere Rails får du problemer.

Så vi kan ikke stole på apt og får heller installere Rubygems selv. Ingen bekymringer, det er ikke akkurat kjernefysikk. Siste versjon av Rubygems finner du på RubyForge. I skrivende stund er det 1.1.1.

cd /tmp
wget http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
tar -xvzf rubygems-1.1.1.tgz
cd rubygems-1.1.1
sudo ruby setup.rb

Dette gir oss som tidligere /usr/bin/gem1.8 og løsningen er den samme:

cd /usr/bin
ln -s gem1.8 gem

Denne måten gjør det også lettere å oppgradere til feks 1.9 når det blir mulig å kjøre Rails med denne versjonen.

MySQL-gem'en

Ruby-bindingene for MySQL er ok for utvikling, men et potensielt ytelsesproblem i produksjon. Derfor trenger vi C-bindingene til MySQL i steden. Dette kan vi installere ved å første hente utviklingsfilene til MySQL fra apt, og deretter mysql-gemen fra Rubygems.

sudo apt-get install libmysqlclient15-dev
sudo gem install mysql -with-mysql-config=/usr/bin/mysql_config

Rails

Så er det klart for Rails. Vi kan bare installere Rails direkte gjennom Rubygems, den sørger for å ta ned alle avhengigheter, som feks Rake.

sudo gem install rails

Mongrel

Mongrel er blant mange den foretrukne applikasjonsserveren for Rails. En fin måte å deploye Rails på er å kjøre flere Mongrel-instanser for så å kjøre en load balancer som fordeler trafikken mellom disse. Apaches proxy balancer er en ypperlig kandidat. Andre foretrekker Nginx, men jeg har selv ingen erfaring med denne.

Nylig har også Passenger/ mod_rails fått mye god omtale. Jeg skriver om den seinere når jeg har fått lekt med den. (Noen som har erfaringer her? kom gjerne med dem!)

Uansett, det blir Mongrel for nå. Vi installerer også mongrel_cluster, som letter det å starte flere Mongrel-instanser for samme applikasjon.

sudo gem install mongrel
sudo gem install mongrel_cluster

På dette tidspunktet kan du sjekke om miljøet funker for din applikasjon:

cd /var/www/minapp/
mongrel_rails start -d
curl -I localhost:3000

Hvis dette kjører uten å kræsje og responsen er 200 (eller en annen respons som er forventet, feks 301/302) så er miljøet klart for applikasjonen din. Husk også å installere andre gems som applikasjonen din kanskje trenger. curl er forøvrig et fantastisk verktøy som kan installeres gjennom apt ( sudo apt-get install curl).

Hvis koden over derimot ikke kjørte så er det sannsynlig at problemet så ut som:

** Starting Rails with development environment...
/usr/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/initializer.rb:159:in `require_frameworks': no such file to load -- openssl (RuntimeError)

Løsningen er grei nok:

sudo apt-get install libopenssl-ruby1.8

Konfigurasjon av mongrel_cluster

Denne siden har en veldig god guide til oppsett av mongrel_cluster.

Når du får beskjed om å gjøre: sudo cp /path/to/mongrel_cluster_gem/resources/mongrel_cluster /etc/init.d/ kan det hende at du rett og slett får problemer med å finne " /path/to/mongrel_cluster_gem/resources/mongrel_cluster". Ved å sjekke Debians Rubygems-pakke får du en oversikt over installerte filer. Rubygems gjemmer seg på /usr/lib/ruby/gems/1.8/gems/, og kommandoen skal dermed være sudo cp /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d/.

Capistrano

Capistrano er et uvurderlig verktøy for å deploye applikasjonen din. Installasjon er som vanlig simpelt:

sudo gem install fastthread
sudo gem install capistrano

Det finnes gode guider for å komme igang med Capistrano om du ikke allerede bruker det.

Apache 2.2 med mod_proxy_balancer

sudo apt-get install apache2

Konfigurasjonen er ganske rett frem. Du må muligens enable mod_proxy_balancer, mod_proxy og mod_proxy_http:

cd /etc/apache2/mods-enabled
ln -s ../mods-available/proxy.load
ln -s ../mods-available/proxy_http.load
ln -s ../mods-available/proxy_balancer.load

Deretter kan du konfigurere opp applikasjonen. Dette gjøres i to steg. Steg én er å kofigurere en load balancer som fordeler trafikk mellom mongrel-instansene som du kjører med mongrel_cluster. Neste steg er å ta i bruk balanceren fra VirtualHost-konfigurasjonen for siten.

Load balanceren

<Proxy balancer://mongrel_cluster>
    BalancerMember http://127.0.0.1:8080
    BalancerMember http://127.0.0.1:8081
    BalancerMember http://127.0.0.1:8082
</Proxy>

I denne setter du opp alle serverne som kjøres. Ved å kjøre serverne slik at de lytter kun på 127.0.0.1 unngår du at hvem som helst kan nå spesifikke mongrel-er ved å gå til dittdomene.no:8081 osv.

VirtualHost-konfigurasjonen

<VirtualHost *>
    ServerName www.mittdomene.no
    ServerAlias mittdomene.no

    ProxyRequests Off

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

    RewriteRule .* balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]
</VirtualHost>

Merk at "mongrel_cluster" her er navnet på load balanceren og er i så måte valgfri. Konfigurasjonen over er helt minimal, og sannsynligvis ønsker du å fylle den ut noe mer.

Dersom du ønsker å kjøre en applikasjon som en del av en site, og ikke serve hele siten fra applikasjonen kan du endre RewriteRule-en over:

RewriteRule ^/app-kontekst(.*)$ balancer://mongrel_cluster%{REQUEST_URI} [P,QSA,L]

På denne måten kan applikasjonen kun nås fra www.mittdomene.no/app-kontekst.

Det skulle være det! Det meste kan settes opp med pakkesystemene apt og Rubygems, med unntak av Rubygems selv, som må installeres manuelt dersom du ønsker å bruke Rails 2.0.

Muligens relatert

2006 - 2012 Christian Johansen Creative Commons Lisens