Два отдельных сайта PHP-FPM, кажется, используют один и тот же код?

У меня есть два веб-сайта с двумя кодовыми базами, но когда я меняю одну кодовую базу, я вижу изменения в обоих.

У меня есть две проверки одного и того же сайта. Они настроены на использование PHP-FPM через Apache2 с FastCGI. Оформить заказы в:

/var/www/site1
/var/www/site2

Конфиги Apache выглядят так:

<VirtualHost *:80>
    ServerName site1.myserver.com
    DocumentRoot /var/www/site1
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.myserver.com
    DocumentRoot /var/www/site2
    <IfModule mod_fastcgi.c>
        AddHandler php5-fcgi-handler .php
        Action php5-fcgi-handler /php5-fcgi-uri
        Alias /php5-fcgi-uri fcgi-application
        FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
    </IfModule>
</VirtualHost>

Конфиги пула FPM выглядят так:

[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

[site2]
user = site2-user
group = site2-group
listen = /var/run/site2-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited

Я не использую функцию chroot в FPM (насколько я могу судить).

Когда я изменяю код для site1 и перезапускаю PHP-FPM и посещаю site1 и site2, я вижу изменения на обоих сайтах.

Если я перезапущу PHP-FPM и сначала зайду на сайт site2 (неизменный сайт), а затем на site1, я не вижу изменений ни на одном сайте.

Что не так с моими конфигами? Я вижу отдельные процессы PHP-FPM, работающие для site1 и site2 под основным мастером FPM.

1 ответ

Решение

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

TL; DR: по умолчанию, когда включен OpCache, кеш, который используется для хранения скомпилированного байт-кода, используется всеми пользователями. В среде, где хостинг распределяется между несколькими сайтами / пользователями, это может привести к тому, что сайт получит кэшированный вывод сценариев php с другого сайта или, если определенные параметры безопасности включены, даже генерирует ошибки.

Если вы планируете использовать PHP-FPM со встроенным opcache в PHP 5.5+, пожалуйста, прочитайте блог ниже, прежде чем вы действительно это сделаете. Оказывается, что кэш кода операции может быть прочитан любым пользователем на сервере. Это означает, что если, скажем, есть 10 отдельных пользователей со своими собственными vhosts и каталогами, и вы настраиваете один пул PHP-FPM на пользователя, каждый пользователь по-прежнему может видеть, какие сценарии кэшируются и их местоположения. Так как у них есть доступ на чтение к кешу, они потенциально могут просматривать все эти данные.

Это, очевидно, серьезная проблема безопасности, и даже если никто не воспользуется этим, все равно есть вероятность, что скрипты будут прочитаны не тем пользователем при создании страницы, поэтому веб-сайты могут отображать неверные данные / информацию, если существует несколько индексов. Скрипты.php в кеше.

Хотя официально не было выпущено ни одного исправления, если вы используете cPanel, в этой вики есть документированный способ настройки пулов php-fpm, которые будут создаваться и защищаться для каждого пользователя, и если вы будете следовать приведенным ниже инструкциям, а также ВАЖНЫЕ ЗАМЕЧАНИЯ В нижней части этого ответа вы сможете получить желаемую функциональность без каких-либо ошибок

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


ВАЖНЫЕ ЗАМЕТКИ

Во время тестирования и дополнительных исследований я наткнулся на эту статью, в которой приведены некоторые пояснения, которые могут иметь отношение к вашей конкретной ситуации:

  1. Вы должны убедиться, что opcache.use_cwd параметр установлен в true для конфигурации вашего приложения OpCache - он установлен в false по умолчанию, если оставить значение по умолчанию, это может вызвать конфликты, если в вашей системе размещено более одного приложения PHP:

Прежде всего, вероятно, в каждом типичном проекте вам нужно убедиться, что для опции opcache.use_cwd установлено значение true. Включение этого параметра означает, что механизм OpCache будет просматривать полные пути к файлам, чтобы различать файлы с одинаковыми именами. Установка его в false приведет к конфликтам между файлами с одинаковым базовым именем.

  1. Если вы работаете с приложением, основанным на Zend Framework или другой подобной платформе, которая использует аннотации, вы также должны убедиться, что opcache.load_comments а также opcache.save_comments директивы установлены в true, Вам следует дважды проверить это предложение в документации по вашему приложению / фреймворку, поскольку большинство из них уже обновили свои документы с конкретными инструкциями по правильному использованию OpCache для своих систем:

Существует также параметр, который важен в инструментах и ​​средах, которые используют аннотации. Если вы используете Doctrine, Zend Framework 2 или PHP Unit, не забудьте установить для параметров opcache.load_comments и opcache.save_comments значение true. В результате комментарии документации к вашим файлам также будут включены в предварительно скомпилированный код, сгенерированный OpCache. Этот параметр позволит вам работать с аннотациями без сбоев.

Если ваш проект основан на конкретной платформе или веб-приложении, всегда полезно проверить документацию на предмет каких-либо рекомендаций, касающихся конфигурации OpCache.

ВАЖНЫЕ ЗАМЕТКИ


Надеюсь, это помогло - и если вы используете cPanel, оставьте комментарий, чтобы сообщить нам, как вы справились с этой частью конфигурации!

Другие вопросы по тегам