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 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/default.key -out /etc/nginx/ssl/default.crt
Generating a RSA private key
.......+++++
..............+++++
writing new private key to '/etc/nginx/ssl/default.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: RU
State or Province Name (full name) [Some-State]: OMS
Locality Name (eg, city) []: Omsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]: AW
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []: info@adminway.ru

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

sudo service nginx restart

Теги:

Комментарии




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



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