
Faire un reverse proxy avec NGINX et Apache HTTPD en quelques minutes et avec support HTTPS.
Sous Centos 7, Apache HTTPD ne bénéficie toujours pas de mod_http2
. Or ce protocole sorti depuis quelques années maintenant permet de grandement améliorer les performances web. Nginx proposant ce support, monter une architecture toute simple avec nginx en front et Apache HTTPD en back est une solution qu’énormément de webmasters ont choisi.
Installer nginx et Apache httpd
yum install nginx httpd
systemctl stop httpd # si vous l'aviez déjà installé
systemctl start nginx
Par défaut vous ne devriez rien avoir à configurer, nginx se lance sur le port 80.

Désactiver mod_ssl sur Apache httpd
Si jamais vous aviez déjà un serveur web Apache HTTPD, il se pourrait que votre conf SSL soit activée. Si jamais il faut la désactiver pour éviter des conflits sur le port 443 qu’nginx va utiliser.
mv -v /etc/httpd/conf.d/ssl.conf{,.disabled}
Faire écouter Apache httpd sur le port 8080
On change le port par défaut d’écoute du serveur web httpd de 80 vers 8080.
Listen 8080
Pour trouver toutes les lignes de conf avec Listen
, utilisez cette commande. Il faut éviter que NGINX et Apache HTTPD écoute sur le même port.
grep -rni 'Listen' /etc/httpd/
Pensez à redémarrer httpd.
systemctl restart httpd
Dans l’idée, voici qui écoute sur quel port :
- 80 : nginx
- 8080 : httpd (apache)
- 443 : nginx
Reverse proxy nginx vers Apache httpd
Httpd écoute désormais sur le port 8080, nginx sur le port 80. La ligne suivante permet de faire un proxy entre le port 80 et le port 8080.
location / {
proxy_pass http://localhost:8080;
}
Voici ma configuration SSL entièrement chargée.
vim /etc/nginx/conf.d/site-1.conf
On utilise simplement proxy_pass
. J’ai généré un certificat SSL gratuit avec Let’s Encrypt pour avoir le HTTPS.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name site-1.com;
ssl_certificate "/etc/letsencrypt/live/site-1.com/cert.pem";
ssl_certificate_key "/etc/letsencrypt/live/site-1.com/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://localhost:8080;
}
}
Ceci est juste un exemple très basique de ce que l’on peut faire avec le reverse proxy NGINX. La documentation permet de configurer un peu plus le pont entre nginx et httpd notamment grace à proxy_set_header
.
Tester que la configuration reverse proxy est correcte
Dans les entêtes de la réponse http sur /
(voir capture d’écran tout en haut). En bas à droite on peut voir qu’nginx sert la requête :
server: nginx/1.12.2
Si jamais vous avez du mal à voir les infos, peut-être que le pont entre le port 80/443 -> 8080
n’est pas bon. Sur votre serveur, vous pouvez tenter de débogguer avec une simplement commande CURL.
curl http://localhost:8080 &> /dev/stdout
Si jamais vous souhaitez voir quel processus écoute sur quel port :
netstat -tulp
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN 10034/nginx: master
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 909/mysqld
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN 10034/nginx: master
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 668/sshd
tcp6 0 0 [::]:https [::]:* LISTEN 10034/nginx: master
tcp6 0 0 [::]:http [::]:* LISTEN 10034/nginx: master
tcp6 0 0 [::]:webcache [::]:* LISTEN 9697/httpd
tcp6 0 0 [::]:ssh [::]:* LISTEN 668/sshd