NGinx Best Practices


46

Welche bewährten Methoden verwenden Sie bei der Verwendung von NGinx?


Nur ein Hinweis, dass dies bei einem Magento-Setup nicht funktioniert. Ich untersuche immer noch die Gründe, aber ich denke, es hat etwas mit der Abfragezeichenfolge zu tun.
Jauder Ho

location / wordpress muss nützlich sein, wenn Sie wordpress im Unterverzeichnis "wordpress" haben. Was ist, wenn wir WordPress im Web-Root "/" haben?
rahul286

Antworten:


21

So kombinieren Sie HTTP- und HTTPS-Blöcke.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Dies wurde als Antwort auf eine andere Frage gepostet. Sehen Sie hier .



15

Im Allgemeinen ist die Verwendung von "if" eine schlechte Praxis (laut Autor von nginx). wenn möglich, besser try_file von error_page Direktiven anstelle von "if (-f ...)" verwenden

Wenn wir tip mit maintenence.html file und tip mit try_files kombinieren, erhalten wir:

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

Wenn die Wartung beendet ist, einfach mv maintenance.html von $ root.


16
Dies ist nicht ideal, da /maintenance.html als 200-Antwort bereitgestellt wird. Sie möchten wahrscheinlich, dass Suchmaschinen erkennen, dass die Wartungsseite nicht Ihre eigentliche Website ist. Möglicherweise möchten Sie einen 503 zurückgeben (Dienst vorübergehend nicht verfügbar). Der einzige Weg, wie ich herausfinden kann, ist mit einem if (-f ...) { return 503; }und error_page 503 /maintenance.html. Was denkst du?
Aaron Gibralter


8

Es ist oft effizienter, die mapDirektive anstelle von regulären Ausdrücken zu verwenden, wenn Sie den Stamm für übereinstimmende Unterdomänen wechseln:

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
Sie wissen, dass Sie server_name mysite.tld * .mysite.tld
Unbekannt

8

Das empty_gifModul ist auch sehr nützlich, insbesondere wenn Sie Monitorantworten vom Webserver benötigen (mit nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

1
Können Sie ein reales Beispiel dafür liefern? Ich verstehe immer noch nicht ganz, wie nützlich es ist.
Der Pixel-Entwickler

1
@ The Pixel Developer, es ist nur wirklich nützlich für die Geschwindigkeit. Nginx speichert die Daten für ein leeres GIF im Speicher, sodass sie niemals von der Festplatte geladen werden müssen.
Unbekannter

5
Auch access_log off;für diese Standorte ist es gängige Praxis
SaveTheRbtz

6

Wir haben Nginx mit Chef eingerichtet und verwenden dieses Kochbuch, das Skripte für die Handhabung der Nginx- Konfiguration enthält, ähnlich wie Debian Apache2, sowie einige Beispielvorlagen mit vernünftigen Vorgaben.


5

Hier ist eine gute Methode zum Zurücksenden einer Wartungsseite. Alle Anforderungen werden neu geschrieben und der richtige http-Code wird zurückgegeben. (503 Dienst nicht verfügbar)

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
Eigentlich stimme ich nicht zu - ich habe einen Kommentar zu serverfault.com/questions/18994/nginx-best-practices/… hinzugefügt . Grundsätzlich Sie einen Fehler 503 oder auch Bots und Indexer zurückkehren werden denken , Ihre Wartungsseite Teil Ihrer tatsächlichen Website ist ... Es ist nichts falsch mit einer ifAussage , wenn Sie es richtig verwenden - die docs sagen , dass ifs sicher sind , wenn Sie mache gerade return xxx;.
Aaron Gibralter

Auch ist location = /maintenance.html { break; }notwendig?
Aaron Gibralter

4

Ab nginx 0.7.12 kann in Servername ein "" verwendet werden, um Anforderungen ohne "" Host "-Header abzufangen.

Sie können die folgenden Informationen als Anhaltspunkt für nicht definierte virtuelle Hosts verwenden.

server {
  server_name _ "";
}

Funktioniert Ihr Beispiel nur für Anfragen mit einem undefinierten vhost oder auch für Anfragen mit einem unbekannten (falschen) vhost?
Benoit

@Benoit es funktioniert für alles, was nicht definiert ist.
Unbekannt

Wird "Servername _ *" ab Nginx 0.7 nicht unterstützt?
rahul286

1
Bitte beachten Sie, dass dies nur teilweise zutrifft. "" fängt einen MISSING Host - Header ab, aber es wird keine Anfrage mit einem Host - Header abgefangen, der nicht mit irgendetwas übereinstimmt. Wenn Sie einen Catch-All-Server-Block wünschen, sehen Sie das default_server-Flag unter der listen-Direktive.
Martin Fjordvald


3

Ich weiß nicht, ob es sich um eine bewährte Methode handelt, aber es ist auf jeden Fall ein guter Hack, um verschachtelte Bedingungen in Nginx zu erhalten. Hier ist ein Beispiel aus dem Nginx-Wiki .

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
Ich würde das in die Kategorie "hässliche, aber gelegentlich notwendige Übung" einordnen - sicherlich nicht etwas, das ermutigt werden sollte.
womble

2

Wenn Sie für Unterdomänen, die von demselben Serverblock verarbeitet werden, zwischen http und https wechseln müssen, können Sie dazu Variablen verwenden. Möglicherweise ist dies nicht die effizienteste Methode, aber es funktioniert:

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

Ich versuche immer, die rootDirektive im oberen Bereich des Serverblocks zu verwenden, damit ich die $document_rootVariable nutzen und die rootDirektive nie, aber niemals in einen Location-Block einfügen kann.

Die Fallstrick-Seite aus dem Nginx-Wiki enthält einige großartige Tipps zu Best Practices.


1

Wenn Sie Nginx als Proxy verwenden, kann es wichtig sein, die Timeout-Einstellungen anzupassen, um sicherzustellen, dass Sie keine Nginx-Drop-Verbindungen haben, bevor Ihre Anwendung damit fertig ist. Dies gilt insbesondere, wenn Sie mit einer stark frequentierten Anwendung arbeiten:

proxy_connect_timeout
proxy_send_timeout

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.