Reverse proxy Nginx

Samuel Chevalley
23 mars 2018

Nginx est un serveur http asynchrone, à la différence d’Apache qui créer un processus par connexion, nginx lance une série de workers qui vont chacun être capable de gérer de multiples connexions.
 

Architecture

Architecture simple, un serveur sur le lan et un reverse proxy nginx en frontal pour les appel depuis l’extérieur :

shema_infra_reverse_proxyLe nom dns utilisé sera monsite.com (il pointe donc sur le nginx qui lui fera le routage vers le serveur en interne).


 

Configuration

Conf basique

Dans mon cas, dans /etc/nginx/conf.d/monsite.com.cfg :

upstream backend_monsite {
    server monServeurLan;
}

server {
    listen 80;
    server_name monsite.com;

    access_log /var/log/nginx/monsite_access.log;
    error_log /var/log/nginx/monsite_error.log;

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    location / {
        allow 123.24.24.24;
        allow 155.45.45.45;
        deny all;
        proxy_pass http://backend_monsite;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 30;
        proxy_send_timeout 30;
    }
}

upstream : Permet de définir un ou plusieurs serveurs (dans le cas d’un load balancing) pouvant répondre à la requête.
server :

  • listen 80 : nginx écoute sur le port 80
  • server_name : nom du serveur auquel nginx devra réagir et utiliser la configuration déterminée
  • access_log et error_log : chemin des logs
  • location : permet d’appliquer des directives en fonction de l’url utilisé (le « / » étant la racine)
  • proxy_pass : le nom à indiquer ici est celui du bloc « upstream », les requêtes seront donc redirigé du nginx vers ce upstream défini (le ou les serveurs définis dedans)
  • proxy_set_header : permet d’ajouter un header à la requête qui va être passée au serveur web interne par notre nginx.($host va prendre le nom du serveur interne défini dans le upstream, $proxy_add_x_forwarded_for est l’ip du serveur interne et $scheme le protocole (http ou https))
  • proxy_connect_timeout et proxy_send_timeout : permettent de gérer le temps (en seconde) au delà duquel le serveur web interne sera considéré comme injoignable. Ici, si nginx n’a pas de réponse sous 30 secondes, un message d’erreur sera renvoyé à l’utilisateur.
  • allow et deny : autorise les ip spécifiées et rejette tout le reste

 

Dans le cas d’un serveur en https remplacer « listen 80 » par « listen 443 ssl » et rajouter :

ssl_certificate      /etc/nginx/ssl/www.monsite.com/www-monsite-com.crt;
ssl_certificate_key  /etc/nginx/ssl/www.monsite.com/www-monsite-com.key;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

 

Redirection globale

Si on veut rediriger plusieurs nom de domaine vers un :

server {
    listen 80;

    server_name  www.test1.com www.test2.com www.test3.com;
    return 301 http://www.jeredirigetoutsurtest.com;
}

server {
    listen 80;
  
    server_name www.jeredirigetoutsurtest.com;
...
...
}

 

Redirection spécifique

Par exemple, si on veut rediriger de la racine à un chemin particulier :

if ($request_uri ~ ^/$){
     return 301 https://$server_name/parici/;
}
location /parici {

...

...

}

 

Changer une chaine dans le code source de la page

sub_filter 'text_avant' 'text_après';