Journal Journal tuto : Plateforme LEMP

Posté par (page perso) . Licence CC by-sa
10
6
nov.
2013

J'ai galéré quelque temps pour installer une plateforme LEMP sous Debian. Finalement, ce n'est pas si compliqué mais après avoir cherché quelque temps, je vous livre un tuto clé en main.

J'ai fais ce travail sur Debian 7 mais je ne doute pas qu'il fonctionne sur d'autres plateformes.

MariaDB ou MySQL :

MariaDB est le remplaçant de MySQL, 100% libre (GPL) et 100% compatible.
Installer MariaDB sous Linux, c'est très simple : il suffit d'ajouter le dépôt comme indiqué sur le site officiel.

Pour s'y connecter, il faudra simplement faire comme si vous étiez sur MySQL :

mysql -u root -p
MariaDB [(none)]>

Si vous voulez simplement installer le bon vieux MySQL, vous pouvez vous contenter d'un …

apt-get install mysql-server

PHP 5

Il faut simplement installer le paquet php5-fpm.

NGinx

Installer le paquet nginx et démarrer le service (ce n'est pas démarré automatiquement)

service nginx start

Ensuite, il faudra aller dans le site par défaut et dire à Nginx qu'il interprète les scripts PHP :

vim /etc/nginx/sites-available/default

Chercher la ligne

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

Décommenter le paragraphe comme ceci :

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info .+\php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-cgi alone:
#fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

Et redémarrer NGinx :

service nginx restart

Tester le tout

On peut tester NGinx/PHP avec le phpinfo() :
Créer un fichier info.php dans le répertoire /usr/share/nginx/www/

<?php phpinfo(); ?>

Démarrer le navigateur à l'adresse http://localhost/info.php

Pour tester NGinx + PHP + MariaDB il faut soit créer un script PHP qui demande une info dans une base MariaDB (ou MySQL ; c'est exactement pareil), soit installer un CMS tout fait (Drupal, Wordpress, …).

  • # LEMP

    Posté par (page perso) . Évalué à 10.

    LEMP ? LAMP, je connais, ça veut dire GNU/Linux, Apache, MySQL et PHP, mais LEMP ? Que signifie le E ?

    • [^] # Re: LEMP

      Posté par . Évalué à 5.

      Linux - EngineX (Nginx HTTP SERVER) - Mysql - PHP

      • [^] # Re: LEMP

        Posté par (page perso) . Évalué à 9.

        Eh bien c'est tordu. LNMP serait plus compréhensible non ?

        • [^] # Re: LEMP

          Posté par (page perso) . Évalué à 7.

          Oui mais ça devient alors un simple sigle et non plus un acronyme. /o\

          ce commentaire est sous licence cc by 4 et précédentes

          • [^] # Re: LEMP

            Posté par . Évalué à 4.

            Mais lnmp, c'est facilement prononçable non ? (pour un mutant qui possède trois langues dans la bouche. Et le top du top serait qu'il ait 10 doigts par main pour utiliser Emacs).

        • [^] # Re: LEMP

          Posté par . Évalué à 1.

          Tu dis ça parce que t'avais pas trouvé.
          Moi ça m'a fait ça une petite seconde "ça veut rien dire son truc".
          Puis "LEMP comme LAMP mais avec EngineX au lieu de apache, cool !"
          Bref te manquait une fraction de seconde pour comprendre, apprécier et éviter un commentaire négatif.

  • # pool php5-fpm

    Posté par (page perso) . Évalué à 6.

    Un truc de bien, c'est qu'avec php5-fpm on peut facilement lancer des « pool » avec différents utilisateurs propres à un ou plusieurs sites.

    Dans Debian c'est dans /etc/php5/fpm/pool.d/

    Exemple, le pool par défaut :

    sed -e 's/;.*$//;s/^ *$//' /etc/php5/fpm/pool.d/www.conf | grep -v '^$'
    [www]
    user = www-data
    group = www-data
    listen = /var/run/php5-fpm.sock
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    Un brève lecture montre qu'il est très facile de lancer php5-fpm avec un autre utilisateur sur un autre socket, et de tuner d'autres options encore.

    Après dans votre configuration nginx, vous pouvez écrire un fichier qui contient cela (notez le « php5-fpm » après « upstream » :

    upstream php5-fpm {
            server unix:/run/php5-fpm.sock;
    }

    Et ensuite, quand vous configurez un site,

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_pass php5-fpm;

    Et ce pour plusieurs sites. Pas besoin de réécrire le socket, il suffit de réemployer le nom, ça veut dire aussi qu'on peut changer le nom du socket ou passer sur un port réseau, et peut-être même une autre technologique que php5-fpm… sans reconfigurer tous les sites.


    Ainsi on peut imaginer un premier pool

    [www]
    user = www-data
    group = www-data
    listen = /var/run/php5-fpm.sock
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    avec

    upstream php5-fpm {
            server unix:/run/php5-fpm.sock;
    }

    et phpmyadmin, phppgadmin, phpldapadmin, lam, que sais-je encore, qui utilisent :

    fastcgi_pass php5-fpm;

    Puis ensuite on peut imaginer un pool :

    [site1]
    user = www-site1
    group = www-site1
    listen = /var/run/php5-fpm-site1.sock
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    avec

    upstream php5-fpm-site1 {
            server unix:/run/php5-fpm-site1.sock;
    }

    Puis un pool :

    [site2]
    user = www-site2
    group = www-site2
    listen = /var/run/php5-fpm-site2.sock
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    chdir = /

    avec

    upstream php5-fpm-site2 {
            server unix:/run/php5-fpm-site2.sock;
    }

    et un ou des sites utilisent :

    fastcgi_pass php5-fpm-site1;

    tandis qu'encore un autre ou d'autres sites utilisent :

    fastcgi_pass php5-fpm-site2;

    …ne pas oublier de créer les utilisateurs, bien évidemment. ;)

    Personnellement, je crée naïvement dans nginx des petits fichiers nommés upstream-php5-fpm-site1.conf pour chaque pool qui contiennent la déclaration du socket, mais nommés comme précédemment.

    ce commentaire est sous licence cc by 4 et précédentes

    • [^] # Re: pool php5-fpm

      Posté par (page perso) . Évalué à 4.

      Il semble que ce soit plus sécurisé que les suexec, suphp et autre ruid d'apache. Parce qu'avec ces derniers outils précités, on est obligé d'avoir en permanence un Apache2 en root pour pouvoir su-er en utilisateur au moment de faire les requêtes à mod_php (il faut donc que l'apache root aie connaissance des requêtes). Avec des suexec-like on gagne la sécurité d'avoir des sites exécutés sous des utilisateurs différents et donc des hébergés qui ne peuvent pas espionner leurs voisins, mais on prend le risque qu'un exploit sur une vulnérabilité d'Apache donne… les droit root, et pas seulement www-data ! Bref, ça ne protège que des honnêtes gens dans un monde sans faille.

      Si tu as un exploit pour nginx ou php-fpm… tu resteras à priori restreint à ton utilisateur. L'escalade d'un pool vers le master est un peu plus complexe, il me semble (autant que de passer de www-data à root avec un apache sans suexec-like).

      ce commentaire est sous licence cc by 4 et précédentes

      • [^] # Re: pool php5-fpm

        Posté par (page perso) . Évalué à 3.

        on est obligé d'avoir en permanence un Apache2 en root

        Pas avec suexec justement. suexec + mod_fcgid + php-cgi donne à peu près le même résultat en moins propre bien sur car on passe par un binaire setuid. Mais permet par contre de conserver la syntaxe apache et le .htaccess qui sont malheureusement encore trop difficilement contournable quand on veut offrir une solution qui marche out-of-the-box avec a peu près tous les CMS du marché.

        A noter que apache 2.4 introduit mod_proxy_fcgi qui permet d'utiliser php-fpm et apache ce qui semble être une solution plus acceptable si ce n'est l'absence pour l'heure d'un support des socket Unix.

        ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1
        • [^] # Re: pool php5-fpm

          Posté par (page perso) . Évalué à 1.

          oui, si tu fais du apache avec php-cgi ou php-fpm… ça devient kifkif avec nginx. :)

          ce commentaire est sous licence cc by 4 et précédentes

  • # Cela me rappelle qu'il faut sérieusement que j'évalue MariaDB !

    Posté par . Évalué à 3.

    … Ce journal tombe à pic, encore un truc sur ma todo-list qui date de plusieurs mois !

    Enfin, évaluer est un mot un peu grand, plutot verifier que ca marche bien avec mes applications, et roule !

    • [^] # Re: Cela me rappelle qu'il faut sérieusement que j'évalue MariaDB !

      Posté par (page perso) . Évalué à 3.

      Il me semble avoir lu que MariaDB était full-compatible avec MySQL. En tout cas je n'ai jamais eu de soucis avec donc à priori tout devrait bien se passer :) (enfin faut rester méfiant avec les à priori quand même…)

      • [^] # Re: Cela me rappelle qu'il faut sérieusement que j'évalue MariaDB !

        Posté par (page perso) . Évalué à 4.

        Oui MariaDB est annoncé pleinement compatible avec MySQL.
        Perso j'ai déjà fait des migrations sans souci mais bon il peut bien y avoir des cas particuliers qui posent des difficultés.

        MariaDB outre qu'elle soit libre est censée être plus performante mais alors là, je peux pas dire car mes exemples sont des petites structures pas très révélatrices.

        Il avait aussi le plus grand respect de l'humour parce que c'était une des meilleures armes que l'homme eût jamais forgées pour lutter contre lui-même.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.