Najlepsze praktyki NGinx


46

Jakie najlepsze praktyki stosujesz podczas korzystania z NGinx?


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 .



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.


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


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;

}

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

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.


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

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 _ "";
}

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.
  } 
}

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

}

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.