*New 11.3 series Release:
2019-10-05: XigmaNAS 11.3.0.4.6928 - released, 11.2 series are soon unsupported!

*New 12.0 series Release:
2019-10-05: XigmaNAS 12.0.0.4.6928 - released!

*New 11.2 series Release:
2019-09-23: XigmaNAS 11.2.0.4.6881 - released!

We really need "Your" help on XigmaNAS https://translations.launchpad.net/xigmanas translations. Please help today!

Producing and hosting XigmaNAS costs money. Please consider donating for our project so that we can continue to offer you the best.
We need your support! eg: PAYPAL

[TUTO] Reverse Proxy avec Nginx

Moderators: mtiburs, velivole18, ernie

Locked
laster13
PowerUser
PowerUser
Posts: 996
Joined: 01 Jun 2013 19:15
Location: France-Marseille
Status: Offline

[TUTO] Reverse Proxy avec Nginx

#1

Post by laster13 » 05 Sep 2015 18:35

Lorsque l’on héberge plusieurs services web sur un serveur, il est parfois difficile de se souvenir des différentes url. Surtout lorsque ceux-ci utilisent des ports différents comme plex, couchpotato, sickbeard, webmin et d’autres. En tant qu’administrateur de votre serveur domestique, cela pose surement moins de soucis pour vous que pour votre entourage utilisant vos services. Pour leur simplifier la vie, il est tout à fait possible d’utiliser un reverse proxy, ou proxy inverse pour traduire de simples requêtes vers un sous domaine classique, et les rediriger vers le service web adéquat. Vous aimeriez accéder à votre service de médiathèque via l’url http://plex.domain.tld ? Vous aimeriez passer outre certains bloquages de ports lorsque vous vous connectez via un réseau mobile ou un hotspot wifi ?

Jusqu'à présent pour accéder à Plex depuis internet, il me fallait, soit avec un service de DNS genre no-ip ou un nom de domaine, taper :
Avec le reverse proxy de Nginx cela donne :
http://domain.tld/web
ou
plex.domain.tld
Si vous avez besoin d'aide, merci de poster sur le [Topic unique] Reverse Proxy avec Nginx !!

