Mise en place d'un reverse proxy Nginx sur Debian 7

Installation d'un reverse proxy Nginx sur Debian 7 et mise en place d'une redirection vers un serveur frontal et un serveur back-office.

Publié le 28/12/2014

Ce exemple vise à mettre en place un reverse proxy qui redirigera les requêtes /admin vers le serveur web bo-srv et les requêtes / vers les serveurs frontaux.

On dispose des VMs suivantes :

- front-srv : 192.168.0.49

- bo-srv : 192.168.0.46

- rp-srv : 192.168.0.47

Le serveur rp-srv aura besoin de résoudre les noms d'hôtes des serveurs web, il faudra pour cela renseigner leurs correspondances dans le fichier /etc/hosts où avoir recours à un résolveur DNS (Installation et paramétrage d'un résolveur DNS avec Bind 9 sur Debian 7).

1 - Paramétrage d'Apache sur le frontal et le bo

Edition du fichier de configuration de ports pour spécifier le port 8080 pour les serveurs apache de front-srv et bo-srv :

nano /etc/apache2/ports.conf Listen 8080

Redémarrage d'Apache :

service apache2 restart

Paramétrage des vhost :

- Sur bo-srv :

nano /etc/apache2/sites-available/bo-srv


<VirtualHost *:8080>
        ServerName bo-srv
        ServerAdmin admin@domain.tld

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

 

- Sur front-srv :

nano /etc/apache2/sites-available/front-srv


<VirtualHost *:8080t>
        ServerName front-srv
        ServerAdmin admin@domain.tld

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined


 

2 - Installation et paramétrage d'Nginx sur rp-srv

Installation des packets :

apt-get install nginx

Edition de la configuration :

nano /etc/nginx/nginx.conf


user www-data;
worker_processes  2;

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;
    server_names_hash_bucket_size 64;
    sendfile        on;
    tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    gzip  on;
    gzip_comp_level   5;
    gzip_http_version 1.0;
    gzip_min_length   0;
    gzip_types        text/plain text/html text/css image/x-icon  application/x-javascript;
    gzip_vary         on;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

 

Edition de proxy.conf :

nano /etc/nginx/conf.d/proxy.conf


proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size   16k;
proxy_buffers       32   16k;
proxy_busy_buffers_size 64k;

 

Edition de la configuration du site default :

nano /etc/nginx/sites-enabled/default


server {
        listen   80;
        server_name  webapp.local;
        access_log  /var/log/webapp.access.log;
        error_log  /var/log/webapp.nginx_error.log debug;
        location / {
                proxy_pass         http://front-srv:8080/;
        }
	location /admin {
                proxy_pass         http://bo-srv:8080/admin;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}

 

Redémarrage d'Nginx :

service nginx restart

3 - Test

 

On va pourvoir tester dans le navigateur d'une machine cliente en appelant l'url de l'hôte virtuel du reverse proxy nginx :

 

http://webapp.local

 

Ne pas oublier de résoudre la FQDN par le fichier host où un résolveur DNS.