Mam uruchomiony Nginx z aplikacją Ruby / Sinatra i wszystko jest w porządku. Jednak próbuję teraz uruchomić drugą aplikację z tego samego serwera i zauważyłem coś dziwnego. Po pierwsze, oto mój nginx.conf:
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
Zwróć uwagę, jak server_name
ustawione jest, FAKE.COM
że serwer odpowiada wszystkim hostom, które trafiają na ten serwer za pośrednictwem innych nazw domen. Jak sprawić, by ten konkretny serwer odpowiadał tylko na żądania FAKE.COM
?
listen fake.com | something.com:80
polecenia filtruje, nieserver_name
.Odpowiedzi:
Pierwszy blok serwera w konfiguracji nginx jest domyślny dla wszystkich żądań trafiających do serwera, dla którego nie ma określonego bloku serwera.
Więc w twojej konfiguracji, zakładając, że twoja prawdziwa domena to REAL.COM, kiedy użytkownik wpisze to, zostanie to rozwiązane na twój serwer, a ponieważ nie ma bloku serwera dla tej konfiguracji, blok serwera dla FAKE.COM, jako pierwszy blok serwera (w twoim przypadku tylko blok serwera), przetworzy to żądanie.
Dlatego właściwe konfiguracje Nginx mają określony blok serwera dla ustawień domyślnych przed podążaniem za innymi dla określonych domen.
itp
** EDYTOWAĆ **
Wygląda na to, że niektórzy użytkownicy są nieco zdezorientowani tym przykładem i myślą, że jest on ograniczony do jednego pliku konfiguracyjnego itp.
Należy pamiętać, że powyższe jest prostym przykładem na to, aby PO rozwijało się zgodnie z wymaganiami.
Osobiście używam oddzielnych plików conf vhost z tym (CentOS / RHEL):
/etc/nginx/conf.d/
będzie zawierał domain_1.conf, domain_2.conf ... domain_n.conf, które zostaną uwzględnione po bloku serwera w głównym pliku nginx.conf, który zawsze będzie pierwszym i zawsze będzie domyślnym, chyba że zostanie nadpisany przez default_server dyrektywy w innym miejscu.W tym przypadku kolejność alfabetyczna nazw plików konfiguracyjnych dla innych serwerów nie ma znaczenia.
Ponadto taki układ zapewnia dużą elastyczność, ponieważ można zdefiniować wiele domyślnych wartości.
W moim konkretnym przypadku Apache nasłuchuje na porcie 8080 tylko na wewnętrznym interfejsie i przekazuję skrypty PHP i Perl do Apache.
Jednak uruchamiam dwie oddzielne aplikacje, które zwracają linki z „: 8080” w dołączonym wyjściowym html, ponieważ wykryją, że Apache nie działa na standardowym porcie 80 i próbują mi „pomóc”.
Powoduje to problem polegający na tym, że łącza stają się nieprawidłowe, ponieważ Apache nie jest dostępny z zewnętrznego interfejsu, a łącza powinny wskazywać na port 80.
Rozwiązuję ten problem, tworząc domyślny serwer dla portu 8080 do przekierowywania takich żądań.
Ponieważ nic w zwykłych blokach serwerów nie nasłuchuje na porcie 8080, domyślny blok serwera przekierowania w przejrzysty sposób obsługuje takie żądania ze względu na swoją pozycję w nginx.conf.
Właściwie mam cztery takie bloki serwera i jest to uproszczony przypadek użycia.
źródło
Powinieneś mieć domyślny serwer dla catch-all , możesz wrócić
404
lub lepiej nie odpowiadać w ogóle (zaoszczędzi trochę przepustowości), zwracając444
odpowiedź HTTP specyficzną dla nginx, która po prostu zamyka połączenie i nic nie zwracaźródło
server_name _;
Nie miałem we wcześniejszych wersjach dla nginx, ale to działało. Teraz w przypadku nowszych wersji nginx wydaje się, że potrzebujeszserver_name _;
. Dzięki444
i imho jest znacznie czystszym rozwiązaniem niż zwracanie kodu błędu.Nie udało mi się rozwiązać problemu żadną z pozostałych odpowiedzi. Rozwiązałem problem, sprawdzając, czy host pasuje i zwracając 403, jeśli nie. (Miałem przypadkową stronę internetową wskazującą na zawartość moich serwerów internetowych. Zgaduję, że przechwycę pozycję wyszukiwania)
źródło
Odpowiadając na twoje pytanie - nginx wybiera pierwszy serwer, jeśli nie ma dopasowania. Zobacz dokumentację :
Teraz, jeśli chcesz mieć domyślny serwer typu catch-all, który, powiedzmy, odpowiada 404 na wszystkie żądania, oto jak to zrobić:
Zauważ, że musisz określić certyfikat / klucz (który może być samopodpisany), w przeciwnym razie wszystkie połączenia SSL zakończą się niepowodzeniem, ponieważ nginx spróbuje zaakceptować połączenie przy użyciu tego domyślnego_serwera i nie znajdzie certyfikatu / klucza.
źródło
server_name _;
nie jest to nawet potrzebne.Istnieje kilka sposobów określenia domyślnego serwera.
Pierwszy sposób - Określ domyślny serwer jako pierwszy na liście, jeśli przechowujesz konfiguracje serwera w jednym pliku konfiguracyjnym, jak pokazał Dayo powyżej.
Drugi sposób (lepszy) Bardziej elastyczny - podaj
default_server
parametrlisten
instrukcji, na przykład:Więcej informacji tutaj: Nginx doc / Listen
Jest to bardziej przydatne, gdy konfiguracje serwera są przechowywane w osobnych plikach i nie chcesz nazywać tych plików alfabetycznie.
źródło
Mały komentarz do odpowiedzi:
jeśli masz kilka wirtualnych hostów na kilku adresach IP w kilku plikach konfiguracyjnych w sites-available /, to domena „domyślna” dla IP zostanie pobrana z pierwszego pliku w kolejności alfabetycznej.
Jak powiedział Pavel, istnieje argument „default_server” dla dyrektywy „Listen” http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
źródło