Nginx

nginx

Installer NGINX sous Windows 10

NGINX est le second serveur web qui propulse les sites en PHP. Il se veut plus rapide qu’Apache, mais il est surtout fait pour servir du contenu statique. Cependant, sa conception le rend intéressant pour installer plusieurs version de PHP en simultané. Notez que Apache est également capable de le faire, mais ce petit tuto est là pour vous montrer une façon de faire sous Windows.

Téléchargez NGINX

Pour ce faire allez sur le site officiel sur cette page de et suivez les instructions (téléchargez la mainline). Nous prenons ici le parti de tout faire et de ne pas installer un équivalent de WAMP pour NGINX.

Décompressez l’exécutable où vous voulez, démarrer le serveur équivaut à démarrer un programme quelconque (NGINX ne tourne pas comme un service Windows, c’est écrit sur la page). Une fois que vous avez démarré l’exécutable, prenez connaissance de ces quelques commandes :

nginx -s stop 	fast shutdown
nginx -s quit 	graceful shutdown
nginx -s reload 	changing configuration, starting new worker processes with a new configuration, graceful shutdown of old worker processes
nginx -s reopen 	re-opening log files

Notez que ces commandes n’ont pas l’air de marcher sous Windows 10, ça ne marche que si vous êtes dans le même répertoire que l’exécutable nginx.exe. Cependant voici la commande qui tuera pour sûr les process partout :

taskkill /f /IM nginx.exe

Télécharger le zip PHP

Sur le site officiel, dans la section windows, Télécharger un package PHP 7.4, choisissez le thread safe 64bits si vous êtes sous Windows 10 (je suppose qu’en 2020, vous êtes dans ce cas)

Décompressez le zip dans un répertoire c:\PHP\7.4

constituez un fichier .bat pour lancer le fichier C:\PHP\7.4\php-cgi.exe, s’assurer que cet exécutable est dans le même répertoire que le php.exe.

@ECHO OFF
ECHO Starting PHP FastCGI...
set PATH=C:\PHP;%PATH%
rem c:\bin\RunHiddenConsole.exe 
C:\PHP\7.4\php-cgi.exe -b 127.0.0.1:9123

De même si vous voulez arrêter le process de Fast CGI voici la commande :

taskkill /f /IM php-cgi.exe

Ensuite dans le fichier de configuration de NGINX nginx.conf dans la section server, ajoutez la ligne include fast-cgi.conf :

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9123;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
            include fastcgi.conf;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

Si vous n’avez pas cette ligne vous aurez un message « No input file specified ».

Démarrer le serveur NGINX avec le PHP Fast CGI

Démarrez le fichier batch, ensuite démarrez NGINX, allez dans le dossier c:\nginx\html (créez un fichier index.php), dans le navigateur allez à http://localhost, votre page doit normalement s’afficher. Prochain article nous verrson comment affecter une version de PHP par virtual host.

Connaitre les variables de configuration du cache de Nginx

Je passe un peu en revue les directives utilisées dans le fichier de configuration du cache.

Nginx utilisé en reverse proxy sans le caching des pages ne rime à rien. On l’utilise pour servir du contenu statique afin d’accélérer grandement le temps de téléchargement, et croyez moi il est plutôt performant !

Un serveur proxy se met entre l’internaute et le serveur Apache par exemple (mais ça peut être n’importe quel serveur).

 

 

Directive Signification
proxy_cache définit une zone mémoire partagée pour stocker le cache
proxy_cache_bypass
proxy_cache_key  une valeur de type string, utilisée pour classer les parties du cache
proxy_cache_lock  si plusieurs requêtes demandent une page non cachée, la première crée le contenu caché avant que les autres puissent lire le cache évitant à toutes les requêtes de demander du contenu dynamique
proxy_cache_lock_timeout
proxy_cache_min_uses  nombre de fois qu’un contenu demandé avant d’être caché
proxy_cache_path  répertoire ou sera placé le contenu caché, on y place les clé (qui identifie les pages cachées) et le métadonnées
proxy_cache_use_stale  définit le cas de figure où l’on sert du contenu caché lorsque l’appel au serveur du backend (Apache) donne une erreur
proxy_cache_valid durée du vie du cache (la page web doit retourner 200,301 ou 301), ici cela veut dire que les page retournant un code cité ci-dessus sera caché, les pages 404 par exemple ne sont pas cachée

Installation de Nginx en front end Apache en backend

Aujourd’hui le moteur de recherche Google veut faire de la vitesse de chargement d’un site web un critère de ranking dans les SERPs.

Ce n’est pas idiot, et de toute façon, sans même parler de moteur de recherche, il est important d’avoir un site web qui va vite.

Dans le domaine du e-commerce par exemple, il ne faut pas que la vitesse de chargement dépasse 4 secondes.(les puriste disent 2), mais on va dire 3 (coupons la poire en deux) c’est ok.

Le problème est quand le site de e-commerce devient grand, quand il y a beaucoup de gens qui visitent le site (forcément vous avez un site qui marche sinon), et de même il n’y a pas que des humains qui vous rendent visite il y a aussi les spiders !

Entre Google bot qui passe toutes les minutes ou toutes les 10 secondes, les bots de majesticSEO ou de Ahrefs, archive.org etc, votre Apache hé bien il est surchargé.

Vous aurez beau optimiser les facteurs suivants : compression GZIP, mise en place d’un cache, utilisation de serveur de médias, de CDN, de minification des scripts, de mise en place de javascript à la fin, ces solution ont une limite à la fin, cela ne suffira pas.