Testé dans les conditions suivantes: ASRock E350M1/USB3 x64-embedded sur AMD E-350 Processor, 8GO DDR3, 2 x 2To - ZFS entrelacés, Nas4free Embedded (10.1.0.2 - Prescience (revision 1731) + TheBrig (Alcatraz)


Au préalable, configurer le fichier de zone de votre registrar

Code: Select all

Sous-domaine 	 	 	       Type 	 	                    Adresse IP / Nom d'hôte

@                              A                               X.X.X.X
rutorrent  	 	 	         CNAME 	 		                domaine.tld
plex                           CNAME                           domaine.tld
L'enregistrement A sert à pointer votre nom de domaine vers votre IP Publique
L'enregistrrement CNAME sert à créer des sous domaines qui permettront ensuite d'obtenir des adresses type http://plex.domain.ltd

Pourquoi Nginx ?

Ce choix se traduit par des performances très élevées, mais également par une charge et une consommation de mémoire particulièrement faibles comparativement aux serveurs HTTP classiques, tels qu'Apache.

Installation Nginx

Le but est de vous donner une trame générique pour vos installations futures (Owncloud, Wallabag, Wordpress, Cops, etc..) ainsi que la marche à suivre pour créer vous même vos Vhosts, Proxy reverse ainsi que les clés pour le https

Pour commencer, installer TheBrig en vous aidant de ce tuto
[TUTO] TheBrig-Comment créer une Jail

L'installation de Nginx a déjà été abordée sur ce forum ici et , j'irai donc assez vite sur le déroulé des commandes

Code: Select all

jexec 1 csh
portsnap fetch extract
echo "BATCH=yes" >> /etc/make.conf
cd /usr/ports/lang/php56
make install clean
cd /usr/ports/lang/php56-extensions
make config
Sélectionner les options ci dessous
CURL GD GETTEX MBSTRING MCRYPT MYSQL OPENSSL PDO PDO-MYSQL ZLIB
Cette liste d'options n'est pas exhaustive. Selon les applis vous pourriez être amené à la compléter. Cela dit elle suffit largement pour un grand nombre de services

Code: Select all

make install clean
Installation packages

Code: Select all

pkg install nginx mysql56-server php56-openssl
Configuration Mysql, nginx et php-fpm

On configure le démarrage automatique des différents services :

Code: Select all

echo 'php_fpm_enable="YES"' >> /etc/rc.conf
echo 'mysql_enable="YES"' >> /etc/rc.conf
echo 'nginx_enable="YES"' >> /etc/rc.conf
Création du mot de passe Mysql

Code: Select all

service mysql-server start
mysql_secure_installation
Suivre le lien ci dessous pour le mot de passe Mysql
viewtopic.php?f=35&t=9334&p=57630#p57630

Procédure pour créer une base de donnée sans installer phpMyAdmin. Si vous souhaitez par exemple créer une base de donnée pour Owncloud

Code: Select all

mysql -u root -p
CREATE DATABASE owncloud;
GRANT ALL PRIVILEGES ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'un_mot_de_passe_mysql';
FLUSH PRIVILEGES;
exit;
Configuration de php-fpm

Code: Select all

cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
ee /usr/local/etc/php.ini
Trouvez la ligne suivante, dé-commenter la et mettre la valeur 0
cgi.fix_pathinfo=0
trouver les lignes suivantes, décommenter et remplacer par les bonnes valeurs
expose_php = Off
file_uploads = On
post_max_size = 10M
upload_max_filesize = 10M
date.timezone = Europe/Paris
Ensuite:

Code: Select all

ee /usr/local/etc/php-fpm.conf
Décommenter et remplacer la ligne ci dessous:
listen = 127.0.0.1:9000
par
listen = /var/run/php-fpm.sock
décommenter les lignes ci dessous:
listen.owner = www
listen.group = www
"Echap" et vous sauvegardez. On démarre le service:

Code: Select all

service php-fpm start
Configuration du serveur NGINX

Code: Select all

mkdir /usr/local/etc/nginx/sites-enabled
mkdir /usr/local/etc/nginx/conf.d
mkdir /usr/local/etc/nginx/ssl
mkdir /var/log/nginx
Modification du fichier nginx.conf

Code: Select all

rm /usr/local/etc/nginx/nginx.conf
ee /usr/local/etc/nginx/nginx.conf
Et copier/coller le nouveau fichier de configuration

Code: Select all

user www;
worker_processes auto;
pid /var/run/nginx.pid;

events {
    worker_connections 1024; 
}

http {
    include /usr/local/etc/nginx/mime.types;
    default_type  application/octet-stream;

    access_log /var/log/nginx/access.log combined;
    error_log /var/log/nginx/error.log error;
    
    sendfile on;
    keepalive_timeout 15;
    keepalive_disable msie6;
    keepalive_requests 100;
    tcp_nopush on;
    tcp_nodelay off;
    server_tokens off;
    
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 512;
    gzip_buffers 4 8k;
    gzip_proxied any;
    gzip_vary on;
    gzip_disable "msie6";
    gzip_types
        text/css
        text/javascript
        text/xml
        text/plain
        text/x-component
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/rss+xml
        application/vnd.ms-fontobject
        font/truetype
        font/opentype
        image/svg+xml;

    include /usr/local/etc/nginx/sites-enabled/*.conf;
}
Ouvrir le fichier php

Code: Select all

ee /usr/local/etc/nginx/conf.d/php.conf
Et copier/coller

Code: Select all

location ~ \.php$ {
    fastcgi_index index.php;
    fastcgi_pass unix:/var/run/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /usr/local/etc/nginx/fastcgi_params;
}
Ouvrir le fichier cache

Code: Select all

ee /usr/local/etc/nginx/conf.d/cache.conf
Et copier/coller

Code: Select all

location ~* \.(jpg|jpeg|gif|css|png|js|map|woff|woff2|ttf|svg|eot)$ {
    expires 30d;
    access_log off;
}
Configurer nginx pour du https

Code: Select all

cd /usr/local/etc/nginx/ssl
openssl genrsa -des3 -out secure.key 1024
openssl req -new -key secure.key -out server.csr
openssl rsa -in secure.key -out server.key
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
rm secure.key server.csr

Code: Select all

service nginx restart
VHOST

Nous entrons maintenant dans le vif du sujet à savoir créer des Vhost. Le virtual Host - ou Vhost - permet d'héberger plusieurs sites web ou services web sur un seul et même serveur. La configuration de Vhost avec Nginx reste relativement simple à mettre en place. Pour illustrer ce tuto, nous allons nous appuyer sur un certain nombre de services tel que Plex, Sikrage, Couchpotato, Cops et pourquoi pas un forum.

Exemples de Vhost avec proxy reverse

On va créer un fichier que l'on nommera comme bon vous semble à condition de respecter l'extension ".comf" et on le placera dans "/usr/local/etc/nginx/sites-enabled". Pour l'exemple on va le nommer exemple.conf.

Code: Select all

ee /usr/local/etc/nginx/sites-enabled/exemple.conf
Copier, coller

Code: Select all

server {
    listen 80 default_server;
    listen 443 default_server ssl;
    server_name _;

    charset utf-8;
    index index.html index.php;
    client_max_body_size 10M;

    ssl_certificate /usr/local/etc/nginx/ssl/server.crt;
    ssl_certificate_key /usr/local/etc/nginx/ssl/server.key;

    access_log /var/log/nginx/access.wallabag.log combined;
    error_log /var/log/nginx/error.wallabag.log error;
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html { 
            root /usr/local/www/nginx-dist; 
     }
    
     location = /favicon.ico {
        log_not_found off;
        access_log off;
    }   

    ## début config ##

    ## fin config ##
}
Quelques explications :

Il s'agit là d'un Vhost générique que vous utiliserez systématiquement. On pensera bien sur a ouvrir le port 80 ou 443 selon si l'on veut ou pas utiliser le https. C'est à la suite de ces lignes que nous allons coller les reverse proxy de nos different services.

Pour joindre Plex à l'adresse suivante :
On va coller entre :
## début config ##

## fin config ##
Les lignes suivantes :

Code: Select all

location /web {
         proxy_pass        http://ip_jail:32400;
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    }
Si l'on souhaite joindre Plex en tapant :
On collera alors les lignes suivantes à la fin du fichier après la dernière accolade

Code: Select all

server {
        listen 80;
        server_name plex.domain.ltd;
        location / {
        proxy_pass http://ip_jail:32400/web/;
        include /usr/local/etc/nginx/conf.d/php.conf;
	include /usr/local/etc/nginx/conf.d/cache.conf;
       }
}
Comme vous pouvez le constater, dans les deux cas, cela nous permet de nous affranchir du port et du coup l'adresse web devient tout de suite plus sympathique.

On va prendre un autre exemple avec Couchpotato. Le reverse proxy nécessite une petite modification dans son fichier de configuration. N'oubliez pas de stopper le service avant de modifier le fichier "settings.conf" ainsi :
url_base = /couchpotato
Pour joindre Couchpotato à l'adresse suivante :
[/b]
On va coller entre :
## début config ##

## fin config ##
Les lignes suivantes :

Code: Select all

location /couchpotato {
         proxy_pass        http://ip_jail:5050;
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    }

Si l'on souhaite joindre couchpotato en tapant :
[/b]
On collera alors les lignes suivantes à la fin du fichier après la dernière accolade

Code: Select all

server {
        listen 80;
        server_name couchpotato.domain.ltd;
        location / {
        proxy_pass http://ip_jail:32400/web/;
       }
}
Très important :
Pour créer une adresse avec le sous domaine, il faut au préalable créer un enregistrement CNAME dans le fichier de zone de votre registrar voir début tuto), uniquement pour les adresses du type :
plex.domain.ltd
Même modif à faire pour Sickbeard, Sickrage, Headphones ;)

Exemple avec un forum phpBB3

Par défaut un certain nombre de services s installent dans le dossier "/usr/local/www" sur lequel Nginx va pointer. C'est le cas de wordpress, du forum phpBB3, owncloud...etc. En considérant que notre forum soit stocké dans le dossier "/usr/local/www/forum", on va écrire les lignes suivantes entre :
## début config ##

## fin config ##

Code: Select all

        location ^~ /forum {
	root /usr/local/www/;
	include /usr/local/etc/nginx/conf.d/php.conf;
	include /usr/local/etc/nginx/conf.d/cache.conf;
    }
On pointera alors sur l'adresse suivante :
Pour joindre le forum avec cette adresse :
Il faut rajouter les lignes suivantes à la fin du fichier après la dernière accolade :

Code: Select all

server {
        listen 80;
        server_name forum.domain.ldt;
        location / {
        proxy_pass http://ip_jail/forum/;
       }
}
Pour wordpress :

Code: Select all

location ^~ /wordpress {
        root /usr/local/www;
        try_files $uri $uri/ /index.php?q=$uri&$args;
        include /usr/local/etc/nginx/conf.d/php.conf;
        include /usr/local/etc/nginx/conf.d/cache.conf;
        satisfy any;
        allow all;
    }

Voilà pour terminer, je vous donne l'exemple de mon fichier complet :

Code: Select all

server {
    listen 80 default_server;
    listen 443 default_server ssl;
    server_name _;

    charset utf-8;
    index index.html index.php;
    client_max_body_size 10M;

    ssl_certificate /usr/local/etc/nginx/ssl/server.crt;
    ssl_certificate_key /usr/local/etc/nginx/ssl/server.key;


    access_log /var/log/nginx/access.wallabag.log combined;
    error_log /var/log/nginx/error.wallabag.log error;
    
    error_page 500 502 503 504 /50x.html;
    location = /50x.html { 
            root /usr/local/www/nginx-dist; 
     }
    
     location = /favicon.ico {
        log_not_found off;
        access_log off;
    }   
      
    ## début config ##

       location ^~ /wordpress {
        root /usr/local/www;
        try_files $uri $uri/ /index.php?q=$uri&$args;
        include /usr/local/etc/nginx/conf.d/php.conf;
        include /usr/local/etc/nginx/conf.d/cache.conf;
        satisfy any;
        allow all;
    }

       location /couchpotato {
         proxy_pass        http://192.168.0.101:5050;
         #auth_basic            Restricted Area; # Si vous voulez protéger...
         #auth_basic_user_file  htpasswd; # ... par mot de passe, décommentez
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    }

      
     location /sabnzbd {
        proxy_pass        http://192.168.0.101:8080;
         #auth_basic            Restricted Area; # Si vous voulez protéger...
         #auth_basic_user_file  htpasswd; # ... par mot de passe, décommentez
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    }

   
     location /sickrage {
         proxy_pass        http://192.168.0.101:8081;
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
    }


     location /web {
        proxy_pass        http://192.168.0.102:32400;
         #auth_basic            Restricted Area; # Si vous voulez protéger...
         #auth_basic_user_file  htpasswd; # ... par mot de passe, décommentez
         proxy_redirect    off;
         proxy_set_header  Host             $http_host;
         proxy_set_header  X-Real-IP        $remote_addr;
         proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    }

    
    location ^~ /cops {
	root /usr/local/www/;
	include /usr/local/etc/nginx/conf.d/php.conf;
	include /usr/local/etc/nginx/conf.d/cache.conf;
    }

    location ^~ /forum {
	root /usr/local/www/;
	include /usr/local/etc/nginx/conf.d/php.conf;
	include /usr/local/etc/nginx/conf.d/cache.conf;
    }


    location ^~ /wallabag {
	root /usr/local/www/;
	include /usr/local/etc/nginx/conf.d/php.conf;
	include /usr/local/etc/nginx/conf.d/cache.conf;
    }

    ## Fin config ##

}


server {
        listen 80;
        server_name plex.lastergeek.com;
        location / {
        proxy_pass http://192.168.0.102:32400/web/;
       

       }
}

server {
        listen 80;
        server_name wallabag.lastergeek.com;
        location / {
        proxy_pass http://192.168.0.103/wallabag/;
        

       }
}

server {
        listen 80;
        server_name cops.lastergeek.com;
        location / {
        proxy_pass http://192.168.0.103/cops/;
        

       }
}

server {
        listen 80;
        server_name forum.lastergeek.com;
        location / {
        proxy_pass http://192.168.0.103/forum/;
        

       }
}
Pensez à relancer Nginx après chaque modification du fichier "exemple.conf" pour que les modifications soient prises en compte.

Code: Select all

service nginx restart
Enjoy ;)

Locked

Return to “Tuto”