NGinx Best Practices

46

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

Der Pixel-Entwickler
quelle
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 .

Jauder Ho
quelle
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.

Slava K
quelle
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
11

Konfigurieren Sie nginx so, dass stärkere SSL-Verschlüsselungen verwendet werden. Standardmäßig ist SSLv2 aktiviert (was Sie nach Möglichkeit deaktivieren sollten).

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
quelle
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;

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

jtimberman
quelle
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;
}
Der Pixel-Entwickler
quelle
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 _ "";
}
Unbekannt
quelle
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.
  } 
}
sajal
quelle
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;
  }

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

Pablox
quelle
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
wjimenez5271
quelle