Best practice di NGinx


46

Quali best practice usi durante l'utilizzo di NGinx?


Solo una nota che questo non funziona per una configurazione di Magento. Sto ancora studiando le ragioni, ma penso che abbia qualcosa a che fare con la stringa di query.
Jauder Ho,

location / wordpress deve essere utile quando si dispone di wordpress nella sottodirectory denominata "wordpress". Che dire di quando abbiamo wordpress nella radice web "/"?
rahul286,

Risposte:


21

Come combinare blocchi HTTP e HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Questo è stato pubblicato come risposta a una domanda diversa. Vedi qui .



15

Generalmente, usare "if" è una cattiva pratica (secondo l'autore di nginx). se possibile, meglio usare try_file delle direttive error_page invece di "if (-f ...)"

Combinando tip con file maintenence.html e tip con try_files otteniamo:

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

Al termine della manutenzione, basta mv maintenance.html da $ root.


16
Questo non è l'ideale in quanto /maintenance.html verrà servito come risposta 200. Probabilmente vuoi che i motori di ricerca riconoscano che la pagina di manutenzione non è il tuo vero sito web. Probabilmente vorrai restituire un 503 (servizio temporaneamente non disponibile). L'unico modo in cui riesco a capire come farlo è con un if (-f ...) { return 503; }e error_page 503 /maintenance.html. Cosa ne pensi?
Aaron Gibralter,


8

Spesso è più efficiente utilizzare la mapdirettiva al posto delle espressioni regolari quando si cambia root per abbinare i sottodomini:

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
sai che puoi fare nome_server mysite.tld * .mysite.tld
Sconosciuto il

8

Il empty_gifmodulo è anche molto utile, specialmente se hai bisogno di monitorare le risposte dal server web (usando nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

1
Puoi fornire un esempio del mondo reale per questo? Continuo a non capire fino in fondo quanto sia utile.
The Pixel Developer

1
@ The Pixel Developer, è davvero utile solo per la velocità. Nginx conserva i dati per una gif vuota in memoria in modo che non debba mai essere caricata dal disco.
Sconosciuto il

5
anche access_log off;per quei luoghi è pratica comune
SaveTheRbtz

6

Abbiamo impostato Nginx con Chef, usando questo ricettario che contiene script per gestire la configurazione di nginx in modo simile a come Debian fa Apache2, e anche alcuni modelli di esempio con impostazioni predefinite corrette.


5

Ecco un buon metodo per restituire una pagina di manutenzione. Tutte le richieste vengono riscritte e viene restituito il codice http corretto. (503 servizio non disponibile)

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
In realtà, non sono d'accordo - ho aggiunto un commento a serverfault.com/questions/18994/nginx-best-practices/… . Fondamentalmente, vuoi restituire un errore 503 altrimenti robot e indicizzatori penseranno che la tua pagina di manutenzione sia parte del tuo sito reale ... Non c'è niente di sbagliato in una ifdichiarazione se la usi correttamente - i documenti dicono che ifsono sicuri se tu stai solo facendo return xxx;.
Aaron Gibralter,

Inoltre, è location = /maintenance.html { break; }necessario?
Aaron Gibralter,

4

Da nginx 0.7.12 e versioni successive, un "" è utilizzabile in nome_server per catturare richieste senza un'intestazione "Host".

È possibile utilizzare quanto segue come catchall per host virtuali non definiti.

server {
  server_name _ "";
}

Il tuo esempio funziona solo per richieste con un vhost non definito o funzionerà anche con richieste con un vhost sconosciuto (sbagliato)?
Benoit,

@Benoit funziona per tutto ciò che non è definito.
Sconosciuto l'

"Nome_server _ *" non è supportato da nginx 0.7 in poi?
rahul286,

1
Si noti che questo è solo parzialmente vero. "" catturerà un'intestazione Host MISSING, ma non intercetterà una richiesta con un'intestazione Host che non corrisponde a nulla. Se si desidera un blocco server catch-all, vedere il flag default_server sotto la direttiva Listen.
Martin Fjordvald,


3

Non so se sia una buona pratica, ma sicuramente un trucco accurato per ottenere condizioni nidificate in nginx. Ecco un esempio dal wiki di 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
Lo metterei nella categoria di "pratica brutta ma occasionalmente necessaria" - certamente non qualcosa da incoraggiare.
Womble

2

Se è necessario passare contestualmente tra http e https per i sottodomini gestiti dallo stesso blocco server, è possibile utilizzare le variabili per farlo. Potrebbe non essere il modo più efficiente di fare le cose, ma funziona:

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

Cerco sempre di utilizzare la rootdirettiva nella parte superiore del blocco server in modo da poter sfruttare la $document_rootvariabile e mai, ma mai, includere la rootdirettiva all'interno di un blocco di posizione.

La pagina delle insidie del wiki di Nginx contiene alcuni ottimi consigli sulle migliori pratiche.


1

Se si utilizza nginx come proxy, la modifica delle impostazioni di timeout può essere importante per assicurarsi che non si disponga di connessioni drop nginx prima che l'applicazione venga eseguita con esse, soprattutto se si ha a che fare con un'applicazione ad alto traffico:

proxy_connect_timeout
proxy_send_timeout

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.