La solution ultime c’est NGINX !

C’est quoi Nginx? c’est un serveur web comme Apache, écrit par un Russe, il est plutôt peu gourmand en ressource, et il est rapide pour servir des fichiers statique. Statique? vous dites Cache? hé bien c’est pas loin !

Le secret ici est de servir tout ce qui est statique par NGINX et ce qui est dynamique par Apache.

Nginx est dans ce cas ce qu’on appelle un reverse proxy, ou serveur frontal. Définition sur cette page.

Donc avec Nginx on peut faire ces 5 choses :

  1. servir du contenu statique
  2. intermédiaire de sécurité
  3. terminal SSL
  4. répartition de charge (load balancing)
  5. compression de site

Nous allons donc dans les lignes qui suivent, installer Nginx sur un serveur dédié qui tourne déjà avec le serveur web Apache, ils seront donc sur la même machine.

 

Installation de Nginx en ligne de commande (Linux Debian)

Là je suppose que vous avez des connaissance en shell, c’est très simple, il faut installer Nginx avec la commande suivante :

$ apt-get install nginx

il faut que vous vous loggiez en root pour faire marcher cette commande.

Une fois que Nginx est installé, il y a déjà un fichier de configuration example. Sauvegardez ce fichier sur votre ordinateur pour le réutiliser si besoin, mais on n’aura pas besoin, cependant renommez ce fichier au nom de votre site web. J’utilise Winscp pour manipuler de manière sécurisée les fichiers depuis mon ordinateur en effet le faire en ligne de commande est assez fastidieux.

Configuration d’un fichier serveur Nginx

Le fichier de configuration de site web de Nginx doit être installé dans le répertoire (pour les Debian) , comme pour Apache 2, dans sites-available et sites-enabled.

« Available » veut disponible et « enable » veut dire activé. En fait si vous avez un fichier dans « enabled », ça veut dire que le site est en ligne.

Le fichier dans sites-enabled est un lien symbolique vers le fichier de configuration du répertoire site-available.

Nginx en ce qui concerne les webmasters a deux fonctions bien distinctes, soit vous l’utilisez pour remplacer Apache (ce dernier est donc à virer) soit vous l’utiliser comme reverse proxy (thème de cet article), donc il fonctionnera parallèlement à Apache !

Notion fondamentale : Si Nginx et Apache fonctionnement en même temps, pour éviter tout conflit, Apache qui écoute habituellement sur le port 80 doit changer de port, on le mettre sur le port 8080, et Nginx sur le port 80, ce qui suppose une modification du fichier de configuration d’Apache comme on le verra plus tard dans cet article.

Imaginons que je veuille proxier phpninja.fr

server {

  listen   80; ## listen for ipv4

  server_name  phpninja.fr www.phpninja.fr;
  access_log  /var/log/nginx/localhost.access.log;

  location / {
    root   /home/phpninja.fr/public_html/;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php;
  }


  # proxy the PHP scripts to Apache listening on 127.0.0.1:8080
  #
  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://88.191.158.109:8080;
  }



  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  #
  location ~ /\.ht {
    deny  all;
  }
}

Listen 80 : on dit à nginx d'écouter sur le port 80

Server name : on donne les sites à proxier

Un fichier de log est spécifié, utile quand vous voulez débugger.

Dans Location /, vous lui dites où se trouve la racine du site web, le fichier index, et try files sert à dire à Nginx de proxier toutes les requêtes, si Nginx ne peut pas, alors il va passer le requête à Apache.

Location ~ \.php$  est trè_s important, il dit qu’il faut passer les fichier php à Apache. Comme dit plus haut Nginx ne vient pas avec le support de php, donc il est logique que ce soit Apache qui le fasse.

 

Proxy pass indique l’adresse IP du serveur auquel les requêtes sont passée (adresse IP de votre virtual host Apache).

 

Enfin location ~ /\.ht sert à éviter tout conflit dans l’interprétation du fichier type htaccess, ht_password etc dans le cas ou Nginx et Apache en ont.

Modification de la partie Apache

Il faut maintenant qu’Apache écoute sur le port 8080, c’est la seule modification que vous aurez à faire. Dans le cas de Debian, il faut modifier le fichier ports.conf comme suit:

Listen 88.191.158.109:8080
Listen 443

Il faut aussi modifier NameVirtualHost

NameVirtualHost 88.191.158.109:8080

Faire la manip sur tous les fichiers Vhost même si vous ne voulez pas les proxier. Dans tous les cas il faut le faire car Apache doit écouter sur 8080 au lieu de 80, sinon le démarrage de Nginx sera problématique.

ensuite il faut installer le module rpaf.

Il sert à envoyer à Apache l’IP du navigateur et non celui de Nginx, sinon vous perdrez cette information.

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 213.246.45.34

spécifier l’adresse publique du proxy.

Conclusion

Redémarrer Apache et Nginx avec les commandes :

service apache2 restart
service nginx restart

Si tout se passe bien, vous allez voir une accélération de votre site ! Et encore on n’a pas encore fait les optimisations de Nginx !

Pour vous amuser, vous pouvez mettre un fichier info.php avec l’instruction phpinfo().

Dans la page qui s’affichera, vous verrez la signature de Apache.

Par contre si vous avez Firebug, ou Httpfox, vous verrez la réponse du serveur le nom Nginx.

Retour en haut