Подтвердить что ты не робот

Nginx перенаправляет на неправильный vhost

У меня около 1300vhosts в одном файле nginx conf. Все со следующим макетом (они перечислены друг в друге в файле vhost).

Теперь моя проблема в том, что иногда мой браузер перенаправляет сайт2 на сайт1. По какой-то причине, хотя имена доменов не соответствуют событию.

Похоже, что nginx всегда перенаправляется на первый сайт в файле vhosts.

Кто-нибудь, кто знает, что эта проблема может быть?

server {
    listen   80;

    server_name site1.com;
    rewrite ^(.*) http://www.site1.com$1 permanent;
}

server {
    listen   80;

    root /srv/www/site/public_html/src/public/;
    error_log /srv/www/site/logs/error.log;
    index index.php;

   server_name www.site1.com;

    location / {
        if (!-e $request_filename) {
            rewrite ^.*$ /index.php last;
        }
    }

    location ~ .(php|phtml)$ {
        try_files $uri $uri/ /index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

server {
    listen   80;

    server_name site2.com;
    rewrite ^(.*) http://www.site2.com$1 permanent;
}

server {
    listen   80;

    root /srv/www/site/public_html/src/public/;
    error_log /srv/www/site/logs/error.log;
    index index.php;

   server_name www.site2.com;

    location / {
        if (!-e $request_filename) {
            rewrite ^.*$ /index.php last;
        }
    }

    location ~ .(php|phtml)$ {
        try_files $uri $uri/ /index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

ИЗМЕНИТЬ Может быть, еще одна вещь, которая стоит упомянуть, что я перезагружаю всех этих vhosts каждые 2 минуты с перезагрузкой nginx -s.

В первых тестах похоже, что перенаправление происходит только при перезагрузке... Идет еще несколько тестов, но это может быть полезно.

4b9b3361

Ответ 1

Ссылка (как nginx обрабатывает запрос): http://nginx.org/en/docs/http/request_processing.html

В этой конфигурации nginx проверяет только поле заголовка запросов "Хост", чтобы определить, к какому серверу должен быть направлен запрос. Если его значение не соответствует имени сервера, или запрос не всегда содержат это поле заголовка, затем nginx направит запрос на сервер по умолчанию для этого порта.

сервер по умолчанию является первым, что является стандартом nginxs поведение по умолчанию

Не могли бы вы проверить заголовок хоста этих плохих запросов?

Также вы можете создать явный сервер по умолчанию, чтобы поймать все эти плохие запросы и просто зарегистрировать информацию о запросе (то есть $http_host) в другой файл журнала ошибок для расследования.

server {
    listen       80  default_server;
    server_name  _;
    error_log /path/to/the/default_server_error.log;

    return       444;
}

[ UPDATE] Как вы делаете nginx -s reload, и у вас так много доменов в этом конфиг файле nginx, возможно следующее:

Перезагрузка работает следующим образом

запуск новых рабочих процессов с новой конфигурацией, изящное закрытие старых рабочих процессов

Таким образом, старые рабочие и новые работники могли сосуществовать некоторое время. Например, когда вы добавляете новый серверный блок (с новым доменным именем) в ваш файл конфигурации, во время перезагрузки новые рабочие будут иметь новый домен, а старый - нет. Когда запрос отправляется старым рабочим процессом, он будет считаться неизвестным хостом и обслуживаться сервером по умолчанию.

Ты сказал, что это делается каждые 2 минуты. Не могли бы вы запустить

ps aux |grep nginx

и проверьте, сколько времени работает каждый рабочий? Если это более 2 минут, перезагрузка может работать не так, как вы ожидали.