Mascotte de Publicitem, agence de communication et publicité

PublicitemOui, publie si t’aimes !Téléphone pictogramme Conseil gratuit

Apache 2.4 et nginx avec les modules rpaf et remoteip

Portrait de Françoise Lindon
15
09
2015

Sur un serveur dédié tournant sous Ubuntu Server 14.04 LTS nous avons installé NGNIX en reverse-proxy devant un Apache. Rencontrant un problème avec un module de Drupal, nous avons poussé notre investigation à tester tout bonnement la configuration du serveur.

Ce fichier PHP est sensé nous retourner l’adresse IP du visiteur :

  1. <?php
  2. echo $_SERVER['REMOTE_ADDR'];
  3. ?>

Et bien ça nous affichait l’IP du serveur dédié. Dans ces conditions là, nous comprenions mieux l’existence du bug dans Drupal qui n’y était pour rien comme nous le supputions.
J'ai donc rajouté trois petites lignes dans le fichier suivant :

  1. proxy_set_header Host $host;
  2. proxy_set_header X-Real-IP $remote_addr;
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Ce qui donne :
cat /usr/local/vesta/data/templates/web/nginx/default.tpl

  1. server {
  2.     listen      %ip%:%proxy_port%;
  3.     server_name %domain_idn% %alias_idn%;
  4.     error_log  /var/log/%web_system%/domains/%domain%.error.log error;
  5.  
  6.     location / {
  7.             proxy_set_header Host $host;
  8.             proxy_set_header X-Real-IP $remote_addr;
  9.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10.  
  11.         proxy_pass      http://%ip%:%web_port%;
  12.  
  13.         location ~* ^.+\.(%proxy_extentions%)$ {
  14.             root           %docroot%;
  15.             access_log     /var/log/%web_system%/domains/%domain%.log combined;
  16.             access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
  17.             expires        max;
  18.             try_files      $uri @fallback;
  19.         }
  20.     }
  21.  
  22.     location /error/ {
  23.         alias   %home%/%user%/web/%domain%/document_errors/;
  24.     }
  25.  
  26.     location @fallback {
  27.         proxy_pass      http://%ip%:%web_port%;
  28.     }
  29.  
  30.     location ~ /\.ht    {return 404;}
  31.     location ~ /\.svn/  {return 404;}
  32.     location ~ /\.git/  {return 404;}
  33.     location ~ /\.hg/   {return 404;}
  34.     location ~ /\.bzr/  {return 404;}
  35.  
  36.     include %home%/%user%/conf/web/nginx.%domain%.conf*;
  37. }

cat /usr/local/vesta/data/templates/web/nginx/default.stpl

  1. server {
  2.     listen      %ip%:%proxy_ssl_port%;
  3.     server_name %domain_idn% %alias_idn%;
  4.     ssl         on;
  5.     ssl_certificate      %ssl_pem%;
  6.     ssl_certificate_key  %ssl_key%;
  7.     error_log  /var/log/%web_system%/domains/%domain%.error.log error;
  8.  
  9.     location / {
  10.  
  11.             proxy_set_header Host $host;
  12.             proxy_set_header X-Real-IP $remote_addr;
  13.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14.  
  15.         proxy_pass      https://%ip%:%web_ssl_port%;
  16.  
  17.         location ~* ^.+\.(%proxy_extentions%)$ {
  18.             root           %sdocroot%;
  19.             access_log     /var/log/%web_system%/domains/%domain%.log combined;
  20.             access_log     /var/log/%web_system%/domains/%domain%.bytes bytes;
  21.             expires        max;
  22.             try_files      $uri @fallback;
  23.         }
  24.     }
  25.  
  26.     location /error/ {
  27.         alias   %home%/%user%/web/%domain%/document_errors/;
  28.     }
  29.  
  30.     location @fallback {
  31.         proxy_pass      https://%ip%:%web_ssl_port%;
  32.     }
  33.  
  34.     location ~ /\.ht    {return 404;}
  35.     location ~ /\.svn/  {return 404;}
  36.     location ~ /\.git/  {return 404;}
  37.     location ~ /\.hg/   {return 404;}
  38.     location ~ /\.bzr/  {return 404;}
  39.  
  40.     include %home%/%user%/conf/web/snginx.%domain%.conf*;

J’ai activé le template « default » dans mon admin Vesta, et j’ai reconstruit les droits en sélectionnant « Récréer web » pour tous mes utilisateurs de sorte que le template s’applique à tous les sites en fonction.
cat /etc/apache2/mods-enabled/rpaf.conf

  1. <ifmodule rpaf_module>
  2.     RPAFenable On
  3.  
  4.     # When enabled, take the incoming X-Host header and
  5.     # update the virtualhost settings accordingly:
  6.     RPAFsethostname On
  7.  
  8.     # Define which IP's are your frontend proxies that sends
  9.     # the correct X-Forwarded-For headers:
  10. RPAFproxy_ips 127.0.0.1 ::1 ADRESSEIPDUSERVEUR
  11.  
  12.     # Change the header name to parse from the default
  13.     # X-Forwarded-For to something of your choice:
  14. #   RPAFheader X-Real-IP
  15. </ifmodule>

Redémarrons Apache et Nginx :
service apache2 restart
service nginx restart

L’adresse IP ne change pas avec notre script du début, c'est toujours celle du serveur.
Finalement, je suis tombée sur ce billet tout récent sur Apache 2.4 avec les modules rpaf et remoteip
Tout ce que j’ai eu à faire, c’est appliquer la solution 2, c’est à dire installer et activer le module remoteip et modifier le fichier /etc/apache2/mods-available/remoteip.conf comme suit :

  1. <ifmodule remoteip_module>
  2. #  RemoteIPHeader X-Forwarded-For
  3.   RemoteIPHeader X-Real-IP
  4.   RemoteIPInternalProxy ADRESSEIPDUSERVEUR
  5. </ifmodule>

Il suffit de relancer Apache et constater que les logs d’accès au serveur affichent l’IP du visiteur, tout comme notre script php du début du billet affiche également cette même IP. Problème résolu !

Catégorie : 

Soumis par Françoise Lindon le mar, 15/09/2015 - 03:49

Commentaires
Portrait de S. Levy
Soumis par S. Levy (non vérifié) le

Merci sur ce retour de configuration de serveur dédié, je n'ai pas eu ce problème avec Drupal mais on ne sait jamais!

Ajouter un commentaire