linux:hosting:lemp:installation

Installer son Serveur Web : nGinx, PHP-FPM et MariaDB

Nous allons voir comment installer et configurer correctement nGinx, PHP-FPM et MariaDB. Pour cela, nous allons ajouter des sources afin d'obtenir des versions plus à jour de ces différents logiciels Pour les sources de nginx, il faudra remplacer codename par sa distribution (Wheezy, Jessie…)

Tout d'abord, avant de vouloir installer le serveur web nGinx, il faut déjà ajouter une source.

Comme nous le montre ce screen, si l'on utilise les repositories de base de Debian Wheezy, ceux-ci nous installent la version 1.2.2 de nGinx, est qui pire qu'obselete (Actuellement, nous en sommes à la 1.9.2)

C'est pour cela que nous ajoutons des repositories afin d'obtenir une version à jour (Dans notre cas, les repositories du site officiel)

Cela nous évite bon nombres de failles, et nous permet également de profiter de toutes les dernières nouveautés.

Nous préférons les sources nginx.org à dotdeb.org car les versions de Dotdeb sont plus anciennes que celles d'nGinx (En effet, nous utilisons le mainline de nGinx, contrairement au stable de Dotdeb)

Tout d'abord, on commence par ajouter le depot nginx à son Debian

$ echo "deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx" > /etc/apt/sources.list.d/nginx.list

Comme dit précédemment, codename est à remplacer par le nom de son Debian

Ce n'est pas fini, il faut également ajouter la GPG Key à son Debian, sans quoi il nous affichera que la source n'est pas certifiée

$ wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key && rm nginx_signing.key

Et enfin, on effectue un apt-get update pour mettre à jour nos packets disponibles.

Si tout marche bien, voici ce que nous devrions obtenir lorsque l'on fait la commande apt-cache policy nginx

Installé : (aucun)
Candidat : 1.9.1-1~bpo8+1

Si tout se passe comme il faut, on peut lancer l'installation avec la commande apt-get -y install nginx nginx-extras nginx-doc

Voici les options de compilations du paquet nginx

--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--with-http_ssl_module
--with-http_realip_module
--with-http_addition_module
--with-http_sub_module
--with-http_dav_module
--with-http_flv_module
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_random_index_module
--with-http_secure_link_module
--with-http_stub_status_module
--with-http_auth_request_module
--with-mail
--with-mail_ssl_module
--with-file-aio
--with-http_v2_module
--with-ipv6

Désormais, nginx est quasiment prêt à être utilisé, il nous reste plus qu'à le configurer.

Voici ma configuration personnel que j'utilise

user www-data;
worker_processes 4;
pcre_jit on;

pid /var/run/nginx.pid;
events { worker_connections 30000; accept_mutex on; use epoll; }

