У меня nginx работает с приложением Ruby / Sinatra и все хорошо. Однако сейчас я пытаюсь запустить второе приложение с того же сервера, и я заметил нечто странное. Во-первых, вот мой 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
Обратите внимание на то, как server_name
установлено значение, FAKE.COM
пока сервер отвечает всем хостам, которые обращаются к этому серверу через другие доменные имена. Как я могу заставить этот конкретный сервер отвечать только на запросы FAKE.COM
?
listen fake.com | something.com:80
команда фильтрует, неserver_name
.Ответы:
Первый блок сервера в конфигурации nginx используется по умолчанию для всех запросов, поступающих на сервер, для которого нет конкретного блока сервера.
Поэтому в вашей конфигурации предполагается, что вашим реальным доменом является REAL.COM, когда пользователь вводит его, он разрешается на ваш сервер, и, поскольку для этой настройки нет блока сервера, блок сервера для FAKE.COM, являющийся первым блок сервера (только блок сервера в вашем случае), обработает этот запрос.
Вот почему правильные конфиги Nginx имеют определенный блок сервера для значений по умолчанию, прежде чем следовать за другими для определенных доменов.
и т.д
** РЕДАКТИРОВАТЬ **
Кажется, что некоторые пользователи немного смущены этим примером и думают, что он ограничен одним файлом conf и т. Д.
Обратите внимание, что вышеприведенный пример является простым примером для разработки OP по мере необходимости.
Лично я использую отдельные файлы vhost conf с этим (CentOS / RHEL):
/etc/nginx/conf.d/
будет содержать domain_1.conf, domain_2.conf ... domain_n.conf, который будет включен после блока сервера в основной файл nginx.conf, который всегда будет первым и всегда будет значением по умолчанию, если он не будет переопределен сервером default_server директива в другом месте.В этом случае алфавитный порядок имен файлов conf-файлов для других серверов становится неактуальным.
Кроме того, эта схема дает большую гибкость в том смысле, что можно определить несколько значений по умолчанию.
В моем конкретном случае у меня Apache прослушивает порт 8080 только на внутреннем интерфейсе, и я передаю скрипты PHP и Perl в Apache.
Тем не менее, я запускаю два отдельных приложения, которые оба возвращают ссылки с «: 8080» в выходном html-файле, поскольку они обнаруживают, что Apache не работает на стандартном порту 80, и пытаются «помочь» мне.
Это вызывает проблему в том, что ссылки становятся недействительными, так как Apache не может быть достигнут с внешнего интерфейса, и ссылки должны указывать на порт 80.
Я решаю эту проблему, создав сервер по умолчанию для порта 8080 для перенаправления таких запросов.
Поскольку ничто в обычных серверных блоках не прослушивает порт 8080, серверный блок по умолчанию перенаправляет такие запросы прозрачно благодаря своей позиции в nginx.conf.
На самом деле у меня есть четыре таких серверных блока, и это упрощенный вариант использования.
источник
У вас должен быть сервер по умолчанию для перехвата , вы можете вернуться
404
или, что лучше, вообще не отвечать (сэкономит некоторую пропускную способность), возвращая444
HTTP-ответ, специфичный для nginx, который просто закрывает соединение и ничего не возвращаетисточник
server_name _;
меня не было в более ранних версиях для nginx, но это работало. Теперь для новых версий nginx кажется, что вам нужноserver_name _;
. Спасибо444
, и imho гораздо более чистое решение, чем возвращение кода ошибки.Я не смог решить мою проблему ни с одним из других ответов. Я решил проблему, проверив, соответствует ли хост, и вернул 403, если это не так. (У меня был какой-то случайный веб-сайт, указывающий на содержимое моих веб-серверов. Я угадываю рейтинг поиска)
источник
Чтобы ответить на ваш вопрос - nginx выбирает первый сервер, если нет совпадений. Смотрите документацию :
Теперь, если вы хотите иметь стандартный универсальный сервер, который, скажем, отвечает 404 на все запросы, то вот как это сделать:
Обратите внимание, что вам нужно указать сертификат / ключ (который может быть самоподписанным), в противном случае все SSL-соединения не будут работать, так как nginx попытается принять соединение, используя этот default_server, и не найдет сертификат / ключ.
источник
server_name _;
это даже не нужно.Есть несколько способов указать сервер по умолчанию.
Первый способ - укажите сервер по умолчанию первым в списке, если вы храните настройки сервера в одном файле конфигурации, как показано выше в Dayo.
Второй способ (лучше) Более гибкий - укажите
default_server
параметр дляlisten
инструкции, например:Больше информации здесь: Nginx doc / Listen
Этот способ более полезен, когда вы храните конфигурации сервера в отдельных файлах и не хотите называть эти файлы в алфавитном порядке.
источник
Маленький комментарий, чтобы ответить:
если у вас есть несколько виртуальных хостов на нескольких IP-адресах в нескольких файлах конфигурации в sites-available /, то домен «по умолчанию» для IP будет взят из первого файла в алфавитном порядке.
И, как сказал Павел, есть аргумент «default_server» для директивы «listen» http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
источник