Installer Redmine sous Nginx

Publié le 18 juillet 2010 par Kphoen

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.