Configuration de Nginx pour CodeIgniter Labo | 24 January 2011

Cet exemple de configuration du serveur Nginx pour l’hébergement d’un site réalisé avec CodeIgniter part du principe qu’un serveur FastCGI sur le port 9000 de la machine. C’est le port par défaut de PHP-FPM un process manager spécialisé qui a récemment été intégré dans PHP 5.3.3. Les fichiers du site se trouvent dans /var/www/exemple.

Sous Debian, le paquet nginx nous propose un répertoire /etc/nginx/sites-available. On va donc y placer notre fichier de configuration, que l’on appelera ici exemple :

server {
    listen 80;
    server_name example.com;
    access_log /var/log/nginx/exemple.access.log;

    # Mise en place de la compression transparente    
    gzip on;
    gzip_disable "msie6";
    gzip_min_length 1100;
    gzip_types text/xml text/css image/x-icon image/bmp application/atom+xml
                   text/javascript application/x-javascript
                   application/pdf application/postscript
                   application/rtf application/vnd.ms-powerpoint
                   application/msword application/vnd.ms-excel
                   application/vnd.wap.xhtml+xml;

    # On utilise index.php comme index    
    index index.php;

    # Soit le fichier existe, soit le répertoire existe, soit 
    # on laisse faire CodeIgniter 
    try_files $uri $uri/ /index.php$uri;

    # Le contenu static est servi directement.
    # Le navigateur est censé garder ces fichiers 30 jours, ce qui
    # fluidifie la navigation.
    location ~ ^/(css/|images/|js/|favicon\.ico) {
        expires 30d;
        root /var/www/exemple;
    }

    # On confie le traitement d'index.php à PHP FPM
    location ~ ^/index\.php {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(/index\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME /var/www/exemple$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }

    # On empêche l'accès aux fichiers .htaccess fait pour Apache
    location ~ /\.ht {
        deny  all;
    }
}

Reste ensuite à faire un lien symbolique et à recharger Nginx :

# ln -ns ../sites-available/exemple /etc/nginx/sites-enabled
# invoke-rc.d nginx reload

À noter : cet exemple laisse comme accès aux clients uniquement les répertoires css, images, et js. Le seul autre point d’accès est le système de route de CodeIgniter. Aucun autre fichier (PHP ou données) n’est accessible, protégeant ainsi d’accès intempestif.