Aller au contenu

Proxy

Qu'est ce qu'un proxy?

Pour vulgariser, il s'agit d'un intermedaire entre 2 services, ou 2 ordinateurs. Par exemple :

  • Votre ordinateur passe par un proxy : le proxy peut par exemple empécher l'accès à certains sites
  • En vous connectant à un proxy vous pouvez contourner les filtrages (un proxy est un intermédiaire, pensez aux pub de VPN sur youtube)
  • Surveillez les communcations entre plusieurs apareils, et créer des logs en cas d'obligation

Mon VPN est un proxy alors ? Vous vous connectez bien à un intermédaire pour pouvoir accéder à des sites web. Donc selon la définition, oui. Le VPN (Virtual Private Network) est surtout le moyen de vous connecter á un proxy. Par exemple vous pouvez un tunnel VPN avec votre Freebox. Vous pouvez accéder à vos ordinateurs de manière sécuriser. Installez un proxy qui vous donne renvoie le site internet voulu. Voila vous venez de créer un VPN comme dans la pub (sauf que vous pouvez pas changer de pays sauf si vous installer plein de freebox partout) Dans le cas suivant je vais vous montrer comment utiliser un proxy en utilisant nginx Donc maintenant si vous bien compris :

  • Un VPN utilise un proxy.
  • Un proxy est un intermédiaire pouvant surveiller vos communications
  • Donc je dois avoir confiance dans mon fournisseur VPN, car il peut vous surveiller

Mes excuses pour cette petite disgression.

nginx

NGINX Open Source2 ou NGINX (également orthographié Nginx ou nginx) est un logiciel libre de serveur Web (ou HTTP) ainsi qu'un proxy inverse écrit par Igor Sysoev, dont le développement a débuté en 2002 pour les besoins d'un site russe à très fort trafic (Rambler). Source wikipedia

Nginx va servir d'intermediaire entre Gunicorn et Internet.

  • Nginx va gerer les log de connection
  • Nginx peut s'occuper de gerer le https
  • Nginx peut aussi renvoyé les requetes http vers le https. (on parle de reverse proxy)

Installation et Configuration

Sous linux installation par gestionnaire de paquets (apt-get install nginx), image docker Sous windows et mac l installateur se trouve dans la session téléchargement du site nginx.org

La configuration se fait dans le fichier /etc/nginx/nginx.conf Vous pouvez créer plusieurs fichiers pour ne pas tout mettre dans le fichier configuration. Un petit tuto est disponible ici.

Sinon pour faire simple : Pour configurer un service nginx, il faut ajouter un service au fichier nginx.conf, par exemple :

http { # nom du service
    include       mime.types;
    default_type  application/octet-stream;

    # configurer les logs les options du services ...
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server { #configurer le serveur
        listen       872; #port à écouter
        server_name  adresse.votresite; # nom du serveur (utile par exemple pour les certificats)

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        # pour indiquer à Flask qu'il se trouve derriere un proxy
        location / {
            proxy_pass http://localhost:3513;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Prefix /;
        }

        #error_page  404              /404.html; #si vous voulez configurer les pages d'erreurs

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {   
            root   /usr/share/nginx/html;
        }
    }

Pour un site statique, ou les fichiers statiques pour alléger le backend, il vous faut un utilisateur avec les droits d'accès aux fichiers, préciser le chemin web avec location et indiqué diverses options.

user tux;
   server {
        server_name  barrmath.ovh ;
        location / {
                alias /home/tux/piweb2/site/;
                index index.html;
                try_files $uri $uri/ $uri.html =404;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }

Tips

La fonction envsubst peut vous permettre de modifier vos fichier conf dans des containeurs de votre nginx.conf. Il suffit de faire un template.

exemple:

fichier nginx.template

user root;
worker_processes                auto; # it will be determinate automatically by the number of core

error_log                       /var/log/nginx/error.log warn;
#pid                             /var/run/nginx/nginx.pid; # it permit you to use rc-service nginx reload|restart|stop|start

events {
    worker_connections          1024;
}

http {
    include                     /etc/nginx/mime.types;
    default_type                application/octet-stream;
    sendfile                    on;
    access_log                  /var/log/nginx/access.log;
    keepalive_timeout           3000;
    server {
        listen                  80;
        location ${BASE_URL}static/{
            alias /app/benevalibre/var/static/;
            # Optionnel : ne pas journaliser l'accès au fichier statisque
            access_log off;
        }
        location ${BASE_URL}media/ {
            alias /app/benevalibre/var/media;
            # Optionnel : ne pas journaliser l'accès aux media
            access_log off;
        }
        location ${BASE_URL}favicon.ico {
            alias /app/benevalibre/var/static/favicon/favicon.ico;
            # Optionnel : ne pas journaliser l'accès au favicon
            access_log off;
        }
        location ${BASE_URL}{
            proxy_set_header Host ${DOLLAR}http_host;
            proxy_set_header X-Forwarded-For ${DOLLAR}proxy_add_x_forwarded_for;
            proxy_redirect off;
            proxy_pass http://127.0.0.1:8000;
        }
        error_page              500 502 503 504  /50x.html;
        location /50x.html {
              root /var/lib/nginx/html;
        }
    }
}
export DOLLAR="$"
envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf

Tips

Le export dollar="$" permet de garder le $ nécessaire dans les proxy_set_header

Nginx version aéré et routage

C'est bien beau, mais imaginer que vous avez besoin de plusieurs noms de domaines pour héberger plusieurs sites. Votre nginx.conf va devenir assez vite un joli bordel.

Améliorons ça. Le but est de séparer les fichiers des différents sites/app web.

Nginx.conf :

user user;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
        worker_connections  1024;
    }

http {
    include       /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  5000;
    # envoi moins d'information sur le serveur
    server_tokens off;

    # active la compression des pages sauf pour les navigateurs pourris
    gzip  on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_vary on;
    gzip_types  text/plain text/css application/x-javascript;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf; # pour séparer les configurations (Perso j'utilise pas)
    include /etc/nginx/sites-enabled/*; # pour ajouter des sites web
    }

Les fonction include vont inclure tous les fichiers présents dans les répertoires. Par défaut, les nouvelles versions de Nginx incluent aussi un dossier /etc/nginx/sites-available/. Le but est de créer des liens symboliques dans le dossier site enable pour activer ou non les sites internet. Perso je travaille directement avec un fichier dans sites-enabled (et vu ma proportion à travailler en essai erreur, je fais une copie du fichier qui marche enfin dans sites-available)

Bref un exemple de fichier simple :

server {
    server_name pouetpouet;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/pouetpouet/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/pouetouet/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        alias /home/tux/shared/hello/;
        index index.html;
        }
    }

Et vous voyez certbot fait encore 50 % du boulot pour la certification en modifiant les fichiers de nginx. Alors pour info le server_name permet de selectionner les host (adresse http/nom de domaine/sousdomaine). En fonction du nom de domaine entré dans le navigateur, on utilise tel ou tel bloc serveur.

Je pourrais encore plus simplifier le fichier nginx.conf en sortant les configs de base (Gzip,timeout,etc) dans un ou plusieurs fichiers dans /etc/nginx/config Mais on est déjà pas mal.

Alternative

Suite au rachat de Nginx par F5 Network, certaines personnes ont proposé un fork de nginx.

  • freenginx un fork 100% libre de nginx sans entreprise lucrative.
  • angie un fork du créateur original sous tutel de Angie sofware Société russe

Vous pouvez utiliser d'autre service comme Apache httpd ou microsoft ISS

Ressources

nginx

freenginx

angie

Apache httpd

microsoft ISS