По какой-то причине NGINX не работает, если я установил голый IP-адрес в server_name
директива:
server {
listen 80;
server_name xx.xx.xxx.xx; # doesn't work
server {
listen 80;
server_name ec2-xx-xx-xxx-xx.ap-southeast-2.compute.amazonaws.com; # this works fine
Почему NGINX не принимает IP-адрес? Как заставить его принимать IP?
Я использую динамический DNS с моим регистратором доменных имен (namecheap, если быть точным), и у меня есть запись «A», которая сопоставляет мое общедоступное доменное имя с экземпляром AWS EC2:
Итак, когда я иду в example.com
Меня перенаправляют в приложение экземпляра EC2. Однако я вижу целевую страницу NGINX по умолчанию вместо целевой страницы моего приложения. NGINX не передает запрос дальше в Node.js.
Вы пробовали использовать example.com вместо IP-адреса?
По крайней мере, с Apache, весь смысл поля server_name состоит в том, чтобы разрешить обслуживание нескольких веб-сайтов (пространств имен) с одного IP-адреса. Клиент, который подписан на "http://example.com"выполняет поиск в DNS и отправляет запрос на IP-адрес, полученный в результате поиска в DNS, но включает" example.com "в запрос, чтобы веб-сервер (NGINX) мог определить, к какому веб-сайту принадлежит запрос.
Если у вас настроен только один сайт, вы можете попробовать использовать его в конфигурации nginx:
server_name _ ;
Если заставит server
принимать все HTTP-запросы, несмотря ни на что Host
заголовок есть.
Этот вопрос показывает неправильное понимание цели объявления server_name. Среди серверов распространена возможность указывать IP-адреса интерфейсов, на которых вы хотите создать прослушивающий сокет. Однако с NGINX это не достигается с помощью директивы server_name.
Чтобы понять директиву server_name, вам необходимо понять часть протокола HTTP. Когда ваш веб-браузер делает HTTP-запрос на веб-сайт, например, переполнение стека https://serverfault.com/questions заставляет ваш веб-браузер искать serverfault.com в DNS для получения IP-адреса - вот почему вам нужна запись DNS.
Как только ваш веб-браузер получает IP-адрес, он открывает TCP-соединение с портом 80 на этом IP-адресе. Затем веб-браузер должен сообщить веб-серверу, какая страница запрашивается. Это делается с помощью протокола HTTP. Первая строка запроса будет:
GET / вопросы HTTP / 1.1
Это сообщает серверу путь URL и версию HTTP, которую клиент использует для связи.
Вторая строка:
Хост: serverfault.com
Это называется HTTP-заголовком, а заголовок Host сообщает веб-серверу, какой веб-сайт должен обрабатывать запрос. Когда на сервере размещается только один веб-сайт, это, вероятно, кажется излишним. Но часто веб-серверы обрабатывают множество веб-сайтов.
Это соответствует директиве nginx server_name. Эта директива указывает nginx использовать этот сайт nginx только тогда, когда заголовок Host соответствует этой строке.
Итак, чтобы ответить на ваш вопрос, не имеет смысла устанавливать IP-адрес в директиве server_name. Было бы более нормальным зарегистрировать доменное имя, а затем создать запись CNAME DNS для ссылки на DNS-имя серверов AWS. Когда вы запускаете заменяющий сервер, обновите CNAME, чтобы он указывал на DNS-имя нового сервера.
Профессиональный веб-сайт будет размещен за эластичным балансировщиком нагрузки, который затем поддерживает постоянное имя DNS, на которое вы можете ссылаться с помощью своей записи DNS.
Я новичок в NGINX, но согласно официальным документам (https://nginx.org/en/docs/http/server_names.html) РАЗРЕШЕНО использовать числовой IP-адрес:
«Если кто-то делает запрос, используя IP-адрес вместо имени сервера, поле заголовка запроса« Хост »будет содержать IP-адрес, и запрос может быть обработан с использованием IP-адреса в качестве имени сервера:
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
Это имеет смысл сделать, если вы контролируете записи DNS своего IP-адреса.