Changement de serveur, encore une fois
Je n’ai pas trop eu le temps de communiquer dessus, mais ce site a (encore une fois) déménagé. J’ai quitté mon beau serveur dédié OVH surdimensionné pour une petite Kimsufi, bien suffisante pour mes besoins, surtout depuis que la majorité du trafic vers Typo se fait maintenant vers Github.
Tenir la charge, mon cul !
La phrase du jour (un peu vieux, mais quand même) :
Saying “Rails doesn’t scale” is like saying “my car doesn’t go infinitely fast”. Alternatively, saying “We’ll have no problems scaling because we’re using Django” is like saying “I will win every race because my car is the most powerful”. Maybe so, but you suck at driving, and you’re up against professionals.
If you’re having scalability problems and blaming it on a single technology, chances are, you’re doing it wrong.
Shut up about scalability, no one is using your app anyway.
Sortie de mod_rails 2.0.2 qui corrige une importante fuite de mémoire
Pas de repos pour les braves en ce 14 juillet – normal il est hollandais, il n’en a donc pas grand chose à faire – puisque Hongli Lai vient d’annoncer la sortie de Passenger mod_rails 2.0.2, qui corrige un certain nombre de bugs critiques. Passenger est un module Apache qui rend le déploiement d’une application Ruby on Rails, mais pas seulement, aussi simple qu’un site en PHP, retirant la principale épine du pied de mon framework web favori.
Cette nouvelle version de Passgenger corrige en particulier une importante fuite de mémoire qui survenait chaque fois qu’un client web quittait le ApplicationPoolServerExecutable. Celle-ci, après avoir mis le serveur à genoux et rendu le site indisponible pendant un week-end entier m’avait finalement forcé à downgrader en 1.0.5 nettement plus stable.
Et comme une bonne nouvelle n’arrive jamais seule, cette version arrive avec un paquet Ubuntu tout chaud.
[Note de service] déménagement et changement d'URL
Comment ça on ne migre jamais un vendredi ? C’est en tout cas ce que je répète régulièrement, non sans raison, mais là, j’avais envie.
Je viens de déménager le site vers mon nouveau serveur. La migration s’est à priori déroulée sans incident ni interruption de service, et les autres sites suivront durant le week-end : d’abord les sites en Ruby on Rails, puis les sites en PHP qui rejoindront la jail dans laquelle j’ai décidé de les confiner, les alertes de sécurité à répétition de Wordpress ayant tendance à sérieusement m’échauffer les oreilles.
Le tuning Apache pour augmenter les performances de votre application web
Les problèmes de montée en charge sont choses courantes pour un site ou une application web une fois atteint un certain succès. Ces derniers sont bien trop souvent négligés, généralement jusqu’au jour où se trouve atteinte la limite critique entre l’inconfort et l’instabilité. Le trend actuel veut qu’il soit à la fois plus simple et moins cher de rajouter des machines que de reprendre son code en profondeur pour l’optimiser. Encore faut-il que l’application permette un redimensionnement de ce genre sans rentrer dans une phase de refactoring complet. Évidemment, avant d’en arriver à une solution aussi lourde, il vaut mieux s’assurer que tout a été fait pour exploiter au mieux les ressources disponibles, et cela passe notamment par un peu d’optimisation côté serveur.
Retour du blog en France et en 32 bits
1&1 ne me proposant malheureusement pas d’IP françaises, me voilà contraint de rapatrier ce blog sur le sol hexagonal, et du même coup de changer de plate-forme. Tout ça pour une bête question de référencement dans les outils de recherche. Enfin, peut-être pas si bête que ça en fait.
D’un point de vue technique, cela nous donne :
Avant
- Athlon64 3500+.
- 1go de RAM.
- 80go de disque dur.
- 100mb.
Maintenant
- Pentium4 3ghz hyper threadé.
- 2go de RAM.
- 250go de disque dur.
- 100mb.
Le tout pour 20 euros de moins par mois. Je perds en revanche le raid 1 et le backup en ftp de 80go proposés par 1&1, mais vus les tarifs, il n’est pas exclu que je prenne un hébergement de backup ailleurs histoire d’assurer le coup. Comme ils disent dans les assurances, ça ne coûte cher qu’avant l’accident.
Et si vous lisez ce billet, c’est que la migration s’est faite sans problème.

