10

Debian : installer un serveur web hyper performant LNHM (Nginx, HHVM, MariaDB)

Cet article décrit les étapes d’installation pour bénéficier d’un serveur web sous Debian hyper performant basé sur LNHM : Linux Nginx HHVM et MariaDB !

wordpress-hhvm-nginx

Avec ce type de serveur web, on est très très loin de l’ultra classique serveur LAMP… Cependant, ce n’est pas pour autant plus compliqué ! :-D

Juste un petit mot sur HHVM

HHVM est une machine virtuelle open source conçue pour exécuter des programmes écrits en PHP et en Hack (langage proche du PHP utilisé sur la quasi-totalité du site de Facebook). HHVM utilise un compilateur just-in-time (JIT) pour atteindre des performances supérieures, tout en conservant la souplesse de développement que fournit PHP.

Attention, HHVM ne remplace par entièrement le moteur PHP ! Pour WordPress, HHVM est entièrement compatible, donc aucun soucis. Par contre pour les autres plate-formes de CMS, je n’ai aucune idée pour la compatibilité.

Pré-requis pour un VPS fraîchement installé

Pour rappel, toutes les commandes décrites dans l’article sont exécutées en tant que root.

  • Installations de quelques outils :
  • apt update && apt install unzip nano htop
  • Mise à l’heure du système :
  • dpkg-reconfigure tzdata

