Nginx путает сайты или настраиваем сайт по умолчанию правильно

Есть несколько сайтов на одном сервере. В качестве web-сервера используется nginx. В access-логах nginx вижу, что сайты ошибочно отвечают на относительные пути друг друга. Почему nginx путает сайты в этом случае оставалось непонятным до этого момента. Чужие пути с 404 ошибкой можно также увидеть в Яндекс Вебмастере, что тоже плохая практика.

Оказалось, что проблема заключалась в неправильно настроенном сайте по умолчанию.

В чем проблема?

При заходе на site.ru, dns-сервер сообщает IP-адрес сервера и на него отправляется запрос с заголовком Host: site.ru. Nginx, в свою очередь, проверяет у себя в конфигах все блоки server для отправленного доменного имени. Если находит нужный блок, то начинает обработку запроса и пользователь видит содержимое страницы сайта. Если не находит, то запрос игнорируется.

Все запросы с пустым заголовком Host: тоже должны игнорироваться web-сервером, но nginx вместо этого показывает любой сайт размещенный на сервере (чаще всего первый по порядку). В таком случае лог nginx наполняется ошибками про несуществующие страницы.

Решение – настроить в nginx сайт по умолчанию

Всем посетителям, не знающим точного доменного имени размещённого сайта, необходимо отвечать статичной страницей, а не случайным сайтом. Чаще всего это не «живые» посетители, а бездушные сетевые сканеры, которые анализируют ваш сервер для своих корыстных целей. Отвечать нужно коротко и максимально неинформативно.

В nginx «из коробки» уже настроен сайт по умолчанию. Конфиг его здесь – /etc/nginx/site-avalible/default. Но он отвечает только на HTTP-запросы. Понимать его HTTPS-запросы стоит «научить» самостоятельно. К тому же HTTPS-трафик сейчас превалирует.

Открываем конфиг для редактирования и заменяем его содержимое:

sudo nano /etc/nginx/site-avalible/default
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_tokens off;
        default_type "text/html";
        return 200 "Hello!";
}
server {
        listen  443 ssl default;
        listen  [::]:443 ssl default_server;
        ssl_certificate /etc/nginx/ssl/default.crt;
        ssl_certificate_key /etc/nginx/ssl/default.key;
        server_tokens off;
        default_type "text/html";
        return 200 "Hello!";
}

Вместо return 200 "Hello!";, которая отправляет текстовое сообщение, можно использовать return 444;, которое просто закроет соединение.

Нам нужны самоподписанные SSL-сертификаты. Их необходимо сгенерировать вручную. Генерируем один раз и навсегда, так как в просроченном виде они будут также хорошо работать, как и в свежем.

sudo mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
sudo openssl req -x509 -out default.crt -keyout default.key \
-newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' -extensions EXT -config <(printf "
[dn]
CN=localhost
[req]
distinguished_name = dn
[EXT]
subjectAltName=DNS:localhost
keyUsage=digitalSignature
extendedKeyUsage=serverAuth")

После этого остается только перезапустить наш nginx:

sudo service nginx restart

Теги:

Комментарии




В качестве аватарки используется сервис - gravatar.com



IT-событие
Совершен первый видеозвонок
Совершен первый видеозвонок
Оглавление
  1. В чем проблема?
  2. Решение – настроить в nginx сайт по умолчанию
  3. Комментарии