Mablr

Internet, Libertés et Vie Privée

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

January 30, 2019 — mablr

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 nomdespaquets".

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. (+x puis "y" ou "o" puis pour nano, et puis ":x" puis 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 +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;
}

Une 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.

Tags: Tutoriels

Convertir un .jsonlz4 en .json

August 10, 2018 — mablr

Cet article est réalisé suite à une petite bêtise que j'ai faite avec mon Firefox. Je m'explique, la compilation d'une version de Firefox étant aujourd'hui assez longue (près d'un quart d'heure pour la dernière version 62 avec mon i7 8gen, un SSD et 16 Go de RAM), j'ai voulu voir ce que cela donne avec la version 1.0, j'ai donc tenté ma chance et sans surprise en moins de 5 minutes c'était déjà fini !

Comme une lettre à la poste ! Pour le petit instant émotion, j'ai voulu démarrer ma version (de 2003 !) frachement compilée sans me douter que cela allait planter mon profil actuel de Firefox. Je lance alors firefox : ./firefox

Tout fonctionne à peu près correctement, en même c'est pas étonnant vu que Firefox respecte les standards du web, le rendu 15 ans après la publication de cette version n'est vraiment pas dégueux. Après avoir fait le tour je referme et j'ouvre la version actuelle de Firefox, et là ... oups mon profil a disparu ! Enfin les données de personnalisation, extensions et favoris se sont barrés car le vieux Firefox a voulu utiliser mon profil actuel or vu le bon de version, ce n'était pas rétrocompatible ! C'est vraiment embêtant de perdre comme ça ses favoris et ses extensions, mais en informatique rien ne s'efface (ou presque ;-P) je ne me suis pas inquiété du tout, et je me suis mis immédiatement à fouiller le dossier contenant mon profil (dans ~/mozilla/firefox/.default/).

Tout de suite, j'ai trouvé des fichiers semblant être des archives de mes favoris avec une extension assez exotique ".jsonlz4". Par pure logique je n'ai déduit que c'était une sorte fichier .json compressé propre à Firefox, il faut conséquent trouver un moyen d'obtenir du json exploitable à importer. Voici ce que donne l'aperçu d'un de ces fichiers : Fichier jsonlz4

Après quelques recherches (Qwant est ton ami), j'ai trouvé un petit outil en C appelé dejonlz4. Il suffit de cloner le dépot : git clone https://github.com/avih/dejsonlz4.git

Compiler : cd dejsonlz4/
gcc -Wall -o dejsonlz4 src/dejsonlz4.c src/lz4.c

Il n'y a plus qu'à tester ! echo $(./dejsonlz4 <favoris-archivés-que-l'on-a-retrouvé>.jsonlz4) >> <favoris>.json cat <favoris>.png

Nous avons maintenant un beau fichier de favoris avec une syntaxe en .json, qu'il suffit d'importer dans Firefox dans les marque-pages, section "Importation et sauvegarde" puis "Restaurer" et enfin "Choisir un fichier". Notez qu'il est possible (avec un peu de chance) que vous puissiez restaurer vos favoris après avoir cliqué sur "Restaurer", les étapes du début vous seront dans ce cas là inutiles.

C'est terminé ! Les marque-pages sont de retour !

Tags: Tutoriels

Faire une clé USB bootable Windows depuis une machine sous GNU/Linux

July 30, 2018 — mablr

Bon l'autre jour, à mon grand désarroi, j'ai été obligé d’installer Windows sur un de mes PC. (Pour déverrouiller le bootloader de mon Xiaomi Redmi Note 5). Pour se faire il m'a fallu créer un support d'installation pour Windows depuis une machine sous GNU/Linux puisque je ne travaille que sous cet OS depuis déjà plusieurs années. J'ai pour cela trouvé un outil extrêmement pratique et simple ...

C'est WoeUSB !

Voici la procédure d'installation depuis la source : il faut d'abord cloner le dépot de WoeUSB. git clone https://github.com/slacka/WoeUSB.git

On génère ensuite le nom de version approprié basé sur les tags Git. cd WoeUSB
./setup-development-environment.bash

Puis on installe les dépendances. Tout en restant dans le répertoire WoeUSB. Pour Debian et ses dérivés, à adapter selon votre gestionnaire de paquet. sudo apt-get install devscripts equivs
mk-build-deps
sudo dpkg -i woeusb-build-deps*.deb

Pour finir on construit le paquet et on l'installe. dpkg-buildpackage -uc -b
sudo dpkg -i ../woeusb*.deb

L'interface graphique de WoeUSB ce lance grace au raccourci qui s'est créé dans les menus lors de l'installation ou avec la commande suivante : woeusbgui Capture d'écran de l'utilitaire WoeUSBGUI

Pour ceux qui préfèrent le terminal : sudo woeusb --device <windows>.iso /dev/sdX

Mission accomplie ! Un utilitaire bien utile à garder sous le coude.

Tags: Tutoriels