Installer Ruby on Rails, Apache 2.2, mod_fcgid et Typo sous Debian Etch
La version à venir de la Debian apporte son lot de mises à jour intéressantes, et parmi elles, pas des moindres, l’arrivée d’Apache 2.2 en tant que serveur web par défaut et de Ruby 1.8.5, propre à faire tourner Ruby on Rails dans de bonnes conditions. Alors pourquoi ne pas franchir le pas et enfin vous mettre à ce merveilleux framework dont vous entendez monts et merveilles depuis bientôt 4 ans, d’autant qu’on vous prend par la main pour mettre en place votre environnement de développement. Un didacticiel pour vous emmener pas à pas vers le paradis des applications web (rien que ça).
Apache 2.2 et Mysql5
Dans un premier temps, vous allez installer le serveur web Apache 2.2, et la version 5.0 de la base de données MySQL. Ce didacticiel ne traite pas encore de PostgreSQL, mais ça ne saurait tarder.
7el.net:~$ sudo aptitude install mysql-client mysql-server apache2-mpm-prefork apache2.2-common apache2-utils
[...]
7el.net:~$ sudo a2enmod rewrite
Normalement, aptitude devrait vous demander un mot de passe pour l’administrateur. Si ce n’est pas le cas, tapez juste
7el.net:~$ mysqladmin -u root -h localhost -p 'toto'
Mod_fcgid 2.0
Malheureusement pour les utilisateurs de Ruby on Rails – et d’une manière générale pour n’importe quelle application utilisant fastcgi, trac par exemple si vous ne souhaitez pas installer modpython – Etch n’inclut pas le module Apache modfcgid pour la version 2.2 du serveur. Le paquetage est en effet cassé, et seule la version pour Apache 2.0 est supportée. Il vous faudra donc à priori choisir entre :
- Installer Apache 2.2, PHP5 et vous passer de mod_fcgid.
- Ou bien installer Apache 2.0 et mod_fcgid, mais vous passer de PHP5 (pourquoi pas).
- Ou encore backporter mod_fcgid depuis la version unstable de la Debian.
Vous allez donc télécharger les sources de mod_fcgid depuis la version unstable de Debian, puis reconstruire et installer le paquetage.
Commencez par ajouter la ligne suivante à votre fichier /etc/apt/sources.list :
deb-src http://mirrors.kernel.org/debian unstable main contrib non-free
7el.net:~$ sudo aptitude update
7el.net:~$ cd /tmp
7el.net:/tmp$ sudo apt-get build-deps libapache2-mod-fcgid-2.0
[...]
7el.net:/tmp$ apt-get -b source libapache2-mod-fcgid-2.0
Et là, c’est le drame : au moment d’activer le module à l’aide d’a2enmod, dpkg vous annonce “ce module n’existe pas”. Pour une raison que j’ignore, le paquetage n’a pas copié les fichiers fcgid.conf et fcgid.load dans /etc/apache2/mods-avaliable. Pas de panique, vous allez le faire et tout va rentrer dans l’ordre.
7el.net:/tmp$ cd libapache2-mod-fcgid-2.0/debian
7el.net:/tmp/libapache2-mod-fcgid-2.0/debian$ sudo cp fcgid.load fcgid.conf /etc/apache2/mods-avaliable
7el.net:/tmp/libapache2-mod-fcgid-2.0/debian$ a2enmod fcgid
7el.net:/tmp/libapache2-mod-fcgid-2.0/debian$ /etc/init.d/apache2 restart
Toi aussi tu veux un mod_fcgid avec bas de caisse, phasres violets et une sono de 10000 watts ?
Afin de bénéficier de meilleures performances, nous allons modifier la configuration de base de mod_fcgid. Remplacez le fichier /etc/apache2/mods-available/fcgid.conf par ceci :
<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi SocketPath /var/lib/apache2/fcgid/sock IPCConnectTimeout 6 IdleTimeout 60 ProcessLifeTime 6000 MaxProcessCount 32 DefaultMaxClassProcessCount 5 IPCConnectTimeout 6 IPCCommTimeout 6 </IfModule>
La signification de tout ceci peut sembler obscure, aussi quelques éclaircissements s’imposent.
AddHandler fcgid-script .fcgi: nous disons explicitement à Apache d’exécuter tous les fichiers portant l’extension.fcgiavec mod_fcgid.SocketPath /var/lib/apache2/fcgid/sock: le chemin de la chaussette à l’aide de laquelle Apache et le serveur de fcgi vont communiquer.IPCConnectTimeout 6: timeout d’une connexion à un processus fcgi.IdleTimeout 60: une application lancée par fcgi se terminera après 60 secondes d’idle. Cela permet de ne pas avoir trop de processus lancés en même temps.ProcessLifeTime 6000: durée maximum d’un processus fcgid.MaxProcessCount 32: nombre maximum de processus fcgid lancés en parallèle. À ajuster en fonction de la charge de votre serveur.DefaultMaxClassProcessCount 5: nombre maximum d’instances d’une même application fcgid pouvant être lancées en parallèle.IPCConnectTimeout 6: timeout d’une connexion à un processus fcgid.IPCCommTimeout 6: timeout d’une communication avec un processus fcgid.
Vous ne trouvez pas ça tellement plus clair ? Ce n’est pas grave, et ça ne vous empêchera pas d’avancer plus avant dans ce didacticiel.
Ruby et Gem
Vous allez maintenant installer Ruby, rdoc et irb depuis les paquetages Debian, puis Gem à l’aide des sources afin de bénéficier de la toute dernière version. Gem est le gestionnaire de paquetages de Ruby, un outil absolument indispensable.
7el.net:~$ sudo aptitude install ruby1.8 rdoc irb
[...]
7el.net:~$ cd /usr/bin
7el.net:/usr/bin$ sudo ln -s ruby1.8 ruby
Récupérez maintenant les sources de la dernière version de Gem, actuellement la 0.9.1, et installez la.
7el.net:/usr/bin$ cd /tmp
7el.net:/tmp$ wget http://rubyforge.org/frs/download.php/16452/rubygems-0.9.1.tgz
[...]
7el.net:/tmp$ tar xvzf rubygems-0.9.1.tgz
7el.net:/tmp$ cd rubygems-0.9.1
7el.net:/tmp/rubygems-0.9.1$ sudo ruby setup.rb
Rails, MySQL et fcgid
Il reste que Ruby ne peut pas encore converser avec fcgid ni avec MySQL – ou PostgreSQL si vous avez opté pour cette solution.
Dans un premier temps, il va vous falloir installer les en-têtes des librairies nécessaires à l’installation des gems mysql et fcgid :
7el.net:~$ sudo aptitude install libmysqlclient-dev libfcgi-dev
7el.net:~$ sudo gem install mysql
7el.net:~$ sudo gem install fcgid
Typo
Typo dispose d’un programme d’installation, mais il implique d’utiliser SQLite en tant que base de données. Vous allez donc commencer par récupérer la dernière version de l’application sur Typosphere (hébergé ici à partir de demain ou après demain, le temps de terminer ma conf), et créer une base de données pour votre application.
Pas une mais 3 bases
Nous allons en fait créer 3 bases de données, correspondant aux 3 environnements d’une application Rails : développement, production et test.
7el.net:~$ mysql -u root -p
[...]
mysql> create database typo;
mysql> grant all privileges on typo.* to 'typo'@'localhost' identified by 'typosaibo'
mysql> create database typo_dev;
mysql> grant all privileges on typo_dev.* to 'typo'@'localhost' identified by 'typosaibo'
mysql> create database typo_test;
mysql> grant all privileges on typo_test.* to 'typo'@'localhost' identified by 'typosaibo'
7el.net:~$ cd /var/www
7el.net:/var/www$ sudo wget http://rubyforge.org/frs/download.php/12504/typo-4.0.3.tgz
7el.net:/var/www$ sudo tar xvzf typo-4.0.3.tgz
7el.net:/var/www$ sudo mv typo-4.0.3 typo
Nous allons maintenant configurer la base de données de Typo :
7el.net:/var/www$ cd typo
7el.net:/var/www/typo$ sudo vim config/database.yml
7el.net:/var/www/typo$ sudo rake RAILS_ENV=production db:migrate
Les petites particularités d’Apache 2.2
Parmi les nouveautés d’Apache 2, nous avons le retrait du support des options du .htaccess. Nous allons donc devoir supprimer une ligne de celui de Typo et les ajouter dans le vhost Apache que nous allons créer pour lui.
7el.net:/var/www/typo$ sudo vim public/.htaccess
La ligne incriminée :
Options +FollowSymLinks +ExecCGI
Notre virtualhost va alors ressembler à :
7el.net:/var/www/typo$ sudo vim /etc/apache2/sites-avaliable/typo
<VirtualHost 87.106.13.102:80> ServerAdmin root@typo DocumentRoot /var/www/typo/public Options +FollowSymLinks +ExecCGI ServerName typo.t37.net CustomLog /var/log/apache2/log.typo.t37.net combined Errorlog /var/log/apache2/error.typo.t37.net </VirtualHost>
Il s’agit évidemment d’une configuration minimale, qui permet à Typo de tourner. Il ne nous reste plus qu’à activer le site et à redémarrer Apache.
7el.net:/var/www/typo$ sudo a2ensite typo
7el.net:/var/www/typo$ sudo chown -R www-data:www-data *
7el.net:/var/www/typo$ sudo /etc/init.d/apache2 restart
Et voilà, ça marche.
10 méthodes pour optimiser les performances d'un site Internet
Alexander Kirk propose un excellent document envisageant 10 pistes réalistes pour optimiser la rapidité d’un site Internet, et plus encore d’une application Web dont les besoins en réactivité égalent les applications en client lourd.
Billets précédents :

Passionné d'informatique depuis l'âge de six ans, je travaille en tant que responsable qualité chez blueKiwi Software, éditeur spécialiste des outils collaboratifs en entreprise. Ma double formation en sciences politiques et en informatique me permet de porter un regard particulier sur les problématiques abordées par mon poste.