i76 webdesign, Sittard
Rails, Apache, Mongrel en mod_proxy configureren
De titel lijkt nikszeggend, maar probeer maar eens een pakkende titel te vinden die in het kort samenvat dat je artikel gaat over het hosten van Ruby on Rails applicaties op mongrel, gebruik makend van Apache en mod_proxy voor het serveren van je statische content (zoals afbeeldingen, scripts en stylesheets). Op dit moment een van de beste manieren om RoR applicaties te hosten.
Er komt namelijk een tijd dat je je prachtige web applicatie online wilt plaatsen, en alhoewel er meer dan genoeg providers zijn die RoR hosting aanbieden, is het natuurlijk veel leuker om het zelf te doen!
Allereerst een lijstje van dingen die je nodig hebt:
- De Apache 2 HTTP Server
- De mod_proxy module voor Apache 2
- en natuurlijk mongrel (en in ons geval ook mongrel_cluster).
Aangezien het installeren van deze packages op elk OS anders is, gaan we hier niet te diep op in. Wij draaien zelf debian stable op onze servers, en hebben Apache en mod_proxy via apt-get geinstalleerd, mongrel en mongrel_cluster hebben we echter via Ruby Gems geinstalleerd.
Nu komt het leuke gedeelte, het configureren van je server!
Laten we eerst een mongrel configuratie bestand genereren. We gaan in onze voorbeelden even uit van een voorbeeld rails applicatie die we webwinkel noemen.
$ cd /home/webwinkel $ mongrel_rails cluster::configure -e production -p 5000 -N 1 -c /home/webwinkel -a 127.0.0.1
Wat doet het mongrel_rails cluster::configure gedeelte precies? En wat betekenen de argumenten die we meegeven?
-e: Geeft de environment aan. in rails zijn dit development, production en testing. In principe wil je alle applicaties die via apache draaien als production laten draaien, aangezien je je development meestal met Webrick doet.-p: Geeft de start poort aan van mongrel server aan. In ons geval starten we met poort 5000. Je moet er natuurlijk wel voor zorgen dat er geen andere applicaties zijn die deze poort gebruiken!-N: Geeft aan hoeveel servers je wilt starten. We willen nu maar 1 server gebruiken, omdat we nog niet verwachten dat onze webwinkel veel bezoek gaat trekken. Niet dat we pessimistisch zijn, maar je wilt natuurlijk ook niet dat al je beschikbare geheugen opgaat aan niet gebruikte mongrel processen!-c: De directory waar de rails applicatie zich bevind. In ons geval is dit dus/home/webwinkel.-a: Het IP adres waar de mongrel server zich aan bindt. We zetten dit op127.0.0.1, zodat het alleen lokaal beschikbaar is.
Als het goed is hebben we nu in /home/webwinkel/config een bestand staan dat mongrel_cluster.yml heet. Aangezien we straks het liefste al onze rails applicaties tegelijk opstarten, gaan we hiervoor een startup script schrijven. Hiervoor willen we alle configuratie bestanden het liefste op 1 centrale plek. Wat ik persoonlijk de makkelijkste oplossing vind is een directory /etc/mongrel_cluster te maken, en onze configuratie bestanden hier in te symlinken.
$ mkdir /etc/mongrel_cluster $ ln -s /home/webwinkel/config/mongrel_cluster.yml /etc/mongrel_cluster/webwinkel.yml
Nu nog een script dat hier gebruik van maakt. Ik heb dit in /etc/init.d/mongrel_cluster staan:
#!/bin/bash
CONF_DIR=/etc/mongrel_cluster
RETVAL=0
case "$1" in
start)
mongrel_cluster_ctl start -c $CONF_DIR
RETVAL=$?
;;
stop)
mongrel_cluster_ctl stop -c $CONF_DIR
RETVAL=$?
;;
restart)
mongrel_cluster_ctl restart -c $CONF_DIR
RETVAL=$?
;;
*)
echo "Usage: mongrel_cluster {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Nu kan ik door /etc/init.d/mongrel_cluster start aan te roepen, al mijn mongrel servers starten!
Aangezien mongrel een fijne webserver is voor rails applicaties, maar niet zo heel snel is in het serveren van statische content (afbeeldingen, scripts, stylesheets, ed.), gaan we nu Apache zo configureren, dat deze alle aanroepen naar statische content behandeld, en de resterende aanroepen doorsluist naar mongrel.
Open het bestand waar je je virtual host in configureert (in debian bijvoorbeeld /etc/apache2/sites-enabled/webwinkel.i76.nl), en voeg, uiteraard aangepast naar eigen instellingen, onderstaande tekst toe:
<VirtualHost *:80>
ServerName webwinkel.i76.nl
DocumentRoot /home/webwinkel/public/
<Directory /home/webwinkel/public/>
Options +FollowSymlinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ProxyRequests Off
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
ProxyPreserveHost On
# Voor statische files
RewriteRule "^/(images|stylesheets|javascripts)/?(.*)" "$0" [L]
# Als een pagina gecached is, vraag die dan op
RewriteRule ^([^.]+)$ $1.html [QSA]
# Anders dan ...
RewriteCond %{REQUEST_FILENAME} !-f
# Sturen we het door naar onze mongrel
RewriteRule "^/(.*)" "http://localhost:5000/$1" [P,QSA,L]
</VirtualHost>
Een herstart van Apache 2 later, en alles werkt precies zoals je het wilt. Mocht je website zeer populair worden, dan heeft het zeker zin om te kijken naar mongrel cluster configuraties. Hieronder een aantal gerelateerde links:
remco zegt:
Hi,
ik heb de bovenstaande code geplaats alleen ik krijg de melding dat de pagina niet bestaat.
http://www.goedkoop-vliegen.nu/pages
error> The page you were looking for doesn’t
exist.
Wat kan de oorzaak zijn?
Groetjes,
remco
14 april, 2008 om 13:10
Tom-Eric zegt:
Heb je wel een
pagescontroller (app/controllers/pages_controller.rb)? Het kan natuurlijk aan heel veel dingen liggen. Ik raad je trouwens aan om te kijken naar modrails, wat dit weekend is uitgekomen. Dit versimpelt het deployen van je applicatie waanzinnig!14 april, 2008 om 14:08