Journal Journal tuto : Plateforme LEMP

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
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  (site web personnel) . É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

      Je trolle dès quand ça parle business, sécurité et sciences sociales

      • [^] # Re: LEMP

        Posté par  (site web personnel) . Évalué à 9.

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

        • [^] # Re: LEMP

          Posté par  (site web personnel) . É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  (site web personnel) . É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  (site web personnel) . É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  (site web personnel) . É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  (site web personnel) . É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 !

Suivre le flux des commentaires

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