Migration Drupal d'Apache vers Nginx

Qu'est-ce que Nginx?

Nginx est un logiciel qui allie serveur web et reverse-proxy écrit par Igor Sysoev, dont le développement a débuté en 2002 pour les besoins d'un site à très fort trafic.

Le point fort d'Nginx est d'être un serveur asynchrone par opposition aux serveurs synchrones où chaque requête est traitée par un processus dédié. Chaque requête est découpé en plusieurs tâches et permet de réaliser un multiplexage très efficace. Cette architecture permet des performances très élevées, ainsi qu'une empreinte mémoire particulièrement faible comparativement aux serveurs HTTP classiques, tels qu'Apache.

Installation et configuration d'Nginx

Nous partons du principe qu'une installation Drupal fonctionnelle a déjà été réalisé. Si ce n'est pas le cas, reportez-vous à l'article d'installation de Drupal. Installation facile de Drupal

# Tout d'abord le téléchargement des paquets nécessaires
apt-get install nginx php5 php5-fpm php5-apc
# Ensuite ouvrez le fichier de configuration FastCGI Process Manager PHP
nano /etc/php5/fpm/pool.d/www.conf
# Commentez l'écoute sur le port 9000 et créez une socket à la place
;listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
# Configurez la socket du manager
nano /etc/nginx/conf.d/php5-fpm.conf
upstream php5-fpm-sock { server unix:/var/run/php5-fpm.sock; } 
# Ensuite modifiez la configuration d'APC pour PHP afin d'allouer 100Mo
nano /etc/php5/fpm/conf.d/apc.ini
extension=apc.so
apc.shm_size=100
# Redémarrez le manager
/etc/init.d/php5-fpm restart

Maintenant il reste à éditer le fichier de configuration de votre site. Malheureusement, Apache étant complètement différent, c'est un tout nouveau type de configuration qu'il vous faudra créer. Cependant, un utilitaire permet de convertir une configuration Apache vers Nginx. Conversion Apache vers Nginx

nano /etc/nginx/sites-available/monsite
server {
    # Nom de domaine
    server_name .monsite.fr;
    # Racine du site
    root /var/www/drupal;
    # Logs
    access_log /var/log/nginx/monsite.fr.access.log;
    error_log /var/log/nginx/monsite.fr.error.log;
    # Desactive le log sur le favicon
    location = /favicon.ico { log_not_found off; access_log off; }
    # Desactive le log sur le robots.txt
    location = /robots.txt { allow all; log_not_found off; access_log off; }
    # Desactive le log sur le sitemap.xml
    location = /sitemap.xml { allow all; log_not_found off; access_log off; }
    # Page d'index du site
    index index.html index.htm index.php;
    # Pas de PHP pour le contenu static
    location / { try_files $uri $uri/ @rewrites; }
    # Clean URLs
    location @rewrites { rewrite ^ /index.php last; }
    # Cache d'Image
    location ~ ^/sites/.*/files/imagecache/ { try_files $uri @rewrite; }
    # Cache d'ImageStyle
    location ~ ^/sites/.*/files/styles/ { try_files $uri @rewrite; }
    # Contenu static comme les images
    location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
        expires max;
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    }
    # Protège les fichiers privées
    location ~ ^/sites/.*/private/ { return 403; }
    # Evite les pages PHP
    location ~ \..*/.*\.php$ { return 403; }
    # Bloque l'acces aux fichiers cachées
    location ~ /\. { access_log off; log_not_found off; deny all; }
    # Scripts PHP
    location ~ \.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        try_files $uri =404;
        fastcgi_index index.php;
        fastcgi_pass php5-fpm-sock;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params; 
    }
}

Activez votre configuration, puis redémarrez votre nouveau serveur Nginx.

ln -s /etc/nginx/sites-available/monsite
/etc/nginx/sites-enabled/monsite /etc/init.d/nginx restart

Voilà, votre migration est terminée.