Веб-сервер случайным образом обслуживает разных Vhosts

9

У нас работает nginx на Ubuntu Trusty. Он обслуживает несколько веб-сайтов по https и работает по одному IP-адресу.

Случайно, хотя кажется, что это немного связано с рабочей нагрузкой, иногда отдельные запросы появляются не на том хосте. Это приводит к запросам на lustrum.thalia.nuобслуживание thalia.nuи наоборот. Это дает неприятные страницы с сообщениями об ошибках, поскольку пользователи неожиданно попадают на другой веб-сайт. Когда вы нажимаете F5, пользователи снова оказываются в исходной цели.

Это не похоже на браузер или операционную систему. Это было подтверждено в Firefox (Linux, Windows, Mac), Edge (Windows) и Chrome (Linux, Windows, Android) и Safari (iOS).

Эта проблема возникает чаще, когда система находится под нагрузкой, что указывает на какое-то состояние гонки.

lustrum.thalia.nu

server {
        server_name lustrum.thalia.nu;

        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/lustrum.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/lustrum.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia-lustrum/public_html;

        location / {
                index index.php;
                try_files $uri $uri/ /index.php?$args;
        }

        # Add trailing slash to */wp-admin requests.
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        # Pass all .php files onto a php-fpm/php-fcgi server.
        location ~ [^/]\.php(/|$) {
                include         /etc/nginx/fastcgi_params;

                fastcgi_split_path_info ^(.+?\.php)(/.*)$;

                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }

                fastcgi_pass    unix:/var/run/php5-fpm-thalia-lustrum.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

thalia.nu

server {
        server_name thalia.nu;    
        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/www.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/www.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia/public_html;

        location / {
                try_files $uri $uri/ /index.php/$request_uri;
                index index.php index.html index.htm;
        }

        location ~ \.php($|/) {
                include         /etc/nginx/fastcgi_params;
                set  $script     $uri;
                set  $path_info  "";
                if ($uri ~ "^(.+\.php)(/.+)") {
                                set  $script     $1;
                                set  $path_info  $2;
                }
                fastcgi_read_timeout    120;
                fastcgi_pass    unix:/var/run/php5-fpm-thalia-www.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

Как видите, мы используем разные пулы PHP5-FPM для этих двух доменов. Эти пулы привязаны к разным папкам и работают как разные пользователи. Насколько я могу судить, конфигурация PHP-FPM в остальном довольно стандартна.

Мы попробовали оба nginx 1.4.6-ubuntu3 и nginx 1.8.0-1 + trusty.

Журнал телеметрии

266.266.266.266 - - [25/Nov/2015:09:24:40 +0100] "GET /committees/175 HTTP/1.1" 302 5 "https://thalia.nu/committees" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0" Host: "thalia.nu" Location: "https://thalia.nu/index.php//committees/wp-admin/setup-config.php"

В этой строке вы видите, что запрос на страницу /committeesвнезапно перенаправляется на wp-admin. Похоже, что запрос /committeesобработан thalia-lustrumпулом PHP-fpm ...

Файл зоны DNS

Мы не видим, как это может быть актуально, но ...

;; MX Records
thalia.nu.    300    IN    MX    20    relay.transip.nl.
thalia.nu.    300    IN    MX    10    ivo.thalia.nu.

;; TXT Records
thalia.nu.    300    IN    TXT    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; SPF Records (Sender Policy Framework)
thalia.nu.    300    IN    SPF    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; CNAME Records
lustrum.thalia.nu.    300    IN    CNAME    thalia.nu.

;; A Records (IPv4 addresses)
thalia.nu.    300    IN    A    131.174.31.8
www.thalia.nu.    300    IN    A    131.174.31.8
ivo.thalia.nu.    300    IN    A    131.174.31.8
Том Виггерс
источник
1
Пожалуйста, проверьте ваши настройки DNS для доменов.
Бриллиант
1
@bangal - это записи A и CNAME, указывающие на один и тот же IP. Я не вижу, как это связано, хотя; они решаются очень хорошо, и кажется маловероятным, что проблема DNS будет проявляться так непоследовательно.
Joost
2
@ThomWiggers, можете ли вы добавить в свой файл журнала Host:заголовок http и пользовательский агент? Смотрите здесь, как: serverfault.com/questions/636790/… . На самом деле я пытался сделать несколько запросов на ваши сайты, но не воспроизвел вашу проблему. Какой клиент вы используете для воспроизведения этого?
Фреди
3
Является ли тот факт, что я только что получил «Сторонний контент не установлен» или что-то, потому что вы работаете над этим, или я попал в другой пул PHP или что-то (вызывая ту же ошибку)? Я также получил краткую ошибку о config.phpне найден.
Halfgaar
2
@kasperd serverfault.com/questions/737349/… . Похоже, что это влияет только на сценарии PHP.
Том Виггерс

Ответы:

4

После нескольких часов отладки этой проблемы мы наконец смогли отследить ее причину. Кажется, причина не в этом nginx, а в PHP-fpm. Мы запускаем php5-fpmверсию 5.5.9-1ubuntu4.14. Похоже, что при разветвлении новых работников что-то иногда идет не так, и работники запускают (частично?) Кодекс разных работников.

Нашим решением было копировать /etc/php5/fpm/php5-fpm.confв разные копии с собственными pool.dпапками, а затем копировать /etc/init.d/php5-fpmдля запуска с новым файлом конфигурации (также создавая файлы в /etc/init/). Это означает, что теперь у нас есть php5-fpmдиспетчер процессов на пул. Наличие отдельных chroot и сокетов, кажется, не держит вещи отдельно.

Том Виггерс
источник
Обратите внимание, что в настоящее время неясно, является ли это проблемой в нашей конфигурации или в (этой версии) php5-fpm, хотя последняя, ​​по-видимому, вряд ли, учитывая отсутствие подобных отчетов. Если мы обнаружим причину возникновения этой проблемы, этот ответ будет обновлен.
Joost
1

Я сталкиваюсь с той же проблемой, но на Debian с Apache2.4.25 и PHP7.1-FPM. Вот способ разделить процессы https://ma.ttias.be/a-better-way-to-run-php-fpm/

Для тех, кто, как я, может найти это решение слишком тяжелым для небольших веб-сайтов, добавьте php_admin_value[opcache.revalidate_freq] = 0в конец конфигурационный файл пула php-fpm. Однако это может оказать серьезное влияние на выступления ...

Вот официальный отчет об ошибке: https://bugs.php.net/bug.php?id=67141

Nic0tiN
источник
0

Поддерживает ли Nginx SNI? Вы можете запустить nginx -V и увидеть что-то вроде поддержки TLS SNI. Если вы этого не сделаете, возможно, это потому, что имя хоста отправляется после рукопожатия, и я предполагаю, что у вас есть подстановочный сертификат для * .thalia.nu

Мугурел
источник
Конечно, без SNI это будет работать 100% времени, а не очень редко. (и я также проверил это, он определенно включен)
Том Виггерс
Обратите внимание, что мы не предоставляем подстановочный сертификат, а используем отдельные сертификаты для отдельных поддоменов. Это входит в конфигурацию, указанную в вопросе.
Joost
..although сертификат lustrum.thalia.nu также действителен для Thalia.nu
Том Виггерс
Можете ли вы попробовать добавить параметр includeSubDomains следующим образом? add_header Strict-Transport-Security "max-age = 63072000; includeSubDomains; предварительная загрузка";
Mugurel
@ThomWiggers. Если сертификат действителен для нескольких доменов, можно поддерживать несколько доменов на одном IP без необходимости использования SNI.
Касперд
-1

Кажется, что сертификат не прав: firefox говорит мне, что он выдан для www.thalia.nu, а не thalia.nu.

Это ИМХО, что вызывает проблемы. Попробуйте использовать другой сертификат или активируйте HTTP-соединения без SSL.

Ксавье Николет
источник
Мы не можем воспроизвести это. Сертификат обслуживается на обоих доменах www.thalia.nuи thalia.nuвключает как с, так и без www. Какую версию Firefox вы используете и на какой платформе?
Joost