web-dev-qa-db-fra.com

Meilleures pratiques NGinx

Quelles meilleures pratiques utilisez-vous lorsque vous utilisez NGinx?

46

De loin, les meilleurs conseils que j'ai jamais vus sont de l'auteur sur sa page d'écueil: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls /

21
Roger

Comment combiner des blocs HTTP et HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Cela a été publié comme réponse à une autre question. Voir ici .

21
Jauder Ho

En règle générale, l'utilisation de "si" est une mauvaise pratique (selon l'auteur de nginx). si possible, mieux vaut utiliser try_file des directives error_page à la place "if (-f ...)"

En combinant astuce avec le fichier maintenence.html et astuce avec try_files, nous obtenons:

 location/{
 try_files /maintenance.html $ uri $ uri/@wordpress; 
} 

Une fois la maintenance terminée, il suffit de mv maintenance.html à partir de $ root.

15
Slava K

Configurez nginx pour utiliser des chiffrements SSL plus puissants. Par défaut, SSLv2 est activé (que vous devez désactiver si possible).

ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;

http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl

11
Jauder Ho

Il est souvent plus efficace d'utiliser la directive map à la place des expressions régulières lors du changement de racine pour faire correspondre les sous-domaines:

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $Host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}
8
Phillip B Oldham

Le empty_gif le module est également très utile, surtout si vous avez besoin de surveiller les réponses du serveur web (en utilisant nagios/monit/etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
8
Phillip B Oldham

Nous avons installé Nginx avec Chef, en utilisant ce livre de recettes qui contient des scripts pour gérer la configuration de nginx similaire à la façon dont Debian fait Apache2, ainsi que quelques exemples de modèles avec des valeurs par défaut saines.

6
jtimberman

Voici une bonne méthode pour renvoyer une page de maintenance. Toutes les demandes sont réécrites et le code http correct est renvoyé. (503 Service Indisponible)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}
5
The Pixel Developer

Depuis nginx 0.7.12 et versions ultérieures, un "" est utilisable dans server_name pour intercepter les requêtes sans en-tête "Host".

Vous pouvez utiliser ce qui suit comme fourre-tout pour les hôtes virtuels non définis.

server {
  server_name _ "";
}
4
Unknown

J'ai également posté il y a un certain temps comment gérer correctement la compression gzip avec nginx car les anciens navigateurs peuvent avoir des problèmes avec juste une instruction gzip générale. HTH.

http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx

3
Jauder Ho

Je ne sais pas si c'est une meilleure pratique, mais certainement un hack soigné pour obtenir des conditions imbriquées dans nginx. Voici un exemple du wiki nginx .

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}
3
sajal

Si vous devez basculer contextuellement entre http et https pour les sous-domaines gérés par le même bloc serveur, vous pouvez utiliser des variables pour ce faire. Ce n'est peut-être pas le moyen le plus efficace de faire les choses, mais cela fonctionne:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $Host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$Host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$Host$uri;
  }

}
2
Phillip B Oldham

J'essaie toujours d'utiliser la directive root en haut du bloc serveur pour pouvoir profiter de la $document_root variable et jamais, mais jamais, la directive root dans un bloc d'emplacement.

La Page des pièges du wiki Nginx contient de bons conseils sur les meilleures pratiques.

Si vous utilisez nginx en tant que proxy, il peut être important de régler les paramètres de délai d'expiration pour vous assurer que vous n'avez pas de connexions de suppression nginx avant que votre application n'en ait fini avec eux, surtout si vous avez affaire à une application à fort trafic:

proxy_connect_timeout
proxy_send_timeout
1
wjimenez5271
0
KPWINC