Meilleures pratiques NGinx

46

Quelles meilleures pratiques utilisez-vous lorsque vous utilisez NGinx?

Le développeur Pixel
la source
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 .

Jauder Ho
la source
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.

Slava K
la source
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
11

Configurez nginx pour utiliser des chiffrements SSL plus puissants. Par défaut, SSLv2 est activé (vous devez le 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

Jauder Ho
la source
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;

}
Phillip B Oldham
la source
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;
} 
Phillip B Oldham
la source
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.

jtimberman
la source
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;
}
Le développeur Pixel
la source
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 _ "";
}
Inconnu
la source
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.
  } 
}
sajal
la source
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;
  }

}
Phillip B Oldham
la source
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.

pablox
la source
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
wjimenez5271
la source