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 (экспериментальный параметр)

Описание

Параметр включает и отключает режим работы lsphpLSAPI_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) необходимо выполнить следующие действия.

  1. Перейдите в настройку “Конфигурация ПО” и выберите “Веб-сервер (WWW)”, затем “Настройка работы ПО”.

    Переход на Apache Prefork
  2. В открывшемся окне в графе Apache выберите “Не использовать”, т.к. прямой переход от ITK к Prefork совершить нельзя. После того, как переконфигурация ПО завершится, выберите “Apache MPM-Prefork”, а также поставьте галочки напротив пунктов “Модуль PHP” и “PHP-FPM FastCGI”.

  3. Нажмите “Сохранить”.

После переконфигурации в командной строке запустите скрипт с параметром:

$ sudo msvsphere_hosting_convert lsisp

Он восстановит все удалённые хостинговые пакеты (которые удалились при переходе в тот момент, когда система была без Apache).

После этого в пункте Настройки системы снова включите модуль mod_lsphp.

Активация mod_lsphp

Сохраните изменения.

Далее выполните шаги, описанные ранее:

  • доустановите LSPHP для нужных версий PHP в веб-интерфейсе ispmanager;

  • разрешите пользователю использовать LSPHP;

  • переведите сайт на обработчки LSPHP.