Nginx, mais pourquoi ?
Pourquoi remplacer Apache par Nginx ?
Pourquoi remplacer Lighttpd par Nginx ?
Pourquoi pas Nginx ?
Pourquoi pas uniquement Nginx ?
Nginx et PHP :
Si vous ne trouvez pas un module, demandez ! Il existe certainement.
J'espère être resté +/- clair sinon demandez également !
Nginx est un serveur http asynchrone. Il utilise epoll et son empreinte sur le serveur est minime. Sa communauté est réduite mais très active. Selon Google, Nginx servirait 4% du web.
Le site officiel.
Le wiki.
Le site officiel.
Le wiki.
Pourquoi remplacer Apache par Nginx ?
Apache est "multiprocess-based".
Le principe : un nombre déterminé de processus est lancé à l'initialisation puis géré par Apache.
Les problèmes :
Le principe : un nombre déterminé de processus est lancé à l'initialisation puis géré par Apache.
Les problèmes :
- la gestion des processus a un coût,
- chaque processus nécessite son lot de ram (dicté par le maximum utilisé précédemment),
- et chaque téléchargement occupe un processus.
Pourquoi remplacer Lighttpd par Nginx ?
Lighttpd souffre de graves troubles mémoriels et sa configuration est quelque peu anarchique.
Pourquoi pas Nginx ?
La documentation est russe et anglaise (mais bientôt française).
Pourquoi pas uniquement Nginx ?
Certaines applications nécessitent Apache ou certains ne voudront pas prendre le risque de tout basculer vers Nginx en une fois. Il est alors possible de placer Nginx devant Apache.
Nginx pourra alors servir les images, les feuilles de styles, les téléchargements et expédier le reste à Apache.
Nginx pourra alors servir les images, les feuilles de styles, les téléchargements et expédier le reste à Apache.
Nginx et PHP :
Cette association fonctionne grâce à FastCGI. Toutefois Nginx, à la différence d'Apache et Lighttpd, ne lance pas ses propres processus.
Voici donc trois méthodes pour ce faire :
La dernière méthode m'apparaissant la plus agréable, voici comment l'implémenter (pour php-5.2.5) :
Avant, définissez quelques répertoires temporaires et téléchargez les sources :
Patchez PHP (ceci est un simple c/c de php-fpm) :
Éventuellement : modifiez les sources, téléchargez des extensions.
Compilez PHP (ajoutez vos choix habituels) :
Compilez Nginx (ajoutez vos choix) :
Détruisez les dossiers temporaires.
Voici un init script pour nginx (modifiez daemon) :
Et un init script pour PHP (modifiez PHP_SCRIPT) :
La gestion de FastCGI dépend d'un nouveau fichier php-fpm.conf situé dans le dossier etc à la racine du dossier php.
Je pensais vous documenter une configuration type pour nginx mais le domaine est vraiment trop vaste. Je vous renvois donc vers quelques examples.
Mais voici quelques possibilités :
Voici donc trois méthodes pour ce faire :
- Écrire son propre script,
- Récupérer SpawnFCGI de Lighttpd,
- Patcher PHP avec PHP-FPM.
La dernière méthode m'apparaissant la plus agréable, voici comment l'implémenter (pour php-5.2.5) :
Avant, définissez quelques répertoires temporaires et téléchargez les sources :
Code:
mkdir /src
mkdir /src/php-5.2.5-fpm
mkdir /src/nginx-0.6.25
cd /src/php-5.2.5-fpm
wget http://php-fpm.anight.org/downloads/head/php-5.2.5-fpm-0.5.5.diff.gz
wget http://be.php.net/get/php-5.2.5.tar.bz2/from/this/mirror
cd /src/nginx-0.6.25
wget http://sysoev.ru/nginx/nginx-0.6.25.tar.gz
Code:
cd /src/php-5.2.5-fpm
bzip2 -cd php-5.2.5.tar.bz2 | tar xf -
gzip -cd php-5.2.5-fpm-0.5.5.diff.gz | patch -d php-5.2.5 -p1
Compilez PHP (ajoutez vos choix habituels) :
Code:
cd /src/php-5.2.5-fpm/php-5.2.5
./configure --help
./configure --enable-fastcgi --enable-fpm
make
make test ([u]si vous avez également choisi cli[/u])
make install
Code:
cd /src/nginx-0.6.25
tar -zxvf nginx-0.6.25.tar.gz
cd /src/nginx-0.6.25/nginx-0.6.25
./configure --help
./configure
make
make install
Voici un init script pour nginx (modifiez daemon) :
Code:
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
DAEMON=/placez/l/adresse/jusque/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON
sleep 1
start-stop-daemon --start --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
Code:
#!/bin/bash
PHP_SCRIPT="/placez/l/adresse/jusque/bin/php-cgi --fpm";
RETVAL=0
case "$1" in
start)
$PHP_SCRIPT
RETVAL=$?
;;
stop)
killall -9 php-cgi
RETVAL=$?
;;
restart)
killall -9 php-cgi
sleep 1
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo "Usage: /etc/init.d/php {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
Je pensais vous documenter une configuration type pour nginx mais le domaine est vraiment trop vaste. Je vous renvois donc vers quelques examples.
Mais voici quelques possibilités :
- La réécriture d'url,
- les hôtes virtuelles,
- le round-robin,
- la spécification de différents répertoires afin de placer l'application sur ext3 en Raid1 mais le cache sur Reiser en Raid0.
- la modification du charset selon le site ou le répertoire du site,
- l'inclusion de pages,
- l'utilisation de memcache,
- l'envoi de contenu statique pré-gzipé (conservez toujours la version non-gzipé, pour IE <6),
- l'envoi de contenu dynamique gzipé à la volée.
Code:
/etc/init.d/php start
/etc/init.d/nginx start
Si vous ne trouvez pas un module, demandez ! Il existe certainement.
J'espère être resté +/- clair sinon demandez également !