Créer un serveur web sous Debian Stretch avec Nginx, PHP-FPM et PostgreSQL

Dans cet article je vais décrire la façon dont je crée habituellement mes serveurs web. La configuration qui va suivren'est pas absolument parfaite, mais déjà de qualité tout à fait convenable. J'ai également choisit de présenter la suite logicielle Nginx/PHP-FPM/PostgreSQL car je la trouve extrêmement performante et bien plus simple à utiliser que LAMP ...

Alors prêts à commencer ?

J'ai fait le choix d'utiliser uniquement les paquets issus des dépôts Debian stable, à la fois pour le côté pratique (on ne va pas s'embêter à rajouter des dépôts externes) mais également pour la stabilité, et oui je suis déjà vieux ;-) Il va bien sûr être indispensable d'utiliser le terminal (n'ayez crainte je vais vous guider pas à pas). Je considérerai lors des différentes étapes que vous êtes "root" donc avant de commencer :

su -

Ou si vous avez configuré sudo :

sudo -i


Installation des paquets

Commençons d'abord par mettre à jour la machine :

apt update && apt upgrade -y

Installons maintenant l'ensemble des paquets nécessaires :

apt install nginx php-fpm php-pgsql postgresql

Vous aurez peut-être besoin d'installer des modules PHP supplémentaires, pour cela cherchez les noms des paquets à installer sur le web ou plus simplement cherchez sur les dépôts :

apt search nom_du_module_PHP | more

Pour lister l'ensemble des modules PHP disponibles sur les dépôt :

apt search php- | more

Puis vous n'avez qu'à les installer avec "apt install nom_des_paquets".


Configuration

PHP-FPM

Par défaut PHP-FPM écoute sur un socket unix, mais nous allons préférer le faire écouter sur un port en local. Pour cela il va falloir éditer son fichier de configuration (remplacez vim par nano si vous êtes débutant) :

vim /etc/php/7.0/fpm/pool.d/www.conf

Trouvez la ligne suivante :

listen = /run/php/php7.0-fpm.sock

Modifiez pour qu'elle soit ainsi :

listen = 127.0.0.1:9000

Enregistrez et quittez. (<ctrl>+x puis "y" ou "o" puis <enter> pour nano, et <esc> puis ":x" puis <enter> pour vim)

Redémarrez PHP-FPM:

systemctl restart php7.0-fpm

PostgreSQL

Nous allons créer un utilisateur d'exemple ainsi qu'une base de données sur laquelle il aura tous les droits. Il faut changer d'utilisateur Unix pour faire cette étape :

su - postgres

Puis on crée l'utilisateur et sa base de données :

createuser -P utilisateur
createdb -O utilisateur bdd

Maintenant que PostgreSQL est prêt on peut quitter l'utilisateur postgres en tapant exit ou avec <ctrl>+d.

Nginx

Il maintenant temps de passer aux choses sérieuses en configurant Nginx ! Supprimez le site par défaut :

rm /etc/nginx/site-enabled/default

Créez un dossier include et créez un fichier de configuration pour le php :

mkdir -p /etc/nginx/include/
vim /etc/nginx/include/php

Puis collez ceci dans le fichier "php" et enregistrez :

location ~ \.php$ {
	try_files $uri /index.php =404;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;
}

Pour la configuration TLS renseignez vous sur Letsencrypt et Certbot pour générer vos certificats.

Une fois vos certificats obtenus il vous faudra créer une clé Diffie-Hellman, cette opération est très longue, vous avez largement le temps d'aller prendre un café après avoir lancé la commande :

openssl dhparam -out /etc/nginx/dhparam.pem 4096

Voici maintenant une bonne configuration TLS pour Nginx, créez le fichier

vim /etc/nginx/include/ssl

contenant les lignes suivantes (ajustez avec le bon chemin vers vos certificats) :

ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 80.67.169.12 80.67.169.40 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains" always;

Il ne vous reste qu'à créer les fichiers de configuration correspondants à vos sites web, le premier est un exemple prenant en charge HTTP et HTTPS (en fait redirigeant tout le temps vers HTTPS) et le second prend en charge uniquement HTTP. N'oublier pas d'ajuster les directives "server_name" et "root" en fonction de vos besoins.

vim /etc/nginx/sites-available/mon_premier_site
server {
        listen 80;
        listen [::]:80;
        server_name www.example.org example.org;
        rewrite ^(.*) https://$server_name$request_uri permanent;
}
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name www.example.org example.org;
        root /var/www/mon_premier_site;
        index index.php index.html;
        location ~ /\. {
                deny all;
        }
        include /etc/nginx/include/php;
        include /etc/nginx/include/ssl;
}
server {
        listen 80;
        listen [::]:80;
        server_name www.example.org example.org;
        root /var/www/mon_premier_site;
        index index.php index.html;
        location ~ /\. {
                deny all;
        }
        include /etc/nginx/include/php;
}

Un fois les fichers de configuration enregistrés, il faut faire un lien symbolique :

cd /etc/nginx/sites-enabled/
ln -s ../sites-available/mon_premier_site

Testez la configuration :

nginx -t

S'il n'y a pas d'erreurs, rechargez Nginx :

systemctl reload nginx 

Bravo ! Votre serveur web est maintenant fonctionnel.

Petit bonus

  • Configuration reverse-proxy:
     location / {
         proxy_pass http://machine.local;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Remote-Port $remote_port;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_redirect off;
     }
  • Si vous obtenez une erreur 502 Bad Gateway, c'est sûrement un problème au niveau de PHP-FPM
  • Si vous obtenez une erreur 403 Permission Denied, il faut appliquer les bon droits d'accès à la racine de votre site web.

Commentaires

1. Le mardi 16 avril 2019, 03:51 par blog

Hi my loved one! I want to say that this article is amazing, nice
written and include approximately all important infos.

I would like to peer extra posts like this .

2. Le mardi 23 avril 2019, 23:33 par Rebekah

Aw, this was a very nice post. Taking a few minutes and actual effort to make a very
good article… but what can I say… I hesitate a lot and don't seem to get nearly anything
done.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : https://mablr.org/index.php?trackback/9

Fil des commentaires de ce billet