Najlepsze praktyki NGinx

46

Jakie najlepsze praktyki stosujesz podczas korzystania z NGinx?

The Pixel Developer
źródło
Tylko uwaga, że ​​to nie działa w przypadku konfiguracji Magento. Nadal badam przyczyny, ale myślę, że ma to coś wspólnego z ciągiem zapytania.
Jauder Ho
lokalizacja / wordpress musi być przydatne, gdy masz wordpress w podkatalogu o nazwie „wordpress”. A co, gdy mamy wordpress w katalogu głównym „/”?
rahul286,

Odpowiedzi:

21

Jak łączyć bloki HTTP i HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Zostało to opublikowane jako odpowiedź na inne pytanie. Zobacz tutaj .

Jauder Ho
źródło
15

Ogólnie rzecz biorąc, użycie „if” jest złą praktyką (według autora nginx). jeśli to możliwe, lepiej użyć try_file dyrektyw error_page zamiast „if (-f ...)”

Łącząc wskazówkę z plikiem maintenence.html i wskazówkę z plikami try_files, otrzymujemy:

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

Po zakończeniu konserwacji po prostu mv Maintenance.html z $ root.

Slava K
źródło
16
Nie jest to idealne rozwiązanie, ponieważ /maintenance.html będzie służyć jako odpowiedź 200. Prawdopodobnie chcesz, aby wyszukiwarki rozpoznawały, że strona konserwacji nie jest Twoją rzeczywistą witryną. Prawdopodobnie zechcesz zwrócić 503 (usługa tymczasowo niedostępna). Jedynym sposobem, w jaki mogę to zrobić, jest użycie if (-f ...) { return 503; }i error_page 503 /maintenance.html. Co myślisz?
Aaron Gibralter
11

Skonfiguruj nginx, aby używał silniejszych szyfrów SSL. Domyślnie protokół SSLv2 jest włączony (który należy wyłączyć, jeśli to możliwe).

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
źródło
8

Często bardziej efektywne jest stosowanie mapdyrektywy zamiast wyrażeń regularnych podczas przełączania katalogu głównego na pasujące subdomeny:

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
źródło
5
wiesz, że możesz zrobić nazwa_serwera mysite.tld * .mysite.tld
Nieznany
8

empty_gifModuł jest również bardzo przydatna, zwłaszcza jeśli potrzebujesz odpowiedzi monitora z serwera WWW (przy użyciu Nagios / Monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
Phillip B Oldham
źródło
1
Czy możesz podać prawdziwy przykład tego? Nadal nie do końca rozumiem, jak to jest przydatne.
The Pixel Developer
1
@ The Pixel Developer, jest naprawdę przydatny ze względu na szybkość. Nginx przechowuje dane pustego gifa w pamięci, więc nigdy nie musi się ładować z dysku.
Nieznany
5
również access_log off;dla tych lokalizacji jest powszechną praktyką
SaveTheRbtz
6

Skonfigurowaliśmy Nginx z Chefem, używając tej książki kucharskiej, która zawiera skrypty do obsługi konfiguracji nginx, podobnie jak Debian robi Apache2, a także niektóre przykładowe szablony z rozsądnymi ustawieniami domyślnymi.

jtimberman
źródło
5

Oto dobry sposób na zwrócenie strony konserwacji. Wszystkie żądania są przepisywane i zwracany jest prawidłowy kod HTTP. (503 Usługa niedostępna)

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;
}
The Pixel Developer
źródło
1
Właściwie nie zgadzam się - dodałem komentarz do serverfault.com/questions/18994/nginx-best-practices/… . Zasadniczo chcesz zwrócić błąd 503, w przeciwnym razie boty i indeksujący będą myśleć, że strona konserwacji jest częścią Twojej witryny ... Nie ma nic złego w ifoświadczeniu, jeśli używasz go poprawnie - dokumenty mówią, że ifs są bezpieczne, jeśli po prostu robię return xxx;.
Aaron Gibralter
Czy też jest location = /maintenance.html { break; }konieczne?
Aaron Gibralter
4

Począwszy od nginx 0.7.12 i późniejszych, w nazwie nazwa_serwera można używać znaku „” do przechwytywania żądań bez nagłówka „Host”.

Można użyć następujących elementów jako catchall dla niezdefiniowanych hostów wirtualnych.

server {
  server_name _ "";
}
Nieznany
źródło
Czy twój przykład działa tylko dla żądań z niezdefiniowanym vhostem, czy będzie również działał z żądaniami z nieznanym (złym) vhostem?
Benoit
@Benoit to działa na wszystko, co nie jest zdefiniowane.
Nieznany
Czy „nazwa_serwera _ *” nie jest obsługiwana od wersji Nginx 0.7?
rahul286,
1
Pamiętaj, że jest to tylko częściowo prawda. „” wyłapuje MISSING nagłówek hosta, ale nie będzie przechwytywać żądania z nagłówkiem hosta, który nic nie pasuje. Jeśli chcesz mieć blok serwera typu catch-all, zobacz flagę default_server pod dyrektywą Listen.
Martin Fjordvald,
3

Nie wiem, czy jest to najlepsza praktyka, ale zdecydowanie fajny hack, aby uzyskać zagnieżdżone warunki w Nginx. Oto próbka z 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
źródło
3
Umieściłbym to w kategorii „brzydka, ale czasami niezbędna praktyka” - na pewno nie jest to coś, do czego należy zachęcać.
womble
2

Jeśli potrzebujesz przełączać kontekstowo między http i https dla poddomen obsługiwanych przez ten sam blok serwera, możesz użyć do tego zmiennych. To może nie być najbardziej efektywny sposób na robienie rzeczy, ale działa:

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
źródło
2

Zawsze staram się używać rootdyrektywy w górnej części bloku serwera, aby móc skorzystać ze $document_rootzmiennej i nigdy, ale nigdy, nie uwzględniać rootdyrektywy w bloku lokalizacji.

Strona Pułapki z wiki Nginx zawiera kilka świetnych wskazówek na temat najlepszych praktyk.

pablox
źródło
1

Jeśli używasz nginx jako serwera proxy, dostosowanie ustawień limitu czasu może być ważne, aby upewnić się, że nie masz połączeń zrzucanych nginx przed zakończeniem aplikacji, zwłaszcza jeśli masz do czynienia z aplikacją o dużym ruchu:

proxy_connect_timeout
proxy_send_timeout
wjimenez5271
źródło