NGINX: Poprawne definiowanie dyrektyw nasłuchiwania
21 Oct 2017
best-practices http listen nginx
NGINX tłumaczy wszystkie niepełne dyrektywy listen zastępując brakujące wartości ich wartościami domyślnymi. Co więcej, oceni dyrektywę server_name tylko wtedy, gdy będzie musiał rozróżnić bloki serwera pasujące do tego samego poziomu w dyrektywie listen.
Ustawienie pary adres:port zapobiega subtelnym błędom, które mogą być trudne do debugowania. Na przykład, jeżeli mamy w konfiguracji dyrektywę listen *:80 i kilka bloków server, w których ustawiona jest ta dyrektywa, zostanie ona uzupełniona i w wyniku będzie wyglądać tak: listen 0.0.0.0:80.
Następnie dodając w którymś miejscu konfiguracji, np. listen 192.168.50.2:80 wszystkie bloki server zawierające pierwszą dyrektywę listen (uzupełnioną przez NGINX) będą miały niższy priorytet i nie będą przetwarzane (request z nagłówkiem Host niepasujący do server_name z ustawionym listen 192.168.50.2:80 lub domena, która jest podpięta pod listen *:80, wpadnie do domyślnego bloku serwera – jawnie wskazanego za pomocą default_server, lub jeśli nie, pierwszego wystąpienia w konfiguracji).
Ponadto brak adresu IP oznacza powiązanie ze wszystkimi interfejsami/adresami IP w systemie, co może powodować wiele problemów i co do zasady jest bardzo złą praktyką – zaleca się konfigurowanie tylko minimalnego dostępu do sieci dla usług.
Przykład:
- testowy request:
$ curl -Iks http://api.random.com
- konfiguracja po stronie serwera:
server {
# Ten blok będzie przetwarzany!
listen 192.168.252.10; # --> 192.168.252.10:80
...
}
server {
# Ponieważ NGINX uzupełni adres IP wartością poniżej,
# która ma niższy priorytet niż jasne wskazanie
# adresu.
listen 80; # --> *:80 --> 0.0.0.0:80
server_name api.random.com;
...
}
Zgodnie z tym, wskazane jest definiowanie dyrektyw nasłuchiwania z wykorzystaniem jasnego wskazania adresu serwera oraz numeru portu.