PHP с поддержкой LiteSpeed API
Установка и настройка PHP с поддержкой LS API (LiteSpeed)
Примечание
Альфа-версия.
LiteSpeed — протокол обмена информацией, а также модель работы PHP-интерпретатора.
Данная модель в чём-то схожа с работой PHP в режиме FastCGID и позволяет PHP работать в режиме сервиса,
который порождает процессы-потомки для обработки запросов.
Данный режим реализован для работы с сервером LiteSpeed — это коммерческая версия.
Также существует версия с открытым исходным кодом — OpenLiteSpeed.
Открытым также является и протокол LSSAPI.
При сборке PHP можно собрать PHP-интерпретатор с поддержкой протокола LSSAPI и на выходе получить двоичный файл lsphp.
Но для его использования нужен или OpenLiteSpeed или коммерческий LiteSpeed.
Расширение mod_lsphp позволяет использовать lsphp с классическим веб-сервером Apache.
Предупреждение
Модуль находится на стадии альфа-тестирования, при использовании его на рабочих серверах следует проявлять осторожность.
Установка mod_lsphp и первичная настройка
Установка mod_lsphp достаточно проста. Подключите репозиторий Hosting от ОС МСВСфера 9
(или HostingTesting для активации тестовых программ и версий) и выполните команду:
$ sudo dnf install mod_lsphp
После установки модуля в каталогах настройки Apache появятся несколько файлов:
/etc/httpd/conf.d/mod_lsphp.conf
/etc/httpd/conf.modules.d/11-mod_lsphp.conf
Для начала работы модуля в файле /etc/httpd/conf.modules.d/11-mod_lsphp.conf раскомментируйте строку:
#LoadModule lsphp_module modules/mod_lsphp.so
Т.е. приведите её к виду:
LoadModule lsphp_module modules/mod_lsphp.so
Перезапустите Apache:
$ sudo systemctl restart httpd
Если при перезапуске Apache не запустился и в логе ошибок сервера появилась строка:
# cat /var/log/httpd/error_log | grep mod_lsphp | grep failed
... MODLSPHP: mod_lsphp system check failed. Disable mod_lsphp for server work. Use mod_fcgid or etc or use correct MSVSphere installation
То нужно сначала зарегистрировать систему и запустить сервис лимитирования (см. «МСВСфера 9 Сервер редакция для хостинг-провайдеров, интеграция с другим программным обеспечением»).
Если система зарегистрирована и корректно настроена, то Apache перезапустится и будет выведено сообщение:
$ sudo cat /var/log/httpd/error_log | grep MODLSPHP
... [pid 21393:tid 21393] MODLSPHP: (version: 0.0.1) loaded ok
... [pid 21396:tid 21396] MODLSPHP: queen process is started with pd = 21396
Данные строки говорят о том, что модуль успешно запустился и готов принимать запросы для обработки LSPHP-интерпретатором.
Обработчики
Важным моментом дальнейшей настройки является настройка обработчиков для привязки к обработчикам PHP.
Модуль по умолчанию предполагает, что в системе есть lsphp и находится он по пути:
/usr/local/bin/lsphp
Имя данного обработчика — application/x-httpd-lsphp. Если данный файл присутствует в системе, то в VirtualHost можно добавить следующую строку:
<IfModule lsphp_module>
lsphp_user_group user1 user1
AddHandler application/x-httpd-lsphp .php
php_admin_flag engine on
</IfModule>
И вызвать PHP-скрипт сайта. Он запустится и будет обрабатываться с помощью LSPHP от пользователя user1.
Проверить наличие lsphp можно командой:
$ sudo ps aux | grep lsphp
user1 21449 0.0 0.7 217304 29536 ? S 23:48 0:00 lsphp
user1 21450 0.0 0.5 217304 19640 ? Ss 23:48 0:00 lsphp
или
$ sudo lsps -p
ID PNO COM PID CPU MEM VMEM
user1 2 --- --- 0 11 0
--- lsphp 21464 0 7 0
--- lsphp 21465 0 7 0
Утилита lsps видит данные процессы так как они сразу попадают в лимитированное и изолированное окружение LS и LFS.
Также модуль позволяет добавить пользовательские обработчики для различных версий LSPHP.
Например, контрольная панель ispmanager имеет в составе пакеты вида isp-php**-lsapi, которые приносят в систему бинарный файл lsphp:
# ls -1 /opt/php*/bin/lsphp
/opt/php53/bin/lsphp
/opt/php54/bin/lsphp
/opt/php55/bin/lsphp
/opt/php56/bin/lsphp
/opt/php70/bin/lsphp
/opt/php71/bin/lsphp
/opt/php72/bin/lsphp
/opt/php73/bin/lsphp
/opt/php74/bin/lsphp
/opt/php80/bin/lsphp
/opt/php81/bin/lsphp
/opt/php82/bin/lsphp
/opt/php83/bin/lsphp
/opt/php84/bin/lsphp
Для каждого файла можно создать свой обработчик, т.е привязать к псевдониму путь к бинарному файлу, чтобы можно было его использовать для виртуального хоста.
Пример. Создадим файл /etc/httpd/conf.d/lsphp_handlers.conf со следующим содержимым:
<IfModule lsphp_module>
lsphp_custom_handler x-lsphp53 /opt/php53/bin/lsphp
lsphp_custom_handler x-lsphp54 /opt/php54/bin/lsphp
lsphp_custom_handler x-lsphp55 /opt/php55/bin/lsphp
lsphp_custom_handler x-lsphp56 /opt/php56/bin/lsphp
lsphp_custom_handler x-lsphp70 /opt/php70/bin/lsphp
lsphp_custom_handler x-lsphp71 /opt/php71/bin/lsphp
lsphp_custom_handler x-lsphp72 /opt/php72/bin/lsphp
lsphp_custom_handler x-lsphp73 /opt/php73/bin/lsphp
lsphp_custom_handler x-lsphp74 /opt/php74/bin/lsphp
lsphp_custom_handler x-lsphp80 /opt/php80/bin/lsphp
lsphp_custom_handler x-lsphp81 /opt/php81/bin/lsphp
lsphp_custom_handler x-lsphp82 /opt/php82/bin/lsphp
lsphp_custom_handler x-lsphp83 /opt/php83/bin/lsphp
lsphp_custom_handler x-lsphp84 /opt/php84/bin/lsphp
</IfModule>
И настроим виртуальный хост сайта на использование lsphp версии 55.
Предупреждение
После изменения настроек в конфигурационных файлах необходимо перезапустить Apache.
Проверяем вывод phpinfo():
$ sudo curl http://user1.t/i.php 2>/dev/null | grep "PHP Version </td>"
<tr><td class="e">PHP Version </td><td class="v">5.5.38 </td></tr>
Или перенастроим на обработчик x-lsphp83:
$ sudo curl http://user1.t/i.php 2>/dev/null | grep "PHP Version </td>"
<tr><td class="e">PHP Version </td><td class="v">8.3.16 </td></tr>
Типовая настройка виртуального хоста
Для работы сайта с lsphp необходимо добавить некоторые специфичные директивы в настройки виртуального хоста.
Например, вот как может выглядеть конфигурационный файл /etc/httpd/conf.d/user1.t.conf:
<VirtualHost *:80>
ServerAdmin webmaster@user1.t
DocumentRoot /var/www/user1/site/user1.t
ServerName user1.t
ServerAlias www.user1.t
ErrorLog /var/www/user1/logs/user1.t.error.log
CustomLog /var/www/user1/logs/user1.t.access.log common
DirectoryIndex index.php
...
<IfModule lsphp_module>
lsphp_user_group user1 user1
AddHandler x-lsphp83 .php
php_admin_flag engine on
</IfModule>
</VirtualHost>
За определение пользователя — владельца процесса lsphp отвечает директива lsphp_user_group user1 user1,
можно также указать другую директиву SuexecUserGroup user1 user1.
Если же не указать ни одну из данных директив, то сайт вернёт ошибку.
Ошибки можно избежать, если в файл /etc/httpd/conf.d/mod_lsphp.conf добавить директиву lsphp_apache_uid On.
Пример:
<IfModule lsphp_module>
lsphp_apache_uid On
</IfModule>
В этом случае lsphp запустится от пользователя Apache:
$ sudo ps aux | grep lsphp
apache 24030 0.5 0.8 242588 32068 ? S 15:02 0:00 lsphp
apache 24031 0.0 0.6 242588 22584 ? Ss 15:02 0:00 lsphp
Данная директива позволяет не производить настройку отдельно для каждого сайта.
В любом случае для сайта будет запущен процесс lsphp, но все процессы будут запущены от пользователя apache.
Параметры настройки LSPHP
lsphp_custom_handler
Описание
Добавить собственный обработчик запроса. Данная опция связывает виртуальное имя (обработчик) и путь к бинарному файлу, который будет принимать запросы.
Пример
lsphp_custom_handler x-lsphp53 /opt/php53/bin/lsphp
Вы можете добавить несколько собственных обработчиков — в результате сохранится их список. Задаётся в конфигурационном файле или в VirtualHost.
lsphp_user_group
Описание
Задать пользователя (и группу), от которого запустится lsphp.
Пример
lsphp_user_group user1 user1
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_uid_gid
Описание
Задать пользователя (и группу), от которого запустится lsphp (в виде идентификатора, а не имени).
Пример
lsphp_uid_gid 1000 1000
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_apache_uid
Описание
Запускать lsphp для сайта от имени пользователя apache, если не определены ни lsphp_user_group, ни SuexecUserGroup.
Может принимать значения On и Off.
Значение по умолчанию: On.
Пример
lsphp_apache_uid Off
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_waiting_timeout
Описание
Задать время ожидания соединения при запросе запуска lsphp для виртуального хоста.
Чем меньше значение, тем быстрее Apache сможет идентифицировать, что lsphp запустился,
но больше вероятность того, что при задержке запуска сайт вернёт ошибку 503.
Время задаётся в микросекундах.
Значение по умолчанию: 500000 микросекунд, т.е. 0.5 секунды.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_reconnects
Описание
Задать число попыток соединения при запросе запуска lsphp для виртуального хоста.
Чем меньше значение, тем быстрее Apache сможет идентифицировать, что lsphp запустился, но больше вероятность того,
что при задержке запуска сайт вернёт ошибку 503.
Значение по умолчанию:: 20 микросекунд
Задаётся в конфигурационном файле или в VirtualHost.
Суммарное время ожидания запуска lsphp для виртуального хоста рассчитывается как lsphp_reconnects * lsphp_waiting_timeout
и по умолчанию составляет 10 секунд.
lsphp_childs
Описание
Устанавливает значение параметра LSAPI_CHILDREN. Максимальное число обработчиков для пользователя.
Значение по умолчанию: 80
Пример
lsphp_childs 70
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_max_idle
Описание
Устанавливает значение параметра LSAP_IMAX_IDLE.
Число секунд до того, как бездействующий процесс lsphp погаснет.
Значение по умолчанию: 300
Пример
lsphp_max_idle 400
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_pgrp_max_idle
Описание
Устанавливает значение параметра LSAPI_PGRP_MAX_IDLE.
Число секунд до того, как главный процесс lsphp погаснет при отсутствии дочерних процессов.
Значение по умолчанию: 30
Пример
lsphp_max_idle 40
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_process_life
Описание
Устанавливает значение параметра LSAPI_MAX_PROCESS_TIME. Максимальное число секунд, в течении которых будет обрабатываться запрос, потом процесс-обработчик гаснет.
Значение по умолчанию: 300
Пример
lsphp_process_life 400
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_spath
Описание
Путь, где будут располагаться сокеты, соединяющие Apache с запущенными процессами lsphp.
Значение по умолчанию: /tmp/lsphp_httpd/, а для HTTPD-ITK: /tmp/lsphp_httpd_itk/.
Можно задать произвольный путь.
Пример
lsphp_spath /opt/sockets/
Также с модулем поставляется файл для настройки каталогов в очищаемых директориях — /usr/lib/tmpfiles.d/mod_lsphp.conf.
d /tmp/lsphp_httpd/ 750 apache apache
d /tmp/lsphp_httpd_itk/ 755 apache apache
Соответственно, задавая свой каталог, учитывайте, чтобы данные в нём были доступны от пользователя apache,
на чтение и запись или в режиме itk для всех пользователей на чтение и исполнение.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_phprc
Описание
Путь к файлу PHP Runtime coniguration.
Значение по умолчанию: не задан, конфигурация берётся из стандартного php.ini.
Пример
lsphp_phprc /var/www/user1/conf/.user.ini
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_force_restart
Описание
Включить или выключить принудительный останов процессов lsphp при перезапуске Apache.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_secure_scripts
Описание
Проверить, что владельцем исполняемого файла PHP является тот же пользователь, от которого запущен процесс lsphp.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
Взаимодействие с mod_php
mod_lsphp так же как и mod_php читает параметры php_value, php_admin_value, php_flag, php_admin_flag.
Он может читать их как из глобальной конфигурации сервера, так и из виртуального хоста, а также из файла .httaccess (если его поддержка включена),
поэтому параметр php_admin_flag engine off, установленный для mod_php, успешно прочитает и mod_lsphp, и PHP отрабатывать не будет.
Поэтому возможны конфликты между mod_php и mod_lsphp.
Проверка конфигурации виртуального хоста
Если в конфигурационный файл /etc/httpd/conf.d/mod_lsphp.conf добавить следующую директиву:
<Location "/info">
SetHandler lsphp-debug-handler
</Location>
То данный обработчик выведет настройки для виртуального хоста, где была запрошена страница /info.
Будет выдана страница вида:
# lynx --dump http://user1.t/info
Server config
Path to socket not set
PHPRC not set
Connection timeout -2
Reconnect tries -2
Max children -2
Max idle -2
Max process time -2
Poll timeout -2
Stop backend 1
Check permissions 1
Use apache user 1
Coredump 0
Directory config
LSPHP uid 1000
LSPHP gid 1000
PHP params engine 1 adm:1 htaccess:0
Handlers list
application/x-httpd-lsphp /usr/local/bin/lsphp
x-lsphp70 /opt/php70/bin/lsphp
x-lsphp53 /opt/php53/bin/lsphp
x-lsphp71 /opt/php71/bin/lsphp
x-lsphp80 /opt/php80/bin/lsphp
x-lsphp54 /opt/php54/bin/lsphp
x-lsphp72 /opt/php72/bin/lsphp
x-lsphp81 /opt/php81/bin/lsphp
x-lsphp55 /opt/php55/bin/lsphp
x-lsphp73 /opt/php73/bin/lsphp
x-lsphp82 /opt/php82/bin/lsphp
x-lsphp56 /opt/php56/bin/lsphp
x-lsphp74 /opt/php74/bin/lsphp
x-lsphp83 /opt/php83/bin/lsphp
x-lsphp84 /opt/php84/bin/lsphp
Starter security info
-D LSPHPS_ALLOWED_CMD= lsphp
-D LSPHPS_ALLOWED_DIR= /usr/local/bin
-D LSPHPS_DOC_ROOT= /var/www
-D LSPHPS_GID_MIN= 1000
-D LSPHPS_HTTPD_USER= apache
-D LSPHPS_LOG_EXEC= /var/log/httpd/lsphp_mod.log
-D LSPHPS_SAFE_DIR= /opt
-D LSPHPS_UID_MIN= 1000
-D LSPHPS_SAFE_PATH= /usr/local/bin:/usr/bin:/bin
-D LSPHPS_USERDIR_SUFFIX= public_html
Где можно получить все настройки для виртуального хоста. Здесь -2 — значение по умолчанию.
Параметры тонкой настройки
Данные параметры рекомендуетя использовать со значениями по умолчанию.
lsphp_ptime
Описание
Значение в миллисекундах, в течении которого poll-вызов будет ожидать событие в наборе дескрипторов.
Значение по умолчанию: 0.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_allow_coredump
Описание
Устанавливает параметр LSAPI_ALLOW_CORE_DUMP=1, который позволяет lsphp создавать отладочную информацию при сбое в работе.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_connection_details
Описание
Параметр включает и отключает вывод дополнительной информации при соединении.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_custom_env_variable
Описание
Параметр задаёт собственную переменную окружения для lsphp.
lsphp_custom_env_variable TEST test_value
Поддерживает ссылку на значение существующей переменной в формате $ORIG_ENV или ${ORIG_ENV}.
Например, если существует переменная окружения SHL=bash, то можно задать собственную переменную:
lsphp_custom_env_variable MY_OWN_SH $SHL
И для lsphp будет установлена переменная MY_OWN_SH=bash.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_user_init (экспериментальный параметр)
Описание
Добавляет флаг LSPHP_ENABLE_USER_INI=on при запуске lsphp.
Документация LiteSpeed.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_user_init_homedir (экспериментальный параметр)
Описание
Добавляет флаг LSAPI_USERINI_HOMEDIR=1 при запуске lsphp.
Документация LiteSpeed.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_notify (экспериментальный параметр)
Описание
Параметр включает и отключает режим работы lsphp — LSAPI_ACCEPT_NOTIFY = 1.
Документация LiteSpeed.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
lsphp_debug
Описание
Параметр включает и отключает вывод дополнительной информации при обработке запроса. Создаёт обширный вывод в лог, не рекомендуется для действующих серверов, возможно, разве что, кратковременное включение.
Значение по умолчанию: Off.
Задаётся в конфигурационном файле или в VirtualHost.
Установка для ispmanager
Для интеграции с веб-интерфейсом ispmanager необходимо наличие
установленного пакета ls-isp-plugin версии не менее 0.6.2.
И наличие пакета mod_lsphp (а также должны быть установлены и активированы сопутствующие
сервисы ОС МСВСфера Хостинговая редакция, т.е klsd, lsctl, limited-fs и т.д.).
Установка необходимых пакетов (если модуль ОС МСВСфера уже был активирован) выполняется следующей командой:
$ sudo dnf install mod_lsphp ls-isp-plugin
При первичной установке ispamanger и активации модуля ОС МСВСфера все необходимые пакеты будут установлены автоматически. Стандартная установка с помощью модуля описана в статье «Установка на систему с панелью управления ispmanager».
Примечание
Модуль mod_lsphp успешно протестирован и поддерживается для работы с конфигурацией Apache Prefork.
Рекомендуем использовать именно такую конфигурацию Apache. Apache ITK, Worker, Event также поддерживаются, но в данный момент находятся в стадии тестирования.
Интеграция с веб-интерфейсом ispmanager
После установки необходимых пакетов с помощью модуля ОС МСВСфера 9 через интерфейс ispmanager или через командную строку, необходимо зайти в пункт Настройки системы и там включить флажок Включить/выключить модуль lsphp.
В процессе сохранения настроек может появиться сообщение о том, что служба была перезапущена:
Это нормально, т.к. ядро ispmanager должно перечитать информацию от Apache о том, что mod_lsphp подключён и активирован.
Если установка и активация делается не через интерфейс, то необходимо после установки плагина и mod_lsphp выполнить следующие действия.
Перезапустите ispmanager:
$ sudo killall core
Далее перейдите в Настройки ПО и установите необходимые версии
LSPHP.После установки
LSPHPперейдите к пользователю, для которого необходимо включитьmod_lsphp, и разрешите новый обработчикМожет использовать LSPHP.Сохраните изменения.
Перейдите в настройки сайта пользователя и в разделе Обработчик PHP выберите
LSPHP:Нажмите на кнопку Сохранить.
С этого моента сайт пользователя будет работать под управлением LSPHP:
Переход от Apache ITK к Apache Prefork в ispmanager
Для перехода от Apache ITK в Apache Prefork (если ранее уже был установлен mod_lsphp) необходимо выполнить следующие действия.
Перейдите в настройку “Конфигурация ПО” и выберите “Веб-сервер (WWW)”, затем “Настройка работы ПО”.
В открывшемся окне в графе
Apacheвыберите “Не использовать”, т.к. прямой переход отITKкPreforkсовершить нельзя. После того, как переконфигурация ПО завершится, выберите “Apache MPM-Prefork”, а также поставьте галочки напротив пунктов “Модуль PHP” и “PHP-FPM FastCGI”.Нажмите “Сохранить”.
После переконфигурации в командной строке запустите скрипт с параметром:
$ sudo msvsphere_hosting_convert lsisp
Он восстановит все удалённые хостинговые пакеты (которые удалились при переходе в тот момент, когда система была без Apache).
После этого в пункте Настройки системы снова включите модуль mod_lsphp.
Сохраните изменения.
Далее выполните шаги, описанные ранее:
доустановите
LSPHPдля нужных версийPHPв веб-интерфейсе ispmanager;разрешите пользователю использовать
LSPHP;переведите сайт на обработчки
LSPHP.