Image de couverture de l'article Kit de survie : Symfony2 et Nginx

Parce que chez Wanadev, nous aimons apprendre toujours plus et proposer des applications web toujours plus rapides, nous vous proposons aujourd'hui le serveur web « à la mode », Nginx.

Après avoir rédigé un article sur comment installer un projet Symfony2 sur IIS, retour aux sources avec une distribution open source.

L'installation est relativement simple. Dans mes recherches, je n'ai pas eu de souci à trouver de la documentation, mais aucun post sur la marche à suivre pour mettre en place un projet Symfony2 avec Nginx en front et PHP-FPM comme Engine.

Pourquoi Nginx et PHP-FPM plutôt qu'Apache

Apache2 reste encore aujourd'hui le serveur web le plus populaire. Facile à installer et à utiliser, il est la solution privilégiée et parfois l'unique solution pour les jeunes développeurs ou pour les amateurs de développement. Il suffit de regarder les statistiques d'utilisation des serveurs pour voir la suprématie d'Apache (60.4%) loin devant Nginx (2ème avec à peine 21%). Malgré ces chiffres, on peut également trouver d'autres statistiques visant à prouver que la tendance va en s'inversant. open-source-guide.com a récemment publié un article dans lequel il nous indique que Nginx se place désormais en pole position des serveurs les plus utilisées quand l'on regarde les 10000 sites ayant le plus fort trafic.

Pourquoi Apache est une solution tout embarquée ?

Apache est simple à installer et contrairement à Nginx il possède un avantage, il embarque l'intégralité des programmes dont il a besoin. De cette manière, lorsqu'on installe Apache, on dispose immédiatement d'un serveur front qui délivre les ressources, mais également d'un engine qui exécutent les scripts. Cela est plus simple à utiliser mais cela représente d'énormes inconvénients.

Pourquoi Nginx est mieux, plus stable et plus rapide qu'Apache ?

La force de Nginx est sa capacité à déléguer. Contrairement à Apache, Nginx ne sait faire qu’une seule chose, délivrer du contenu. Ce premier point le rend plus stable car Nginx reçoit les requêtes et déporte les traitements quand il y en a, et renvoie la ressource.

Nginx possède un autre avantage. Il n'est pas lié à PHP comme l'est Apache. Un avantage qui permet d’exécuter des scripts multi-languages très facilement. Cela nous rend complètement libre d'utiliser les technologies que l'on souhaite pour générer nos scripts. De base, PHP-FPM est utilisé, mais dans certains cas, on pourrait utiliser HHVM pour exécuter nos scripts car il est plus rapide.

Le fait que les tâches soient séparées permet d'optimiser facilement les requêtes et d’augmenter la stabilité.

Dernier intérêt, si l'engine (back) venait à tomber lors d'une attaque ou tout simplement pour une erreur interne, tant que Nginx est up, le service est en mesure de répondre une page d'erreur. Avec Apache, cela est impossible. Nous aurions alors une page blanche.

Bien, et si on voyait maintenant comment on fait pour installer tout ça ? :P

Installation de Nginx et de PHP-FPM

L'installation que nous vous proposons a été testée et éprouvée sur une Debian.

apt-get install php5 php5-fpm nginx

Cette commande permet d'installer le « kernel » PHP5, le front Nginx et le moteur PHP5-FPM.

Ici, nous n'avons pas installé les extensions PHP nécessaires à Symfony (comme php5-intl, php5-pdo par exemple). Nous vous laissons le loisir de les installer via apt-get, aptitude ou synaptic.

Configurer Nginx

Nous allons maintenant mettre en place le front. Si vous lisez cet article, vous connaissez sûrement le Web Server Apache. Dans notre cas, nous nous passons complètement d'Apache pour utiliser Nginx. C'est donc ce dernier qui va écouter sur le port 80 qui correspond au port par défaut du protocol HTTP.

Rien de bien compliqué pour utiliser notre web server, nous allons créer un Virtual Host.

  1. Dans le cas où vous utilisiez Apache, éteignez-le.
    service apache2 stop
    Puis démarrez Nginx
    service nginx start
  2. On commence par créer un fichier pour le vhost
    touch /etc/nginx/sites-available/monVhost.conf
  3. On édite le fichier
    nano /etc/nginx/sites-available/monVhost.conf
  4. On copie ces quelques lignes en faisant attention de bien compléter les informations nécessaires. Ces informations sont valables pour un projet Symfony2 mais vous n'auriez aucun souci à modifier cette configuration pour faire fonctionner ce VHost avec un autre type de projet.
    server {
        server_name monVhost;
        root /path/to/project/web;
    
        location / {
            try_files $uri @rewriteapp;
        }
    
        location @rewriteapp {
            # Ici on réécrit toutes les URL de telle sorte qu'elles pointent vers 
            # le fichier app.php
            # Dans mon cas, mon installation était pour un environnement de 
            # développement, j'ai donc remplacer app.php par app_dev.php
            rewrite ^(.*)$ /app.php/$1 last;
        }
    
        location ~ ^/(app|app_dev|config)\.php(/|$) {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTPS off;
        }
    
        # N'oubliez de modifier ici aussi
        error_log /var/log/nginx/monVhost_error.log;
        access_log /var/log/nginx/monVhost_access.log;
    }
  5. On active le vhost créé pour que Nginx le prenne en compte, de la même manière qu'avec Apache.
    ln -s /etc/nginx/sites-available/monVhost.conf /etc/nginx/sites-enabled/monVhost.conf
  6. On redémarre Nginx et tout est bon pour la configuration de celui-ci :)
    service nginx restart

Configurer PHP5-FPM

Maintenant que notre serveur front est prêt, il ne nous reste plus qu'à configurer FPM.

De base, FPM est déjà configuré et prêt à fonctionner. Vous pouvez l’utiliser de deux manières.

  • En utilisant le port 9000 que FPM prend par défault
  • Ou en utilisant la socket (initialement dans /var/run/php5-fpm.sock)

Personnellement, je vous conseille d'utiliser la socket de la même manière que nous l'avons fait à la création du VHost. Aujourd'hui cela ne change pas énormément mais à l'avenir, si vous mettez en place sur le même serveur d'autres engines comme Hip-Hop VM, vous verez la nuance. Cela fera office d'un autre article.

Autre précaution

Vous allez devoir faire attention à quelques petits éléments pour éviter quelques erreurs :)

N'oubliez pas que le VHost que vous allez utiliser pour accéder à votre projet Symfony2 aura besoin d'être enregistré dans /etc/hosts.

nano /etc/hosts
# et ajouter cette ligne
127.0.0.1 monVhost

 

Commentaires

Il n'y a actuellement aucun commentaire. Soyez le premier !