Configurer Nginx comme un reverse proxy d’Apache2

Pour quoi Nginx et Apache ensemble ?

Ces deux serveurs sont connus pour être très performants. Mais chacun a un domaine de compétences particuliers: Apache est connu pour son efficacité et Nginx pour la vitesse. Nous ne sommes néanmoins pas obligés de choisir entre l’un ou l’autre, on peut très bien combiner la robustesse d’un Apache sur les sites dynamiques nécessitant d’executer du PHP,  à la rapidité d’un Nginx qui offre des performances hors du comun sur les fichiers statics.

Setup

 pour réaliser ce tutoriels, vous aurez besoin d’avoir les privilèges sudo sur votre serveur virtuel, à vous donc de vous débrouiller pour créer ces privilèges ;)

Installation de Nginx

Pour commencer, nous allons installer Nginx qui sera notre serveur pour le front-end de nos sites. Pour ça rien de compliqué, il suffit de lancer cette commande
sudo apt-get install nginx

Configurer Nginx

Pour commencer à configurer Nginx, c’est au niveau du virtual host que ça se passe. ouvrez votre Vhost ou créez en un pour votre s’il n’existe pas :

sudo vi /etc/nginx/sites-available/example

la configuration suivante suffira à configurer votre vhost comme front-end. Notez la forte similitude par rapport à un vhost Apache :

server {
        listen   80; 

        root /var/www/; 
        index index.php index.html index.htm;

        server_name example.com; 

        location / {
        try_files $uri $uri/ /index.php;
        }

        location ~ \.php$ {
        
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;

         }

         location ~ /\.ht {
                deny all;
        }
}

Quelques explications tout de même :)

  • le root est calé sur /var/www/ qui nous sert donc de répertoire web
  • index.php a été ajouté à la ligne d’index
  • try_files ordonne à nginx de servir toutes les requêtes HTTP qu’il reçoit. S’il n’est pas capable de le faire, alors il sous traite via le proxy pass (c’est là où notre apache va entrer en jeu ;))
  • proxy_pass fournit à Nginx l’adresse du serveur de proxy
  •  “location ~ /\.ht {” interdit l’accès aux fichiers htaccess et .ht* d’apache

cette configuration “reroute” tous les fichiers avec l’extention .php vers notre serveur apache qui doit écouter le port 8080

Une fois ce vhost créée, il faut l’activer sur Nginx :

sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

La prochaine étape pour nous va être l’installation d’Apache

Installation d’Apache

Comme pour Nginx, APT-GET fait le taf :

sudo apt-get install apache2

Comme Nginx n’a pas encore été démarré, alors Apache va démarer sur le port par défaut qui le port 80

Configurer Apache

nous avons besoin qu’Apache prenne le backend, et doit tourner sur le port 8080 pour être conformes à notre configuration d’Nginx.

On va commencer à dire à Apache d’écouter le bon port :

sudo vi /etc/apache2/ports.conf

Il faut trouver les lignes suivantes et les modifier avec les valeurs suivantes :

NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080

Comme vous pouvez le voir, Apache n’écoute que le port 8080 et uniquement en local. Sauvez et fermez.

Ca y’eest la config d’Apache est terminé. Il faut maintenant créer un virtual host pour matcher les informtaions envoyées par Nginx :

sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/example
sudo vi /etc/apache2/sites-available/example

La chose la plus importante à modifier est le port d’écoute.

<VirtualHost 127.0.0.1:8080>

Il faut après changer le chemin vers votre répertoire web si nécessaire. Sauvez et fermez, puis activer le site en question en utilisant la commande courte d’apache “a2ensite”

sudo a2ensite example

Ca y’est, nous avons fini ! ce n’est pas très sorcier hein ;). Bon, avant de tester quoi que ce soit, il faut installer PHP, sinon apache ne va pour voir faire grand chose….

 sudo apt-get install php5

Maintenant, redémarez les deux serveur pour que tous les changements soient pris en compte. Normalement, les status doivent être à OK, sinon, il faut consulter les logs pour voir ce qui ne va pas.

sudo service apache2 restart
sudo service nginx restart

Le test d’Apache et de Nginx ensemble

Nous avons un VPS qui tourne avec Nginx en front end et apache traitant les demande PHP en backend. Si on charge notre site example, il nous aménera à notre page d’accueil qui sera servie par Nginx avec ou sans Apache (en fonction de si elle est en php ou pas).

Pour tester apache, rien de plus simple, il faut créer un fichier php et l’appeller. si les choses ont bien été configurée, Nginx recoit la requete à la “proxy pass” à Apache.

Allons y, créer notre fichier php, pour tester créer un fichier info.php :

sudo vi /var/www/info.php

Et affichons les infos de notre installation php :

<?
phpinfo( );
?>

Sauvez et fermez le fichier.

En visitant la page example/info.php, la page d’information de php devrait s’afficher et vous pourrez y voir le serveur web qui a répondu à la requete. Dans ce cas, on devrait avoir Apache

Pour finir, vous pouvez voir quels ports sont ouverts et quelle application est associée à chaque port en lançant la commande suivante :

sudo netstat -plunt