Есть машина с Nginx а также PHP-FPM в теме. Есть 2 сервера, 2 php-fpm пула (каждый с chroot) и 2 справочника которая имеет такую же структуру и похожи на файлы / классы php.
Один бассейн слушает 127.0.0.1:22333
в то время как другой на 127.0.0.1:22335
,
Проблема в том, что когда я делаю запрос ко второму серверу, он как-то выполняется в первом пуле. Более странно, что иногда некоторые классы PHP берутся из одного каталога (первого пула), иногда из другого. Конкретного паттерна нет, похоже, что это происходит случайно.
например: Логи Nginx показывают, что запрос поступает на второй сервер, а логи php-fpm показывают, что он был обработан в первом пуле.
Но это никогда не происходит наоборот (запросы к первому серверу всегда выполняются с первым пулом php-fpm)
Бассейны настраиваются таким же образом:
same user
same group
pm = dynamic
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 300
chroot = ...
chdir = /
php_flag[display_errors] = on
php_admin_value[error_log] = /logs/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 64M
catch_workers_output = yes
php_admin_value[upload_tmp_dir] = ...
php_admin_value[curl.cainfo] = ...
Директива серверов Nginx для php выглядит так:
fastcgi_pass 127.0.0.1:2233X;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param DOCUMENT_ROOT /;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_intercept_errors off;
Была такая же проблема.
Лучший ответ на этот вопрос был на ServerFault который предложил opcache.enable=0
, который указал мне на довольно интересное поведение PHP.
кэш APC / OPcache совместно используется всеми пулами PHP-FPM
Копаться дальше в документации opcache, которую я нашел этот php.ini
вариант:
opcache.validate_root=1
opcache.validate_root логический
Предотвращает конфликты имен в среде chroot. Это должно быть включено во всех средах chroot, чтобы предотвратить доступ к файлам вне chroot.
Установка этой опции в 1
(по умолчанию 0
) и перезапуск php-fpm
исправил проблему для меня.
РЕДАКТИРОВАТЬ:
В поисках нужных слов (validate_root
) Я нашел гораздо больше об этой ошибке:
Следуя примечаниям из обсуждения ошибок, вы также должны рассмотреть opcache.validate_permission=1
Других решений пока нет …