Ayant eu envie de me la jouer geek, j’ai très récemment remplacé mon Apache par le très bon Nginx. Enfin, quand je dis « remplacé », ce n’est pas exactement vrai, voyez plutôt :
Comme le montre le schéma ci-dessus, toutes les requêtes arrivant sur le serveur sont transmises à Nginx qui va ensuite décider en fonction de leur type s’il va les traiter ou pas. Apache n’est donc plus là que pour traiter les pages PHP, et Mongrel s’occupe quant à lui du Ruby.
Bon, maintenant que vous savez comment mon serveur marche sous le capot, je vais vous expliquer comment mettre en place la partie Nginx + Mongrel, dans l’optique de faire tourner Redmine derrière tout ça.
Je suppose que vous avez un Nginx opérationnel et Ubuntu 10.4 (version serveur ou pas, peu importe), en sachant que les manipulations devraient être sensiblement les mêmes sur les autres dérivés de Debian et sur Debian elle-même.
Installation des .deb
Notre OS fourni des .deb de Mongrel ET de Redmine, donc autant les utiliser :
sudo aptitude install redmine redmine-mysql mongrel
La seule « difficulté » ici étant de correctement renseigner les logins de base de données, je pars du principe que vous saurez vous débrouiller sans moi =3
Automatisation du lancement de Redmine
L’installation des .deb de Redmine et de Mongrel ne nous donne aucun moyen de gérer automatiquement le lancement et l’arrêt de Redmine. Qu’à cela ne tienne, nous allons créer notre propre /etc/init.d/redmine pour gérer tout ça !
#!/bin/sh set -e REDMINE_PATH=/usr/share/redmine/ REDMINE_PID=/tmp/mongrel.pid REDMINE_LOG=/tmp/mongrel.log REDMINE_PORT=3000 if [ -x /usr/bin/mongrel_rails ] ; then HAVE_MONGREL=1 else echo "Mongrel not installed." exit 0 fi . /lib/lsb/init-functions case "$1" in start) log_action_begin_msg "Starting Redmine server" mongrel_rails start -c $REDMINE_PATH -d -e production -p $REDMINE_PORT -P $REDMINE_PID -l $REDMINE_LOG log_action_end_msg $? ;; stop) log_action_begin_msg "Stopping Redmine server" mongrel_rails stop -c $REDMINE_PATH -P $REDMINE_PID log_action_end_msg $? ;; force-reload|restart) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/redmine {start|stop|restart|force-reload}" exit 1 ;; esac exit 0
Sans oublier de rendre le script exécutable :
sudo chmod +x /etc/init.d/redmine
On peut aussi faire en sorte que Redmine soit automatiquement lancé dès le boot du serveur via un :
sudo update-rc.d redmine defaults
Configuration de Nginx
On dispose maintenant d’un Redmine fonctionnel et théoriquement servi en local par Mongrel, il ne reste donc plus qu’à le rendre accessible depuis l’extérieur. Pour cela nous allons utiliser les fonctionnalités de proxy de Nginx comme le fait le virtualhost suivant :
# redmine.kevingomez.fr server { listen 80; server_name redmine.kevingomez.fr; location / { root /usr/share/redmine/public; # le port 3000 est celui indiqué dans le fichier /etc/init.d/redmine proxy_pass http://127.0.0.1:3000; } }
Notez qu’ici on configure Redmine pour être accessible via un domaine. Si Redmine est dans un sous-répertoire, veillez à ajouter la ligne suivante à la fin du fichier /usr/share/redmine/config/environment.rb :
ActionController::AbstractRequest.relative_url_root = "/redmine"
Autres pistes possibles
Le Redmine étant ici destiné à être utilisé par peu de personnes (pas plus de 4 ou 5), Mongrel devrait se la couler douce un moment.
Si vous souhaitez accueillir un peu plus de monde que moi sur votre installation, je vous suggère de vous documenter sur mongrel_cluster (Nginx sert en fait de load balancer sur plusieurs serveurs Mongrel)
Il est aussi possible d’utiliser Redmine non pas dans un cluster de serveurs Mongrel, mais dans un cluster de serveurs Thin.
Dernière petite piste : Phusion Passenger.