Этот ответ предназначен специально для Gentoo с профилем 17. Вероятно, он будет работать с несколькими версиями плюс и минус. Я использовал страницу Red Hat с советами по настройке PHP для вдохновения. Та же идея должна работать и для других дистрибутивов Linux (, конечно, конкретные команды будут отличаться ).
Решение заключается в использовании PHP -FPM (FastCGI Process Manager ). Каждая версия PHP получает свою собственную службу PHP -FPM, которая прослушивает сокет. Apache передает запросы на выполнение PHP конкретной службе PHP -FPM в зависимости от того, какая версия PHP требуется.
Вы можете использовать мод _php для одной версии PHP и PHP -FPM для другой (s ), но я решил вообще отказаться от мода _php. Во-первых, я где-то читал, что можно сэкономить память, отключив мод _php. Во-вторых, решение казалось немного чище, так как все версии PHP обрабатывались одинаково. В-третьих, всегда лучше иметь наименьшее количество или только необходимое программное обеспечение, установленное с точки зрения безопасности.
Измените флаги USE
для dev-lang/php
, чтобы добавить fpm
и удалить apache2
.
Текущее соглашение Gentoo заключается в создании файла типа /etc/portage/package.use/php
и указании здесь флагов USE
. Если вы указываете точные версии в файле, убедитесь, что все версии PHP, которые вы хотите использовать, имеют эти флаги USE
.
Установите/переустановите версии PHP, которые вы собираетесь использовать.
# emerge -av =dev-lang/php-7.2.3
# emerge -av =dev-lang/php-5.6.7
Измените переменную APACHE2_MODULES
, чтобы построить модули Apache proxy
и proxy_fcgi
.
Вы указываете, какие модули Apache используют, добавляя/обновляя переменную APACHE2_MODULES
в /etc/portage/make.conf
. Как и флаги USE
, в Gentoo уже установлены некоторые значения по умолчанию -для вашего профиля. В отличие от флагов USE
, кажется, что вам нужно явно указать Gentoo, чтобы он начал со значений по умолчанию, добавив $APACHE2_MODULES
перед переменной:
APACHE2_MODULES="$APACHE2_MODULES proxy proxy_fcgi"
# emerge -av apache
# emerge -av php-fpm
Создайте сценарии запуска PHP -FPM для каждой версии PHP, которую вы используете с Apache.
Установка PHP -FPM создает один сценарий запуска (/etc/init.d/php-fpm
), который позволяет вам выбрать версию PHP для запуска с помощью eselect
или путем изменения суффикса имени файла сценария (, например. php-fpm-php5.6
, php-fpm-php7.2
и т. д. ). Поскольку мы хотели бы использовать eselect
только в том случае, если бы мы хотели использовать только одну версию PHP за раз или если бы мы хотели использовать не более двух версий с модом _php для одной и PHP -FPM для во-вторых, мы будем использовать суффиксный метод. Вместо того, чтобы копировать скрипт, мы хотим сделать на него символическую ссылку. (допустимые суффиксы — это имена каталогов из ls -ld /usr/lib64/php*
, например. php5.6
, php7.2
и т. д.):
# cd /etc/init.d
# ln -s php-fpm php-fpm-php5.6
# ln -s php-fpm php-fpm-php7.2
Измените конфигурацию PHP -FPM, чтобы служба каждой версии PHP работала на другом порту.
Конкретные имена файлов различаются в зависимости от версии, но вы хотите отредактировать файл конфигурации для каждой версии PHP в этих общих местах :/etc/php/fpm-php*/*.conf
, чтобы директива listen
имела отдельный порт для каждой версии.
Настройте службы PHP -FPM для запуска.
# rc-update add php-fpm-php5.6 default
# rc-update add php-fpm-php7.2 default
# /etc/init.d/php-fpm-php5.6 start
# /etc/init.d/php-fpm-php7.2 start
Отредактируйте начальную -конфигурацию Apache, чтобы включить прокси-модули.
Отредактируйте /etc/conf.d/apache2
, чтобы добавить -D PROXY
и удалить -D PHP
из APACHE2_OPTS
.
Отредактируйте конфигурацию Apache, чтобы связать определенные местоположения каталогов с определенными экземплярами PHP -FPM.
Существует множество способов справиться с этим в зависимости от конкретной конфигурации Apache. Я решил отредактировать запись
, связанную с моим веб-корнем, чтобы обработчик PHP по умолчанию был версии 7.2, добавив:
SetHandler "proxy:fcgi://127.0.0.1:9972" # <-- Note port num.
Поскольку PHP 5.6 использовался только в виде исключения, я добавил
директивы для каждого приложения, которому необходимо было использовать старую версию PHP:
Sethandler "proxy:fcgi:/127.0.0.1:9956" # <-- Note diff port num.
Добавить index.php
в качестве действительного индексного файла каталога.
В Gentoo /etc/apache2/modules.d/70_mod_php.conf
включает директиву для добавления index.php
в качестве индексного файла каталога, как это обычно делается index.html
. Поскольку мы отключили мод _php на шаге 9, 70_mod_php.conf
больше не существует для его установки. Чтобы это исправить, добавьте DirectoryIndex index.php
в конфигурацию Apache. В противном случае, если вы перейдете по таким путям, как /oldapp/
, вы получите ошибку 403.
Перезапустите Apache.
# /etc/init.d/apache restart
php.ini
файле (, например. максимальные значения POST, часовой пояс и т. д. ), вам нужно будет установить их во всех ваших /etc/php/fpm-php*/php.ini
файлах (для каждой версии ). user=nobody
/ group=nobody
. Возможно, вам придется изменить эти (в /etc/php/fpm-php*/php-fpm.conf
), чтобы они соответствовали тому, что работает на вашем веб-сервере.