Назад | Перейти на главную страницу

Как установить IP-адрес в директиве server_name, а не доменное имя?

По какой-то причине 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-адреса.