FreeBSD - установка нескольких версий PHP на одном веб-сервере
Вебмастерам / FreeBSD / AdminZ 1 571
Эта статья описывает метод установки произвольного количества версий PHP на один сервер. При этом все версии будут работать параллельно и обрабатываться одним скриптом.
--- I. Подготовка системы ---
1.1. Создаём папку, где будут лежать архивы с дистрибутивами php:
# mkdir /usr/local/php-dist
Сами архивы можно скачать по следующим адресам:
- текущие релизы http://www.php.net/downloads.php
- релиз-кандидаты http://qa.php.net/
- устаревшие релизы http://www.php.net/releases/
- сборки разработчиков http://snaps.php.net/
1.2. Правка make.conf:
Для установки нескольких версий из портов, чтобы не было конфликтов, в make.conf добавить нужные версии php:
PHP_ALT=php74 php81 php82
.for port in ${PHP_ALT}
.if ${.CURDIR:M*/ports*/*/${port}*}
PREFIX=/usr/local/php/${port}
PHPBASE=/usr/local/php/${port}
DISABLE_VULNERABILITIES=yes
.endif
.endfor
--- II. Установка PHP 7 ---
2.1. Переходим в папку с дистрибутивами php:
# cd /usr/local/php-dist/
2.2. Качаем девелоперскую сборку php 7:
# fetch https://www.php.net/distributions/php-7.4.33.tar.bz2
2.3. Распаковываем архив:
# tar xf php-7.4.33.tar.bz2
2.4. Переходим в папку с исходным кодом:
# cd php-7.4.33
2.5. Конфигурируем:
# ./configure --prefix=/usr/local/php/php74 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-bcmath --with-bz2 --enable-ctype --with-curl --enable-dom --enable-exif --enable-fileinfo --enable-filter --enable-gd --with-gettext --with-iconv --with-imap --enable-intl --with-imap-ssl --with-ldap --enable-mbstring --with-mysqli --enable-opcache --with-openssl --enable-soap --enable-pdo --with-pdo-mysql --with-pdo-sqlite --enable-phar --enable-posix --enable-session --enable-simplexml --with-snmp --enable-sockets --with-sqlite3 --enable-tokenizer --enable-xml --enable-xmlreader --enable-xmlwriter --with-zip --with-zlib
2.6. Устанавливаем php:
# make install clean
2.6.1. Или устанавливаем из портов:
# cd /usr/ports/lang/php74/
# make prefix=/usr/local/php/php74
# make install clean
2.7. Переходим в папку, куда установили php:
cd /usr/local/php/php74
2.7.1. Копируем файл конфигурации php.ini:
# cp php.ini-production /usr/local/php/php74/etc/php.ini
2.8. Устанавливаем расширения из портов:
# cd /usr/ports/lang/php74-extensions
# make prefix=/usr/local/php/php74
# make install clean
2.8.1. Или каждый пакет ставим отдельно:
# pkg install php74-bcmath php74-bz2 php74-ctype php74-curl php74-dom php74-exif php74-fileinfo php74-filter php74-gd php74-gettext php74-iconv php74-imap php74-intl php74-ldap php74-mbstring php74-mysqli php74-opcache php74-pdo php74-phar php74-posix php74-session php74-simplexml php74-snmp php74-sockets php74-soap php74-sqlite3 php74-tokenizer php74-xml php74-xmlreader php74-xmlwriter php74-zip php74-zlib
2.9. В папке /usr/local/php/php74/etc/ cоздаем конфиг php-fpm.conf:
[global]
pid = /var/run/php74-fpm.pid
error_log = /var/log/php74-fpm.log
log_level = notice
[www]
user = www
group = www
listen = /var/run/php74-fpm.sock;
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
2.10. Создаем файл автозапуска php74-fpm и помещаем в папку /usr/local/etc/rc.d:
#!/bin/sh
# PROVIDE: php74-fpm
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable php-fpm:
# php74_fpm_enable="YES"
#
. /etc/rc.subr
name="php74_fpm"
rcvar=php74_fpm_enable
start_precmd="php74_fpm_prestart"
restart_precmd="php74_fpm_checkconfig"
reload_precmd="php74_fpm_checkconfig"
configtest_cmd="php74_fpm_checkconfig"
load_rc_config "$name"
: ${php74_fpm_enable="NO"}
: ${php74_fpm_umask=""}
extra_commands="reload configtest logrotate"
command="/usr/local/php/php74/sbin/php-fpm"
pidfile="/var/run/php74-fpm.pid"
sig_stop="QUIT"
sig_reload="USR2"
logrotate_cmd="php74_fpm_logrotate"
required_files="/usr/local/php/php74/etc/php-fpm.conf"
php74_fpm_logrotate() {
if [ -z "$rc_pid" ]; then
_run_rc_notrunning
return 1
fi
echo "Rotating logs $name."
kill -USR1 $rc_pid
}
php74_fpm_checkconfig()
{
echo "Performing sanity check on php-fpm configuration:"
eval ${command} -t
}
php74_fpm_prestart()
{
php74_fpm_checkconfig
checkconfig=$?
if [ $checkconfig -ne 0 ]; then
return $checkconfig
fi
if [ ! -z "$php74_fpm_umask" ]; then
echo "Setting umask to: ${php74_fpm_umask}"
umask $php74_fpm_umask
fi
}
run_rc_command "$1"
2.11. Не забываем прописать в автозагрузку наш php:
php74_fpm_enable="YES"
2.12. Запускаем службу php-fpm:
service php74-fpm start
2.13. Проверяем, что служба работает и слушает порты:
sockstat | grep php74
ответ:
www php-fpm 58520 6 stream /var/run/php74-fpm.sock
www php-fpm 58519 6 stream /var/run/php74-fpm.sock
и еще 23 таких записей, т.к. у нас в php-fpm.conf прописано количество процессов pm.start_servers = 25.
2.14. Прописываем в конфиге nginx:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php74-fpm.sock;
2.15. ВАЖНО!
Если мы устанавливаем основную версию PHP из девелоперской сборки (из папки /usr/local/php-dist), а не из портов (из папки /usr/ports/lang/php74), то обязательно нужно сделать символическую ссылку в каталог /usr/local/bin:
ln -s /usr/local/php/php74/bin/php /usr/local/bin/php
--- III. Установка PHP 8.1 ---
3.1. Переходим в папку с дистрибутивами php:
# cd /usr/local/php-dist/
3.2. Скачиваем исходный код нужной версии php:
# fetch -o php-8.1.22.tar.bz2 http://ru2.php.net/get/php-8.1.22.tar.bz2/from/this/mirror
3.3. Распаковываем архив в текущую папку:
# tar xf php-8.1.22.tar.bz2
3.4. Переходим в папку с исходным кодом:
# cd php-8.1.22
3.5. Конфигурируем php с нужными параметрами (опция --disable-cli обязательна!)
# ./configure --prefix=/usr/local/php/php81 --enable-fpm --disable-cgi --disable-cli --with-fpm-user=nginx --with-fpm-group=nginx --enable-bcmath --with-bz2 --enable-ctype --with-curl --enable-dom --enable-exif --enable-fileinfo --enable-filter --enable-gd --with-gettext --with-iconv=/usr/local/bin/ --with-imap --with-imap-ssl --enable-intl --with-ldap --enable-mbstring --with-mysqli --enable-opcache --with-openssl --enable-soap --enable-pdo --with-pdo-mysql --with-pdo-sqlite --enable-phar --enable-posix --enable-session --enable-simplexml --with-snmp --enable-sockets --with-sqlite3 --enable-tokenizer --enable-xml --enable-xmlreader --enable-xmlwriter --with-zip --with-zlib
Если появляется сообщение:
configure: error: iconv does not support errno
необходимо при конфигурации указать полный путь к библиотеке iconv:
--with-iconv=/usr/local/bin/
если там будет просто --with-iconv, то будет ошибка.
3.6. Устанавливаем php:
# make install clean
3.6.2. Или устанавливаем из портов:
# cd /usr/ports/lang/php81/
# make prefix=/usr/local/php/php81
# make install clean
3.7. Переходим в папку, куда установили php:
cd /usr/local/php/php81
3.7.1. Копируем файл конфигурации php.ini:
# cp php.ini-production /usr/local/php/php81/etc/php.ini
3.8. Устанавливаем расширения из портов:
# cd /usr/ports/lang/php81-extensions
# make prefix=/usr/local/php/php81
# make install clean
3.8.1. Сверяемся со списком расширений.
В моём случае в php81-extensions отсутствовали расширения php81-pear, php81-zip, php81-zlib, их мы установим через пакеты:
# pkg install php81-pear php81-zip php81-zlib
3.8.2. Или каждый пакет ставим отдельно:
# pkg install php81-bcmath php81-bz2 php81-ctype php81-curl php81-dom php81-exif php81-fileinfo php81-filter php81-gd php81-gettext php81-iconv php81-imap php81-intl php81-ldap php81-mbstring php81-mysqli php81-opcache php81-pdo php81-pear php81-phar php81-posix php81-session php81-simplexml php81-snmp php81-soap php81-sockets php81-sqlite3 php81-tokenizer php81-xml php81-xmlreader php81-xmlwriter php81-zip php81-zlib
Обратите внимание!
При установке из пакетов может удалить предыдущую версию расширения, например при установке php81-intl выдала предупреждение, что будет удален предыдущий пакет php74-intl, что нам совершенно не нужно.
Поэтому более надежный способ установки расширений из портов с указанием prefix=/usr/local/php/php81.
3.9. В папке /usr/local/php/php81/etc/ cоздаем конфиг php-fpm.conf:
[global]
pid = /var/run/php81-fpm.pid
error_log = /var/log/php81-fpm.log
log_level = notice
[www]
user = www
group = www
listen = /var/run/php81-fpm.sock;
listen.owner = www
listen.group = www
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
3.10. Создаем файл автозапуска php81-fpm и помещаем в папку /usr/local/etc/rc.d:
#!/bin/sh
# PROVIDE: php81-fpm
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf to enable php-fpm:
# php81_fpm_enable="YES"
#
. /etc/rc.subr
name="php81_fpm"
rcvar=php81_fpm_enable
start_precmd="php81_fpm_prestart"
restart_precmd="php81_fpm_checkconfig"
reload_precmd="php81_fpm_checkconfig"
configtest_cmd="php81_fpm_checkconfig"
load_rc_config "$name"
: ${php81_fpm_enable="NO"}
: ${php81_fpm_umask=""}
extra_commands="reload configtest logrotate"
command="/usr/local/php/php81/sbin/php-fpm"
pidfile="/var/run/php81-fpm.pid"
sig_stop="QUIT"
sig_reload="USR2"
logrotate_cmd="php81_fpm_logrotate"
required_files="/usr/local/php/php81/etc/php-fpm.conf"
php81_fpm_logrotate() {
if [ -z "$rc_pid" ]; then
_run_rc_notrunning
return 1
fi
echo "Rotating logs $name."
kill -USR1 $rc_pid
}
php81_fpm_checkconfig()
{
echo "Performing sanity check on php-fpm configuration:"
eval ${command} -t
}
php81_fpm_prestart()
{
php81_fpm_checkconfig
checkconfig=$?
if [ $checkconfig -ne 0 ]; then
return $checkconfig
fi
if [ ! -z "$php81_fpm_umask" ]; then
echo "Setting umask to: ${php81_fpm_umask}"
umask $php81_fpm_umask
fi
}
run_rc_command "$1"
3.11. Не забываем прописать в автозагрузку наш php:
php81_fpm_enable="YES"
3.12. Запускаем службу php-fpm:
service php81-fpm start
3.13. Проверяем, что служба работает и слушает порты:
sockstat | grep php81
ответ:
www php-fpm 58520 6 stream /var/run/php81-fpm.sock
www php-fpm 58519 6 stream /var/run/php81-fpm.sock
еще 23 таких записей, т.к. у нас в php-fpm.conf прописано количество процессов pm.start_servers = 25.
3.14. Прописываем в конфиге nginx:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php81-fpm.sock;
--- IV. Установка memcached (pecl) ---
Что такое Memcached и какое отношение он имеет к PHP?
Memcached разработан для кэширования данных, генерация которых требует большого количества ресурсов. Такого рода данные могут содержать что угодно, начиная с результатов запроса к базе данных и заканчивая тяжеловесным куском шаблона. Memcached не входит в базовый набор модулей, поставляемых с PHP, однако он доступен в репозитории pecl.
4.1. Если у вас установлена одна версия PHP на сервере, то просто выполните команду установки memcached из пакетов:
# pkg install php81-pecl-memcached
Если на сервере установлено больше, чем одна версия PHP, рекомендуется произвести установку из исходников.
4.2. Переходим в каталог:
# cd /usr/local/php-dist/
4.2.1. Скачиваем архив memcached:
# fetch http://pecl.php.net/get/memcached-3.2.0.tgz
4.2.2. Распаковываем архив:
# tar -xvzf memcached-3.2.0.tgz
4.2.3. Переходим в папку:
# cd memcached-3.2.0
4.3. Перед установкой, чтобы библиотека memcached скомпилировалась с нужной версией PHP, в нашем случае PHP 8.1, нам нужно сделать следующее:
4.3.1. Смотрим текущую конфигурацию pecl:
# pecl config-show
4.3.1.1. Если получаем ошибку:
# pecl: Command not found.
значит нужно установить его отдельным пакетом:
# pkg install php81-pear
4.3.2. Запишем текущие пути к файлам php (в моем случае были такие настройки):
bin_dir /usr/local/bin (каталог, в котором установлены исполняемые файлы)
php_dir /usr/local/bin (каталог, в котором установлены файлы PHP (например, файлы PEAR))
php_bin /usr/local/bin/php (двоичный файл PHP CLI или CGI для выполнения скриптов)
ext_dir /usr/local/lib/php/20190902 (каталог, в котором установлены загружаемые расширения)
4.3.3. Меняем на путь к каталогам, где установлена нужная версия php:
# pecl config-set bin_dir /usr/local/php/php81/bin
# pecl config-set php_dir /usr/local/php/php81/bin
# pecl config-set php_bin /usr/local/php/php81/bin/php
# pecl config-set ext_dir /usr/local/php/php81/lib/php/20210902
# pecl config-set php_ini /usr/local/php/php81/etc/php.ini
# pecl config-set php_suffix 8.1
4.3.4. Проверяем, что все каталоги поменялись на нужные:
# pecl config-show
!!! Для установки memcached на другие версий PHP, для которых вы собираете модули, прописываем пути к нужным папкам.
4. Собираем и устанавливаем memcached под версию PHP 8.1:
# pecl install -f memcached
4.5. Если в процессе компиляции получаем ошибку:
18 source files, building
running: phpize8.1
sh: phpize8.1: not found
ERROR: `phpize' failed
4.5.1. Нужно установить символическую ссылку на файл phpize, в том же каталоге, где установлен php:
# ln -s /usr/local/php/php81/bin/phpize /usr/local/php/php81/bin/phpize81
4.5.2. Или можно установить символическую ссылку сразу в каталог /usr/local/bin:
# ln -s /usr/local/bin/phpize /usr/local/bin/phpize81
4.6. Производим конфигурацию с указанием путей к файлам php и php-config:
# ./configure --prefix=/usr/local/php/php81/lib/php --with-php-config /usr/local/php/php81/bin/php-config
4.7. Выполняем установку:
# pecl install -f memcached
4.7.1. Если при установке также получаем ошибку:
sh: php-config81: not found
4.7.2. Выполняем:
# /usr/local/php/php81/bin/php-config --prefix /usr/local/php/php81 --extension-dir /usr/local/php/php81/lib/php/20210902 --php-binary /usr/local/php/php81/bin
Вставляется одной строкой.
4.7.3. Если все сделали правильно, то получаем сообщение об успешной установке memcached:
Build process completed successfully
Installing '/usr/local/php/php81/lib/php/20210902/memcached.so'
install ok: channel://pecl.php.net/memcached-3.2.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=memcached.so" to php.ini
!!! Не забываем в папке /usr/local/php/php81/etc/php создать расширение ext-30-memcached.ini с содержанием:
extension=memcached.so
4.8. Для удаления memcached:
# pecl uninstall -r memcached
4.9. Перезапускаем службу php-fpm:
service php81-fpm restart
P.S. Перед любыми манипуляциями с версиями PHP нужно менять конфигурацию pecl на нужную версию php.
Курс валют
21 ноября 2024 |
USD: 100.2192 |
EUR: 105.8090 |
UAH: 24.2479 |
Календарь
« Ноябрь 2024 » | ||||||
---|---|---|---|---|---|---|
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
Нашли ошибку?
Вы можете сообщить об этом Администрации.
Выделив текст, нажмите CTRL+Enter
Комментарии: 5