Nginx

outil 12 déc. 2020

Cet article était censé voir le jour beaucoup plus tôt, mais une flemme importante accompagnée d'une envie d'avancer sur le développement du jeu Beasts of Wanderia m'ont mené à reporter son écriture d'un an ou deux. Le but de cet article est d'expliquer le plus simplement possible ce qu'est Nginx, à quoi cela sert, et comment le configurer.

Mais avant toute chose, c'est quoi Nginx?

Moi la première fois que j'ai dû toucher à un fichier de configuration Nginx

Présentation

Pour résumer ça simplement, Nginx est un serveur front-end. Si ce terme ne vous dit rien, il s'agit en fait d'un concept très simple. Le front-end est ce qui fait directement face à un client souhaitant communiquer avec un site web. Il s'agit du logiciel qui va répondre aux requêtes d'un navigateur pour fournir de l'HTML, du CSS, du javascript, et d'autres médias, dans le cas d'un site web.

Nginx peut donc directement mettre à disposition des pages web statiques via le dossier /var/www de notre machine linux, mais également, et c'est cette partie là qui nous va nous intéresser ici, se comporter comme un reverse proxy, afin d'exposer des services disséminés sur notre réseau privé.

Reverse Proxy

Illustration d'un reverse proxy trouvée sur wikipédia

Un proxy est un serveur permettant d'accéder à un autre serveur inatteignable sur le réseau où l'on se trouve. Au contraire, un reverse proxy est un serveur dont l'entrée est exposée à un réseau, faisant office de plateforme d'échange entre le client, ici à gauche, et le service à interroger, ici à droite, situé sur un autre réseau. Celui-ci récupère la requête HTTP provenant de la gauche, l'enrichit en rajoutant des headers ou en modifiant des données, puis la réémet au service caché. Ce dernier répond ensuite au reverse proxy, qui fait suivre la requête au client, toujours en ayant la possibilité de l'enrichir.

Concrétement?

Ouah, ça en fait des informations intéressantes, il serait peut être temps de s'y mettre? Comment je fais pour exposer mes supers services sur internet?

C'est le grand moment, vous lancez votre site de formation en ligne!

Vous venez d'acheter votre nom de domaine monsite.com, ainsi que monarnaque.com, et vous souhaitez les rendre accessibles depuis internet via deux raspberry pis que vous avez chez vous, au travers de votre box internet. C'est une situation ayant peu de chance de se produire au vu de la quantité de solutions d'hébergement de sites web facilement disponibles aujourd'hui, mais supposons que vous souhaitiez apprendre comment faire.

Dans cet exemple, on va imaginer que vous disposiez:

  • D'un raspberry A, hébergeant le serveur web de monsite.com sur 192.168.1.10:2345
  • D'un raspberry B, hébergeant le serveur web de monarnaque.com sur 192.168.1.11:6789

La répartition en deux raspberry pis étant justifiée par une charge de calcul importante de chacun des sites.

La situation actuelle

Comment faire pour proposer l'accès à ces deux services sur une seule adresse IP, celle de votre box, via le port 443? Le suspens est insoutenable, le titre de l'article n'ayant évidemment aucun lien: nous allons utiliser nginx!

Objectif

La situation visée est la suivante:

Nous allons placer le serveur nginx sur le même raspberry que celui hébergeant monsite.com, c'est à dire celui situé sur l'IP 192.168.1.10.

Nous allons ensuite mettre en place une redirection de port, ou en Anglais, un Port Address Translation, permettant de faire correspondre un port d'entrée de notre box internet, le routeur, à un port d'une machine située sur le réseau local. Dans notre cas, une connexion provenant d'internet sur le port 443 de notre box doit atteindre le raspberry A, sur l'adresse 192.168.1.10, et sur le port 443. Cette opération peut être réalisé sur l'interface disponible à l'adresse 192.168.1.1 chez la plupart des opérateurs internet, à l'exception de Free, qui fournit cette interface à l'adresse 192.168.0.254.

Reste à configurer nginx.

Configuration

La configuration de nginx passe par la création de fichiers textuels correspondant chacun à un nom de domaine que l'on souhaite paramétrer.

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    access_log /var/log/nginx/monsite.com.access.log;

    server_name monsite.com;

    ssl_certificate /etc/letsencrypt/live/monsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monsite.com/privkey.pem;
    include /etc/nginx/snippets/ssl-params.conf;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2345;
        proxy_redirect off;
    }

    client_max_body_size 50m;
}

TBC.

Mots clés

SOARES Lucas

30 ans, développeur C/Go/Kotlin/C++/Java (quel enfer)/Python