Nginx et HHVM

  • Ajout des dépôts pour Nginx 1.9 et HHVM :
  • echo deb http://nginx.org/packages/mainline/debian/ jessie nginx | tee /etc/apt/sources.list.d/nginx.list
    echo deb http://dl.hhvm.com/debian jessie main | tee /etc/apt/sources.list.d/hhvm.list
    
  • Récupération des clés :
  • cd /tmp/ 
    wget -O - http://nginx.org/keys/nginx_signing.key | apt-key add -
    wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | apt-key add -
    
  • Mise à jour des dépôts et installation de Nginx et HHVM :
  • apt update && apt install -y nginx hhvm
  • Activation de HHVM pour SystemD :
  • systemctl enable hhvm
  • Mon fichier /etc/nginx/hhvm.conf :
  • location ~ \.(hh|php)$ {
        fastcgi_keep_conn on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    
  • Configuration de Nginx :
  • nano /etc/nginx/nginx.conf
    worker_processes  4;##Indiquer le nombre de thread cpu que dispose le serveur
    

    Création du block serveur pour site1

    rm /etc/nginx/conf.d/default.conf
    nano /etc/nginx/conf.d/site1.conf
    

    Le block serveur :

    server {
    listen 80;
    server_name domaine.tld;
    root /var/www/site1;
    index index.php index.html;
    
    access_log /var/log/nginx/default-access_log;
    error_log /var/log/nginx/default-error_log;
    
    location / {
    try_files $uri $uri/ /index.php?$args;
    }
    include /etc/nginx/hhvm.conf;
    }
    
  • Relance de Nginx :
  • systemctl restart nginx
  • Normalement, à ce stade le serveur web est opérationnel et disponible via son url : http://domaine.tld/
  • Vérification de la prise en charge du php :
  • Création d’un fichier info.php à la racine du serveur web :

    touch /var/www/site1/info.php
    cat "<?php phpinfo(); ?>" > info.php
    

    Test de l’url :
    hhvm-info

MariaDB

  • Installation du serveur MariaDB :
  • apt install mariadb-server
  • Sécurisation de MariaDB :
  • mysql_secure_installation
  • Création de la base de donnée pour WordPress :
  • mysql -u root -p
    create database wordpressdb;
    create user wpuser@localhost identified by 'mdpuser';
    grant all privileges on wordpressdb.* to wpuser@localhost identified by 'mdpuser';
    flush privileges;
    exit;
    

WordPress

  • Installation de la dernière version de Worpress :
  • cd /var/www/site1/
    wget wordpress.org/latest.zip
    unzip latest.zip
    mv wordpress/* .
    rm -rf wordpress/
    rm latest.zip
    
  • Changement des droits pour l’utilisateur www-data :
  • find . -type d -exec chown www-data:www-data {} \;
    find . -type f -exec chown www-data:www-data {} \;
    
  • Configuration du fichier config.php :
  • mv wp-config-sample.php wp-config.php
    nano wp-config.php
    DB_NAME = wordpressdb
    DB_USER = wpuser
    DB_PASSWORD = mdpuser
    
  • Relance de Nginx :
  • systemctl restart nginx
  • A ce stade, il est possible de lancer l’installation de WordPress :
  • hhvm-wordpress

    Sauf que je ne vais pas plus loin, car je vais configurer Nginx pour que l’accès à la partie admin soit en HTTPS !

    Nginx : HTTPS pour wp-admin

  • Création du certificat ssl : voir l’article OpenSSL
  • Configuration Nginx :
  • Voici le block serveur avec la partie en https :

    server {
    listen 80;
    server_name domaine.tld;
    root /var/www/site1;
    
    index index.php index.html;
    
    access_log /var/log/nginx/default-access_log;
    error_log /var/log/nginx/default-error_log;
    
    location / {
    try_files $uri $uri/ /index.php?$args;
    }
    
    location ~ /wp-(admin|login) {
          return 301 https://$host$request_uri;
        }
    
    include /etc/nginx/hhvm.conf;
    }
    
    server {
    listen 443 ssl;
    server_name domaine.tld;
    access_log    access-blog-wp.log main;
    error_log     error-blog-wp.log error;
    
    ssl                   on;
    ssl_certificate       /etc/nginx/ssl/cert.crt;
    ssl_certificate_key   /etc/nginx/ssl/cert.key;
    
    root /var/www/site1;
    index index.php;
    include /etc/nginx/hhvm.conf;
    
    location ~ /wp-(admin|login) {
                    auth_basic            "Acces DENIED!";
                    auth_basic_user_file  /home/fred/htpasswd;
      }
    
    location / {
        return 301 http://$host$request_uri;
      }
    }
    
  • Relance de Nginx :
  • systemctl restart nginx
  • l’url http://domaine.tld/wp-admin/ se redirige automatiquement en https://domaine.tld/wp-admin/ :
  • nginx-hhtps-01

    L’installation continu en connexion chiffrée :-)

Comparaison entre HHVM et PHP-FPM

Un petit benchmark entre HHVM et PHP-FPM avec l’outil wrk :

  • HHVM :
  • root@vps-02:/var/www/vps-02# wrk -t12 -c400 -d30s http://vps-02.memo-linux.com/
    Running 30s test @ http://vps-02.memo-linux.com/
      12 threads and 400 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     1.50s   218.69ms   1.80s    85.57%
        Req/Sec    57.60     66.29   272.00     83.33%
      7630 requests in 30.05s, 69.24MB read
    Requests/sec:    253.88
    Transfer/sec:      2.30MB
    
  • PHP-FPM :
  • root@vps-01:/opt/wrk# wrk -t12 -c400 -d30s https://memo-linux.com:8080/
    Running 30s test @ https://memo-linux.com:8080/
      12 threads and 400 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     1.13s   508.92ms   1.98s    56.44%
        Req/Sec     9.36      8.26    70.00     73.75%
      1684 requests in 30.05s, 693.71KB read
      Socket errors: connect 0, read 0, write 0, timeout 1583
      Non-2xx or 3xx responses: 7
    Requests/sec:     56.04
    Transfer/sec:     23.08KB
    

    Bon, je crois qu’il n’y a pas photo ! :mrgreen:

Ressources

https://www.howtoforge.com/tutorial/install-wordpress-nginx-mariadb-hhvm-debian-8/
https://www.abyssproject.net/2015/04/installation-de-nginx-hhvm-et-mariadb-sur-debian-8/
Et merci à Seboss666, qui m’a donné envie de tester HHVM avec son article.

Partager l'article :





fred

"Dire que l'on s'en fiche du droit à la vie privée sous prétexte qu'on a rien à cacher, c'est comme déclarer que l'on se fiche du droit à la liberté d'expression sous prétexte qu'on a rien à dire." Edward Snowden

10 commentaires

  1. Salut et merci à toi pour cet article que j’ai relayé ;) juste une question, pourquoi mariadb ?

  2. Salut et merci pour le partage :-)
    MariaDB est le fork libre de MySql…

  3. Je ne suis pas encore passé à php7 mais ouai, dès que je peux je ferais un test comparatif :-)

  4. touch /var/www/site1/info.php

    bloqué sur cette commande.
    touch: cannot touch ‘/var/www/site1/info.php’: No such file or directory

  5. @pascal piot il faut créer les répertoires www et site1 avec la commande mkdir
    cd /var
    mkdir www
    cd www
    mkdir site1

  6. Pour voir le nombre de « cpu » pour nginx (c’est le nombre de thread en fait :
    cat /proc/cpuinfo | grep processor | wc -l
    Attention il manque un ; à la fin de la déclaration de votre serveur :
    server_name domaine.tld ;
    Merci pour le tuto ça marche nickel :-)

  7. merci pour la petite coquille et le complément d’informations :-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *