Le système d'exploitation GNU-Linux/Le serveur Web Nginx

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


  1. Qu'est-ce qu'un système d'exploitation ?
  2. Unix et Linux
  3. Partitionnement du disque
  4. Installation
    1. Installer Debian via le réseau
  5. Utilisateur Unix, l'interface console
    1. Le login
    2. Commandes de base
    3. L'aide en ligne man
    4. L'éditeur de texte vi
    5. Les shells
    6. La complétion
    7. Les jokers
    8. Les répertoires importants
    9. Redirection des entrées/sorties
    10. Invoquer un programme en tâche de fond
    11. Propriétaires et droits d'accès
    12. Processus
    13. Locale
  6. Administration du système
    1. Configuration du réseau
    2. Les utilisateurs et groupes
    3. Le processus d'initialisation
    4. Les systèmes de fichiers
    5. Le système virtuel /proc
    6. Les périphériques /dev
    7. L'ordonnanceur de travaux cron
    8. Le backup : tar et gzip
    9. ghost avec partimage
    10. sauvegarde de fichiers avec rsync
    11. Les fichiers journaux syslog
    12. Installation de nouveaux logiciels
    13. Le noyau Linux et les modules
    14. Autres commandes utiles
    15. Installation RAID1 logiciel + LVM + XFS
    16. Scripts de surveillance
    17. Réseaux sans fil
  7. Administration des services réseaux
    1. L'outil d'administration Webmin
    2. telnet
    3. Le serveur de noms BIND
    4. Le serveur de configuration réseau DHCP
    5. Le serveur de shell distant SSH
    6. Le partage de fichiers Samba
    7. Le partage de fichiers NFS
    8. Le serveur d'impression CUPS
    9. Le serveur de fichiers FTP
    10. Le serveur Web Apache
    11. Le serveur Web Nginx
    12. La base de données MySQL
    13. La base de données Memcached
    14. La base de données Redis
    15. Le serveur de mails Postfix
    16. Les annuaires LDAP
    17. La supervision Nagios
  8. Sécurisation d'un serveur Linux
    1. Installation d'un service en mode chroot
    2. Protection avec iptables
  9. Médiagraphie
  10. Auteurs

Installation[modifier | modifier le wikicode]

sudo apt-get install nginx

Commandes[modifier | modifier le wikicode]

Relancer le serveur :

 systemctl restart nginx

Activer un vhost :

 ln -s /etc/nginx/sites-available/mon_vhost.conf /etc/nginx/sites-enabled/
 systemctl reload nginx

Voir les logs :

 journalctl -u nginx

vhosts[modifier | modifier le wikicode]

Variables[modifier | modifier le wikicode]

le module ngx_http_core_module offre des variables correspondant à celles d'Apache[1].

  • $host
  • $alias
  • $root
  • $realpath_root
  • $document_root : $root ou $alias de la requête
  • $document_uri
  • $request_uri
  • $fastcgi_script_name

Mots réservés[modifier | modifier le wikicode]

Comme dans Apache, la priorité entre les vhosts est déterminée par l'ordre alphabétique des .conf de /etc/nginx/sites-enables.

Les directives sont[2] :

listen[modifier | modifier le wikicode]

Host et port écoutés par le vhost. Ex :

listen 80;
listen 443 ssl;

server_name[modifier | modifier le wikicode]

URL du vhost.

  • Exemple simple : server_name x.example.com;
  • Pour désigner un nom de serveur invalide (généralement dans le vhost default) : server_name _;
  • Pour du regex, préfixer avec "~". Ex : server_name ~^(x|y|z)\.example\.com$;
    • Le regex permet même les groupes de capture utilisables dans la suite du vhost (ex : $ma_variable) avec la syntaxe suivante[3] : (?<ma_variable>.+)

root[modifier | modifier le wikicode]

Dossier du système de fichier vers lequel redirige l'URL du vhost.

location[modifier | modifier le wikicode]

Bloc paramétrant un chemin donné au sein de l'URL du server_name. Il peut contenir plusieurs autre mots réservés.

include[modifier | modifier le wikicode]
internal[modifier | modifier le wikicode]
deny[modifier | modifier le wikicode]
expires[modifier | modifier le wikicode]
fastcgi_param[modifier | modifier le wikicode]

Définit un des paramètres FastCGI[4].

index[modifier | modifier le wikicode]

Définit l'index à exécuter. Il peut être global ou inclus dans une location. Ex :

index app.php;

return[modifier | modifier le wikicode]

Ex :

return 301 https://$host$request_uri;

rewrite[modifier | modifier le wikicode]

Réécriture d'URL[5]. Ex :

rewrite ^ http://example.com? permanent;

access_log et error_log[modifier | modifier le wikicode]

Optionnel : emplacement des logs d'accès et d'erreur. Par défaut, /var/log/nginx/access.log et error.log.

Exemples[modifier | modifier le wikicode]

server {
    listen 80;
    listen 443 ssl;

    server_name mon_site.localhost;
    root /var/www/mon_site;

    location / {
        try_files $uri /index.html =404;
    }
}

Problèmes connus[modifier | modifier le wikicode]

Logs[modifier | modifier le wikicode]

tail /var/log/nginx/error.log

Flusher le cache des redirections 301[modifier | modifier le wikicode]

Dans les .conf[6] :

proxy_cache_valid any 0m;

Flusher le cache DNS[modifier | modifier le wikicode]

sudo systemd-resolve --flush-caches

closed keepalive connection[modifier | modifier le wikicode]

Ce n'est pas à proprement parlé une erreur, mais une notification normale.

[crit] 6#6: *1 connect() to unix:/var/run/php/php7.1-fpm.sock failed (2: No such file or directory) while connecting to upstream[modifier | modifier le wikicode]

Installer php7.1-fpm ou changer vers fastcgi_pass php7.1-fpm:9000;.

[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.170.0.1, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://172.170.0.11:9000", host: "example.com"[modifier | modifier le wikicode]

Remplacer dans le vhost :

 fastcgi_pass unix:/run/php/7.2-default.sock;

par :

 fastcgi_pass php7.2-fpm:9000;

[error] 17609#17609: *1 directory index of "/var/www/mon_site/" is forbidden, client: 172.170.0.1, server: example.com, request: "GET / HTTP/1.1", host: "example.com"[modifier | modifier le wikicode]

Si le dossier est bien accessible en shell, il faut remplacer dans le vhost :

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

par :

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

Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur https://example.com. Raison : le recours à plusieurs en-têtes CORS « Access-Control-Allow-Origin » n’est pas autorisé.[modifier | modifier le wikicode]

add_header 'Access-Control-Allow-Origin' '*';

Access to fetch at 'https://example.com' from origin 'http://example.fr' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values[modifier | modifier le wikicode]

Dans le vhost, retirer la clause suivante (car elle se retrouve en double chez le client) :

Access-Control-Allow-Origin:

FastCGI sent in stderr: "Primary script unknown"[modifier | modifier le wikicode]

Ajouter au vhost concerné le nom de son fichier d'index :

index index.php;

Sinon, remplacer le fastcgi_param SCRIPT_FILENAME. Ex :

fastcgi_param: SCRIPT_FILENAME $document_root$fastcgi_script_name;

par :

fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;

Dans Symfony cela peut survenir quand on utilise le vhost de la version 4 (public/index.php) sur la 3 (web/app.php ou app_dev.php).

Références[modifier | modifier le wikicode]