Два отдельных сайта 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.

4
задан 13 July 2015 в 14:51
1 ответ

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

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

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

Это, очевидно, серьезная проблема безопасности, и даже если никто не воспользуется этим, все еще существует вероятность того, что скрипты будут прочитаны неправильным пользователем при создании страницу, поэтому веб-сайты могут отображать неправильные данные / информацию, если в кеше есть несколько скриптов index.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, оставьте комментарий, чтобы сообщить нам, как вы справились с этой частью конфигурации!

11
ответ дан 3 December 2019 в 02:32

Теги

Похожие вопросы