Nginx ?

Discussion dans 'Web, design' créé par ozilrit, 23 Janvier 2008.

Statut de la discussion:
Fermée.
  1. Offline
    ozilrit Touriste
    Nginx, mais pourquoi ?
    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.


    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 :
    • 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 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 :
    • É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
    
    Patchez PHP (ceci est un simple c/c de php-fpm) :
    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
    
    Éventuellement : modifiez les sources, téléchargez des extensions.

    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
    Compilez Nginx (ajoutez vos choix) :
    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
    Détruisez les dossiers temporaires.

    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
    Et un init script pour PHP (modifiez PHP_SCRIPT) :
    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
    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 :
    • 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.
    Il vous reste alors à lancer PHP et Nginx :
    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 !
    ozilrit, 23 Janvier 2008
    #1
  2. Offline
    Tifox ou pas
    Encore un truc intéressant qu'il faudra tester.

    ozilrit, tu bosses dans le domaine pour en connaitre autant sur le sujet ?
    Tifox, 24 Janvier 2008
    #2
  3. Offline
    ozilrit Touriste
    Oui, j'apprend de mes aînés. =]
    ozilrit, 24 Janvier 2008
    #3
  4. Offline
    Ahava Revenant
    très interessant :)
    Ahava, 24 Janvier 2008
    #4
  5. Offline
    ozilrit Touriste
    Merci ! =]
    ozilrit, 24 Janvier 2008
    #5
  6. Offline
    Ahava Revenant
    Ca y est, mon serveur tourne avec nginx dessus :-D
    Ahava, 22 Février 2008
    #6
  7. Offline
    ozilrit Touriste
    nginx sert WordPress.com (n°49 Alexa) depuis quelques jours. =]
    ozilrit, 16 Avril 2008
    #7
  8. Offline
    AssiuM Fan
    AssiuM, 29 Avril 2008
    #8
Statut de la discussion:
Fermée.