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.
- Créer l’utilisateur sous lequel nginx s’exécutera.
sudo useradd nginx -s /bin/false
- 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…