Reverse proxy Nginx

Introduction

Nous allons voir comment installer une instance de Nginx en version 1.2.3 depuis les source et comment la configurer de manière à en faire un reverse proxy web. Lors de la compilation j’activerai la plupart des fonctionnalités disponibles afin que vous n’ayez pas à recompiler Nginx si vous souhaitiez faire un peu plus que reverse proxy web avec.

Si je vous propose d’installer nginx depuis ses sources, c’est parce que les paquets disponibles sur Debian datent d’un bout de temps et que depuis le projet a beaucoup gagné en fonctionnalités.

Comme d’habitude, ce qui va suivre s’appuie sur une Debian Squeezee.

Récupération des sources et installation des paquets nécessaires

On commence par les paquets :

sudo aptitude install build-essential unzip libpcre3-dev libssl-dev libxslt1-dev libgd2-xpm-dev libgoogle-perftools-dev vim

Puis les sources, pour la compilation de sources je me place habituellement dans /usr/local/src (mais ça n’a rien d’obligatoire) :

cd /usr/local/src

wget http://nginx.org/download/nginx-1.2.3.tar.gz

wget https://github.com/agentzh/headers-more-nginx-module/zipball/master -O agentzh-headers-more-nginx-module-v0.18-1-gbdb1068.zip

wget https://github.com/arut/nginx-rtmp-module/zipball/master -O arut-nginx-rtmp-module-v0.4.0-5-g4a775d6.zip

On décompresse le tout :

tar -xzf nginx-1.2.3.tar.gz

unzip agentzh-headers-more-nginx-module-v0.18-1-gbdb1068.zip

unzip arut-nginx-rtmp-module-v0.4.0-5-g4a775d6.zip

La compilation

Facile :

./configure –with-http_ssl_module –with-http_realip_module –with-http_addition_module –with-http_xslt_module –with-http_image_filter_module –with-http_dav_module –with-http_flv_module –with-http_mp4_module –with-http_gzip_static_module –with-http_random_index_module –with-http_secure_link_module –with-http_degradation_module –with-http_stub_status_module –with-mail –with-mail_ssl_module –with-google_perftools_module –add-module=/usr/local/src/agentzh-headers-more-nginx-module-bdb1068/ –add-module=/usr/local/src/arut-nginx-rtmp-module-4a775d6/ –prefix=/etc/nginx/ –sbin-path=/usr/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx.pid –lock-path=/var/run/nginx.lock –http-client-body-temp-path=/var/cache/nginx/client_temp –http-proxy-temp-path=/var/cache/nginx/proxy_temp –http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp –http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp –http-scgi-temp-path=/var/cache/nginx/scgi_temp –user=nginx –group=nginx

make

sudo make install

Quelques explications s’imposent, voici la signification des différentes options de compilation :

  • –with-http_ssl_module : Permet la prise en charge du protocole http sur SSL.
  • –with-http_realip_module : Permet de redéfinir à la volée l’adresse du client.
  • –with-http_addition_module : Permet l’ajout d’information dans les pages renvoyées au client.
  • –with-http_xslt_module : Permet la transformation des réponses XML en utilisant une ou plusieurs feuilles de styles XSLT.
  • –with-http_image_filter_module : Permet la manipulation des images à la volée sur les formats JPEG, GIF, PNG.
  • –with-http_dav_module : Permet la prise en charge du protocole WebDAV
  • –with-http_flv_module : Permet la publication de fichier FLV.
  • –with-http_mp4_module : Permet la publication de fichier MP4.
  • –with-http_gzip_static_module : Permet l’envoie de fichiers précompressés à la place des originaux.
  • –with-http_secure_link_module : Permet de contrôler la validité du lien demandé par le client.
  • –with-http_stub_status_module : Permet l’obtention d’information sur le statut de nginx via une URL particulière.
  • –with-mail : Permet la prise en charge des protocoles POP3, SMTP, IMAP4.
  • –with-mail_ssl_module : Idem ci-dessus mais sur SSL.
  • –add-module=/opt/agentzh-headers-more-nginx-module-bdb1068/ : Permet la modification des paramètres d’en-tête HTTP à la volée.
  • –add-module=/opt/arut-nginx-rtmp-module-4a775d6/ : Permet la prise en charge du protocole RTMP.
Une fois la compilation terminée et le « make install » effectué il reste quelques petites choses a peaufiner :
  • Créer l’utilisateur sous lequel nginx s’exécutera.

sudo useradd nginx -s /bin/false

Pourquoi « -s /bin/false » ? Simplement parce que cette utilisateur n’a pas besoin d’un shell, et ça peut éviter certaines failles.
  • Créer le répertoire « cache » de nginx.

