По какой-то причине NGINX не работает, если я установил пустой IP-адрес в директиве имя_сервера
:
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.
Если у вас настроен только один сайт, вы можете попробовать использовать это в конфигурации nginx:
server_name _;
If заставит server
принять все HTTP-запросы, независимо от заголовка Host
.
Пробовали ли вы использовать example.com вместо IP-адреса?
По крайней мере, с Apache, весь смысл поля server_name состоит в том, чтобы разрешить нескольким веб-сайтам (пространствам имен) обслуживаться с одного IP-адреса. Клиент, следующий за « http://example.com », выполняет поиск в DNS и отправляет запрос на IP-адрес, полученный в результате поиска в DNS, но включает в запрос «example.com», поэтому что веб-сервер (NGINX) может определить, к какому веб-сайту принадлежит запрос.
Этот вопрос показывает неправильное понимание цели объявления 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 / questions HTTP / 1.1
Это указывает серверу путь URL и версию HTTP, которую клиент использует для связи.
Вторая строка:
Host: serverfault.com
Это называется заголовком HTTP, и заголовок Host сообщает веб-серверу, какой веб-сайт должен обрабатывать запрос. Когда на сервере размещается только один веб-сайт, это, вероятно, кажется излишним. Но часто веб-серверы обрабатывают множество веб-сайтов.
Это соответствует директиве nginx server_name. Эта директива указывает nginx использовать этот сайт nginx только тогда, когда заголовок Host соответствует этой строке.
Итак, чтобы ответить на ваш вопрос, нет смысла устанавливать IP-адрес в директиве server_name. Было бы более нормальным зарегистрировать доменное имя, а затем создать запись DNS CNAME для ссылки на 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-адреса