Beaucoup de sites Web basés sur PHP utilisent Nginx pour faire tourner PHP-fpm par exemple. Comme de plus on rajoute souvent un accélérateur Varnish dans la pile des composants, on se retrouve avec un Nginx qui gère la connexion des clients Web sur les ports 80 et 443 et le même Nginx qui gère le lien avec PHP-fpm sur le port 8080 par exemple. On peut découper la configuration du serveur Nginx en 2 voire 3 parties distinctes :
- la partie port 80, qui gère le lien avec les navigateurs et les redirigent vers le port 443 (SSL)
- la partie port 443, qui fait office de proxy SSL
- la partie port 8080, qui fait office de proxy pour PHP-fpm
Ici on va s’intéresser en particulier au deux premières parties qui gèrent la connexion avec les Internautes, car on va pouvoir y intégrer des règles qui permettent d’ajouter une authentification ou une page de maintenance. L’authentification est typiquement utilisée pour les sites de préproduction ou de recette et la page de maintenance est utilisée pour les mises en production ou lors d’incidents de production.
Port 80
La configuration sur le port 80 a pour seul objectif de renvoyer l’Internaute vers une connexion sécurisée SSL sur le port 443. Ca ne doit pas être une généralité, car pour des sites qui ne gèrent pas de login, il n’y a aucun intérêt à faire du SSL, même si Google souhaite le contraire. On s’aperçoit que forcer le SSL de manière généralisée, quelque soient les contenus, consomme de la CPU et détruit les ressources de la planète.
Néanmoins, voici une configuration de serveur Nginx pour forcer le SSL !
1 2 3 4 5 6 7 8 9 10 |
server { listen 80 default_server; listen [::]:80 default_server; # prend tous les noms de serveurs server_name _; # reecriture en HTTPS rewrite ^(.*) https://$host$1 permanent; } |
Port 443
La configuration du port 443 a pour objectif de présenter le certificat SSL et de faire le proxy vers l’application. C’est donc à ce niveau, qu’on peut faire des filtres en fonction des noms DNS, des URLs, des IP des clients, etc…
Une configuration simple du proxy qui renverrait tout le trafic entrant vers un Varnish sur le port 6081 aurait cette syntaxe :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
server { listen 443 ssl; listen [::]:443 ssl; # le nom ou les noms DNS gérés dans le certificat server_name mon_serveur; # le certificat SSL ssl_certificate /etc/letsencrypt/live/mon_serveur/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mon_serveur/privkey.pem; access_log /var/log/nginx/proxy-ssl-access.log; error_log /var/log/nginx/proxy-ssl-error.log; location / { proxy_pass http://127.0.0.1:6081; include /etc/nginx/proxy_params; } } |
Authentification pour un environnement de recette
Une fois que Nginx est configuré comme proxy SSL, il est assez simple d’ajouter une authentification pour tout un site.
Voici un exemple de configuration :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 443 ssl; listen [::]:443 ssl; # le nom ou les noms DNS gérés dans le certificat server_name mon_serveur; # le certificat SSL ssl_certificate /etc/letsencrypt/live/mon_serveur/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mon_serveur/privkey.pem; access_log /var/log/nginx/proxy-ssl-access.log; error_log /var/log/nginx/proxy-ssl-error.log; # Protection de toutes les pages auth_basic "Restricted access"; auth_basic_user_file /etc/nginx/htpassword; location / { proxy_pass http://127.0.0.1:6081; include /etc/nginx/proxy_params; } } |