sudo mkdir -p /var/cache/nginx

  • Créer le script d’initialisation de nginx dans /etc/init.d/nginx.

#! /bin/sh

### BEGIN INIT INFO

# Provides: nginx

# Required-Start: $all

# Required-Stop: $all

# Default-Start: 2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: starts the nginx web server

# Description: starts nginx using start-stop-daemon

### END INIT INFO

 

PATH=/opt/bin:/opt/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DAEMON=/usr/sbin/nginx

NAME=nginx

DESC=nginx

 

test -x $DAEMON || exit 0

# Include nginx defaults if available

if [ -f /etc/default/nginx ] ; then

. /etc/default/nginx

fi

set -e

case « $1″ in

start)

echo -n « Starting $DESC:  »

start-stop-daemon –start –quiet –pidfile /var/run/nginx.pid \

–exec $DAEMON — $DAEMON_OPTS

echo « $NAME. »

;;

stop)

echo -n « Stopping $DESC:  »

start-stop-daemon –stop –quiet –pidfile /var/run/nginx.pid \

–exec $DAEMON

echo « $NAME. »

;;

restart|force-reload)

echo -n « Restarting $DESC:  »

start-stop-daemon –stop –quiet –pidfile \

/var/run/nginx.pid –exec $DAEMON

sleep 1

start-stop-daemon –start –quiet –pidfile \

/var/run/nginx.pid –exec $DAEMON — $DAEMON_OPTS

echo « $NAME. »

;;

reload)

echo -n « Reloading $DESC configuration:  »

start-stop-daemon –stop –signal HUP –quiet –pidfile /var/run/nginx.pid \

–exec $DAEMON

echo « $NAME. »

;;

*)

N=/etc/init.d/$NAME

echo « Usage: $N {start|stop|restart|force-reload} » >&2

exit 1

;;

esac

exit 0

  • Le rendre exécutable.

sudo chmod 755 /etc/init.d/nginx

  • Activer son lancement au démarrage du système.

sudo update-rc.d nginx defaults

La configuration

Je ne traiterai pas de la configuration globale de nginx qui mériterait un article complet, pour ça la documentation disponible sur le site et sur le wiki est plutôt bien faite. Idem pour la génération des certificats SSL.

Ce que je vous propose ici, c’est de voir comment paramétrer nginx comme reverse proxy HTTP pour « site1″ et comme reverse proxy HTTPS pour « site2″, avec une fonction de cache pour les deux.

Le contenu du fichier /etc/nginx/nginx.conf :

user nginx;

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;

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

more_set_headers « Server: web »;

more_clear_headers « X-Powered-By* »;

sendfile on;

client_max_body_size 20m;

keepalive_timeout 65;

tcp_nodelay on;

gzip on;

gzip_disable « MSIE [1-6]\.(?!.*SV1) »;

proxy_cache_path /var/cache/nginx/rev-cache/site1

levels=1

keys_zone=site1:50m

inactive=120h

max_size=1500m;

 

proxy_cache_path /var/cache/nginx/rev-cache/site2

levels=1

keys_zone=site2:50m

inactive=120h

max_size=1500m;

 

include /etc/nginx/conf.d/*.conf;

include /etc/nginx/sites-enabled/*;

}

Le contenu du fichier /etc/nginx/site-available/rev-proxy-site1 :

server {

listen 10.0.0.1:80;

 

server_name www.site1.fr site1.fr;

 

proxy_bind 10.0.0.1;

proxy_cache site1;

proxy_cache_valid 200 1d;

 

location / {

proxy_pass http://IP_du_serveur_interne_site1;

}

 

access_log /var/log/nginx/site1.access.log;

 

}

Le contenu du fichier /etc/nginx/site-available/rev-proxy-site2 :

server {

listen 10.0.0.1:443 ssl;

 

ssl_certificate ssl/site2.crt;

ssl_certificate_key ssl/site2.key;

 

server_name www.site2.fr site2.fr;

 

proxy_bind 10.0.0.1;

proxy_cache site2;

proxy_cache_valid 200 1d;

 

location / {

proxy_pass http://IP_du_serveur_interne_site2;

}

 

access_log /var/log/nginx/site2.access.log;

 

}

Pensez à créer les liens symboliques dans /etc/nginx/site-enabled/ et à relancer nginx pour qu’il prenne en compte les changements de configuration.

Et voilà ! Vous avez un nouveau reverse proxy HTTP-HTTPS tout neuf qui fait office de cache :-)

En plus, avec les différentes fonctionnalités activées lors de la compilation, vous pouvez même aller plus loin avec les protocoles RTMP, SMTP, IMAP, POP, etc…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.


7 − un =

Vous pouvez utiliser les balises HTML suivantes : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>