Meilleures pratiques NGinx


46

Quelles meilleures pratiques utilisez-vous lorsque vous utilisez NGinx?


Juste une note que cela ne fonctionne pas pour une configuration Magento. J'enquête toujours sur les raisons, mais je pense que cela a quelque chose à voir avec la chaîne de requête.
Jauder Ho

location / wordpress doit être utile lorsque vous avez wordpress dans le sous-répertoire nommé "wordpress". Qu'en est-il lorsque nous avons WordPress dans la racine Web "/"?
rahul286

Réponses:


21

Comment combiner des blocs HTTP et HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Cela a été posté comme une réponse à une question différente. Voir ici .



15

Généralement, utiliser "si" est une mauvaise pratique (selon l'auteur de nginx). si possible, utilisez plutôt try_file des directives error_page à la place "if (-f ...)"

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

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

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


16
Ce n'est pas idéal car /maintenance.html sera servi comme réponse 200. Vous voulez probablement que les moteurs de recherche reconnaissent que la page de maintenance n'est pas votre site Web actuel. Vous voudrez probablement renvoyer un 503 (service temporairement indisponible). Le seul moyen de comprendre comment faire est d'utiliser un if (-f ...) { return 503; }et error_page 503 /maintenance.html. Qu'est-ce que tu penses?
Aaron Gibralter


8

Il est souvent plus efficace d’utiliser la mapdirective à 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;

}

5
vous savez que vous pouvez faire nom_serveur mysite.tld * .mysite.tld
Inconnu

8

Le empty_gifmodule est également très utile, en particulier si vous avez besoin de surveiller le serveur Web (en utilisant nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
Pouvez-vous donner un exemple concret pour cela? Je ne comprends toujours pas à quel point c'est utile.
Le développeur de

1
@ The Pixel Developer, ce n’est vraiment utile que pour la vitesse. Nginx conserve les données d'un gif vide en mémoire afin qu'il ne soit jamais chargé à partir du disque.
Inconnu

5
aussi access_log off;pour ces lieux est une pratique courante
SaveTheRbtz

6

Nous avons configuré Nginx avec Chef à l’aide de ce livre de recettes, qui contient des scripts de gestion de la configuration de Nginx similaires à ceux utilisés par Apol2 par Debian, ainsi que des exemples de modèles avec des valeurs par défaut sane.


5

Voici une bonne méthode pour retourner 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;
}

1
En fait, je ne suis pas d'accord - j'ai ajouté un commentaire à serverfault.com/questions/18994/nginx-best-practices/… . En gros, vous voulez retourner une erreur 503 ou bots d' autre et indexeurs pensera votre page d'entretien fait partie de votre site actuel ... Il est faux de rien avec une ifdéclaration si vous l' utilisez correctement - les docs disent que ifs sont en sécurité si vous faites juste return xxx;.
Aaron Gibralter

Aussi, est location = /maintenance.html { break; }nécessaire?
Aaron Gibralter

4

À partir de nginx 0.7.12 et ultérieur, un "" est utilisable dans nom_serveur pour intercepter les demandes sans en-tête "Host".

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

server {
  server_name _ "";
}

Votre exemple fonctionne-t-il uniquement pour les demandes avec un vhost non défini ou travaillera-t-il également avec des demandes avec un vhost inconnu (mauvais)?
Benoit

@Benoit cela fonctionne pour tout ce qui n'est pas défini.
Inconnu

Est-ce que "nom_serveur _ *" n'est pas pris en charge à partir de nginx 0.7?
rahul286

1
S'il vous plaît noter que ce n'est que partiellement vrai. "" attrapera un en-tête MISSING Host, mais ne capturera pas une requête avec un en-tête Host qui ne correspond à rien. Si vous voulez un bloc serveur fourre-tout, voyez l'indicateur default_server sous la directive listen.
Martin Fjordvald


3

Je ne sais pas si c'est une pratique recommandée, mais c'est vraiment un bidouillage génial 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
Je mettrais cela dans la catégorie des "pratiques laides, mais parfois nécessaires" - certainement pas quelque chose à encourager.
femme

2

Si vous devez basculer de manière contextuelle entre http et https pour les sous-domaines gérés par le même bloc de serveur, vous pouvez utiliser des variables pour le faire. Ce n'est peut-être pas la manière la plus efficace de faire les choses, mais ça marche:

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

J'essaie toujours d'utiliser la rootdirective dans la partie supérieure du bloc serveur pour pouvoir tirer parti de la $document_rootvariable et ne jamais, mais jamais, inclure la rootdirective dans un bloc d'emplacement.

La page des pièges du wiki Nginx propose des conseils judicieux sur les meilleures pratiques.


1

Si vous utilisez nginx en tant que proxy, il peut être important de régler les paramètres de délai d'attente pour éviter toute interruption de la connexion nginx avant que votre application ne soit terminée, en particulier si vous utilisez une application à trafic élevé:

proxy_connect_timeout
proxy_send_timeout

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.