http {
    include /etc/nginx/mime.types;
    default_type  application/octet-stream;

    aio on;

    charset utf-8;
    client_body_buffer_size  1k;
    client_header_buffer_size 1k;
    client_max_body_size 2M;
    large_client_header_buffers 2 1k;

    include /etc/nginx/conf.d/static/gzip.conf;
    include /etc/nginx/conf.d/static/file_cache.conf;

    error_page 500 502 503 504 /usr/share/nginx/html/50x.html;
    index index.html index.php opcache.php auth.php;

    sendfile on;
    resolver 127.0.0.1 8.8.8.8;
    ignore_invalid_headers on;
    keepalive_timeout 60;
    keepalive_disable msie6;
    keepalive_requests 100000;
    tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;

    output_buffers               1 32k;
    postpone_output              1460;

    more_set_headers 'Server: Jeremy Server';
    more_set_headers 'Contact: wiki[at]jdelgado[dot]fr';

    include /etc/nginx/sites-enabled/*.conf;
}

Évidemment, ce fichier n'est pas à recopier tel quel, mais il y a tout de même certains points importants à conserver :


  • user qui sera l'utilisateur qui exécutera les instances nginx
  • worker_processes qui définira combien d'instances seront exécutées en simultanées (Ce nombre doit correspondre au nombre de coeurs logiques dont dispose votre CPU). Vous pouvez disposez de cette information via la commande nproc.
  • include qui permet d'inclure différents éléments de configuration à votre nginx.conf afin de rendre celui-ci plus clair. Nous pouvons voir dans notre exemple que nos sites se trouvent dans le répertoire sites-enabled et que certains éléments de configuration se trouvent dans le répertoire conf.d/static/
  • server_tokens une valeur très importante, celle-ci doit être mise à off. Cette valeur évite à nginx de montrer des éléments importants tel que son numéro de version. Ces éléments peuvent être utilisés pour exploiter des failles sur nginx
  • ignore_invalid_headers est également une directive assez intéréssante. Si des bots tentent de se connecter avec un header incorrect, nginx leur retourne une erreur 404
  • resolver nous permet de spécifier les DNS qui vont être utilisés dans les logs pour résoudre les différents noms de domaines

La directive more_set_headers permet de ne pas dévoiler son serveur web, et n'est disponible que via le package nginx-extras

Comme vous pouvez le voir, on inclut également différents fichiers, les voici :

##
# File Cache
##
open_file_cache          max=10000 inactive=20s;
open_file_cache_valid    60s;
open_file_cache_min_uses 2;
open_file_cache_errors   on;

###
# GZip Settings
###
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 9;
gzip_disable "msie6";
gzip_min_length 20;
gzip_proxied any;
gzip_types text/plain
           text/css
           text/xml
           text/javascript
           application/json
           application/x-javascript
           application/javascript
           application/xml
           application/xml+rss
gzip_vary on;

Ce fichier est assez important, il permet d'activer la compression gzip, ce qui signifie concrètement un gain de vitesse sur votre site internet.


  • gzip permet d'activer la compression gzip
  • gzip_buffers permet de spécifier le nombre de buffers qui vont être utilisés, ainsi que leur taille
  • gzip_comp_level spécifie l’agressivité de la compression gzip. Attention plus la compression gzip sera forte (9), plus le CPU va être sollicité.
  • gzip_disable permet de désactiver la compression GZip selon l'User-Agent (Par exemple, ici, nous désactivons la compression gzip pour IE4 à IE6)
  • gzip_min_length spécifie quelle est la longueur minimale d'un élément qui doit être “gzippé”. Il dépend du header Content-Length
  • gzip_proxied spécifie les éléments qui doivent être “gzippé” lorsque nginx agit comme reverse-proxy
  • gzip_types est également une autre ligne importante. C'est ici que l'on doit spécifié les MIME-Types des différents éléments qui vont être “gzippés”
  • gzip_vary indique si un ajout va être effectué dans le header si le fichier a été “gzippé”

###
# SSL Settings
###
ssl_protocols              TLSv1.2;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers  on;
ssl_session_cache    shared:SSL:3m; # a 1mb cache can hold about 4000 sessions, so we can hold 40000 sessions
ssl_session_timeout  12h;
add_header Strict-Transport-Security "max-age=15768000;";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer";
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;

Le fichier ssl.conf est à inclure seulement si l'on souhaite du SSL sur ses sites web

Certaines lignes sont importantes tels que ssl_ciphers qui permet de sélectionner quels ciphers seront utilisés pour coder l'échange entre son serveur web, et son client. Cette ligne est extrêmement importante car il y a actuellement de nombreux ciphers utilisés mais qui sont totalement dépassés. ssl_protocols permet lui également de ne pas passés par des protocoles complètement troués. Cependant, il faut faire attention avec ces 2 lignes, car en effet, elles peuvent provoquer des erreurs de sécurité côté navigateur, voir carrément entrainer un refus du navigateur. Nous activons également le tout jeune protocole HSTS (Plus d'informations ici) afin de garantir

Pour avoir une bonne cipher list, et de bons paramètres SSL, je vous recommande d'aller voir le Wiki Mozilla

Je n'ai volontairement pas mis une configuration CSP (Content Security Protocol) car il s'agit d'un protocole délicat à mettre en place, et je vous renvoie vers l'article de préférence

Voici désormais des snippets utiles pour ses différents blocks nginx :

###
# Basic File Protect
###

# Disallow download of hidden files
location ~* (?:^|/)\. {
    deny all;
}

# Disallow download of these extensions
location ~* (?:\.(?:bak|conf.*|sql|fla|psd|ini|log|sh|inc|swp|dist)|~)$ {
    deny all;
}

Ce fichier nous permet d'éviter que des fichiers de configuration ou autres soient accessible par tout le monde. Il s'agit d'un fichier générique qui s'adapte au plus grand nombre de services, évidemment, il se peut que certains fichiers/dossiers ne soient pas protégés, dans ces cas-là, il faut les ajouter manuellement. t

Checker l'autre tuto pour PHP7.1

Pour l'installation de PHP5-FPM, nous allons là aussi ajouter des dépots, mais cette fois-ci, les répots de dotdeb (Lien officiel)

$ echo "deb http://packages.dotdeb.org codename all
$ deb-src http://packages.dotdeb.org codename all" > /etc/apt/sources.list.d/php.list

Encore une fois, il faut remplacer codename par sa distribution (Wheezy, Jessie)…

A l'heure actuelle, PHP7 n'est pas disponible sous Wheezy, il faudra à la place y installer PHP5

Et enfin, on ajoute la PGP Key de Dotdeb afin d'avoir un identifié

$ wget http://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg && rm dotdeb.pgp

Voici ce que l'on doit obtenir après avoir fait un apt-get update avec la commande apt-cache policy php5-fpm

Ce qui est important dans le screen, c'est la ligne concernant la Candidate Version, c'est à dire, la version que va installer apt-get.

Installé : (aucun)
Candidat : 1.9.2-1~wheezy

Evidemment, le numéro de version de PHP5-FPM peut varier si une version plus récente est disponible

Si nous obtenons un résultat plus ou moins équivalent, on peut lancer l'installation

$ apt-get -y install php-common php7.0 php7.0-bz2 php7.0-cli php7.0-common php7.0-curl php7.0-fpm php7.0-gd php7.0-geoip php7.0-gmp php7.0-igbinary php7.0-imagick php7.0-intl php7.0-json php7.0-mbstring php7.0-mcrypt php7.0-memcached php7.0-msgpack php7.0-mysql php7.0-opcache php7.0-readline php7.0-sqlite3 php7.0-xml php7.0-xmlrpc php7.0-zip

Nous allons maintenant passer à la configuration de base de PHP5-FPM, tout se situe dans le répertoire /etc/php5/fpm et ses sous-répertoires

On commence par le fichier php-fpm.conf

Par soucis de convention, nous allons modifier la ligne pid, et déplacer le pid vers /var/run/php5-fpm.pid, si cela est déjà le cas, ne rien toucher à la ligne

Maintenant, nous allons éditer le fichier php.ini

Nous allons désactiver le expose_php (Celui-ci agit comme le server_tokens pour nginx) en éditant la ligne expose_php = On à Off

Il faut également également augmenter la limite de poids des fichiers de base de PHP, étant donner que celle-ci est très faible (2MB)

On edit la valeur upload_max_filesize par le poids que l'on souhaite, par exemple 3G

Nous pouvons également augmenter la valeur max_file_uploads qui par défaut est définie à 20 afin de pouvoir uploader plus de fichiers en simultané, nous allons passer cette valeur à 50

Comme on en a l'habitude désormais, il nous faut ajouter la clé GPG, ainsi que les dépots

Cependant cette fois-ci, la source à ajoutée

$ echo "deb http://mirror6.layerjet.com/mariadb/repo/10.0/debian codename main
deb-src http://mirror6.layerjet.com/mariadb/repo/10.0/debian codename main" > /etc/apt/sources.list.d/mariadb.list

Une fois de plus, il faut remplacer codenanme par sa distribution Debian (Wheezy, Jessie…)

On ajoute la GPG Key, mais cette fois-ci, d'une manière différente, via la commande apt-key Il s'agit de clé provenant de Ubuntu, mais qui sont tout de même compatible avec cette source

$ apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db

Et enfin, on met à jour les paquets disponibles :

$ apt-get update

Et enfin, on vérifie que la Candidate Version est la bonne :

$ apt-cache policy mariadb-server

Voilà le résultat attendu :

Si tout se passe comme il faut, on lance l'installation du serveur SQL

$ apt-get install mariadb-server

Pendant l'installation de MariaDB-Server, vous allez obtenir une fenêtre comme celle-ci :

Cette fenêtre est très importante, elle va vous permettre de définir votre root password pour gérer vos bases de données, il faut utiliser un mot de passe relativement puissant pour qu'il ne puisse pas être découvert ou cracké, sans quoi, tous vos sites sont à nus.

Et on finit par le script made in MariaDB pour sécuriser le tout

$ mysql_secure_installation

  • linux/hosting/lemp/installation.txt
  • Dernière modification: 2020/04/16 20:00
  • (modification externe)