Высокопроизводительный web-сервер

Материал из wiki.p3.ru

Здесь автором предложен вариант и описана процедура установки высокопроизводительной связки nginx + php-fpm + eaccelerator.

Предлагаю рассмотреть альтернативный вариант lighttpd + php-fpm + xcache. Установка производится на VDS под управлением FreeBSD с дисковым шаблоном "ОС FreeBSD 6.x и самое современное ПО", но будет работать и в других вариантах, хотя процедура установки будет отличаться. Данная связка так же как и основанная на nginx позволяет экономно расходовать оперативную память, повышая эффективность работы VDS.

Используемое ПО

  • Lighttpd (произносится как лайти) - веб-сервер, разрабатываемый с расчетом на быстроту и защищенность, а так же соответствие стандартам. Распространяется по лицензии BSD. Работает как UNIX-подобных системах, так и в Windows. Использует т.н. асинхронную обработку сетевых соединений, благодаря чему загруженность сервера при доступе к файлам на диске не зависит от количества сетевых соединений. Используется такими сервисами как YouTube, Wikipedia, meebo
  • PHP FastCGI Process Manager - патч для PHP, обеспечивающий замену стандартного FastCGI из официального комплекта PHP и позволяющий использовать PHP как FastCGI в высоконагруженных системах.
  • Xcache - быстрый и стабильный оптимизатор для PHP. Оптимизация достигается за счет кэширования PHP в скомпилированном виде. Поддерживает все cvs-ветки PHP PHP_4_3 PHP_4_4 PHP_5_1 PHP_5_2 HEAD(6.x).

Исходные настройки

Предположим, что пользователи вместе с сайтами, которые нужно хостить уже созданы в ISPmanager и успешно обслуживаются apache'ем. Менять структуру не будем, на случай если поэкспериментировав будет принято решение вернуться к стандартным настройкам.

Установка

Lighttpd

cd /usr/ports/www/lighttpd
make install clean

Среди опций конфигурирования обязательно отключаем

  • [ ] IPV6 Enable IPV6 support

Поддержки IPv6 все равно на VDS нет. Остальное по желанию и необходимости.

PHP-FPM

Идем сюда и скачиваем порт для последней стабильной (на текущий момент) версии php-5.2.6_1

tar xzf php5_fpm_526.tar.gz -C /usr/ports/lang/
cd /usr/ports/lang/php5-fpm
make install clean

Опции можно оставить по умолчанию

Xcache

cd /usr/ports/www/xcache
make install clean

Опции оставляем по умолчанию.

Настройка

Lighttpd

cd /usr/local/etc/
cp lighttpd.conf.sample lighttpd.conf
vi lighttpd.conf

Включаем модуль для работы fastcgi

server.modules = ( ....
                  mod_fastcgi,
                   .... )

Остальное по желанию и необходимости.

Описываем все виртуальные хосты, имеющиеся на сервере, меняя пути в зависимости от того какому пользователю они принадлежат примерно следующим образом

$HTTP["host"] =~ "(^|\.)domain\.ru$" { # наш домен с www и без
                server.document-root = "/home/user1/data/www/domain.ru" # Место где лежит контент сайта
                server.errorlog = "/home/user1/data/logs/domain.ru.error.log" # Лог ошибок
                accesslog.filename = "/home/user1/data/logs/domain.ru.access.log" # Лог посещений
                fastcgi.server = ( ".php" =>
                               (( "socket" => "/home/user1/data/sockets/php.sock", # Путь до сокета php-fastcgi
                                  "bin-copy-environment" => (
                                       "HOSTNAME", "PATH", "TMP", "TMPDIR", "TEMP", "OSTYPE", "MACHTYPE", "MALLOC_CHECK_" ),
                                  "broken-scriptfilename" => "enable"
                               ))
                       )
}

Сколько виртуалхостов, столько подобных блоков должно получиться.

PHP-FPM

Создаем директории, в которых будут располагаться сокеты php-fastcgi, свой для каждого пользователя.

mkdir /home/user1/data/sockets/php.sock
chown user1:www /home/user1/data/sockets
chmod 770 /home/user1/data/sockets

Сколько пользователей, столько директорий

В конфигурационном файле нам потребуется описать пулы обработчиков PHP для каждого пользователя

cp php-fpm.conf.dist php-fpm.conf
vi php-fpm.conf

Выглядеть это будет примерно вот так

<section name="pool">
        Это уникальное имя пула
        <value name="name">user1</value>
        Сокет, где слушает FastCGI-сервер
        <value name="listen_address">/home/user1/data/sockets/php.sock</value>
        <value name="listen_options">
               <value name="backlog">-1</value>
               Следующие три строчки - права доступа к сокету
               <value name="owner">user1</value>
               <value name="group">www</value>
               <value name="mode">0660</value>
        </value>
        Следующая секция позволяет задать специфичные для пула опции php.ini
        Здесь же можно подгружать расширения php
        <value name="php_defines">
               <value name="open_basedir">/home/user1/data:.</value>
               <value name="upload_tmp_dir">/home/user1/data/tmp</value>
               <value name="session.save_path">/home/user1/data/tmp</value>
               <value name="error_log">/home/user1/data/logs/domain.ru.error.log</value>
        </value>
        От какого пользователя и группы будет работать php-cgi
        <value name="user">user1</value>
        <value name="group">user1</value>
        <value name="pm">
               <value name="style">static</value>
               <value name="max_children">1</value>
               <value name="apache_like">
                      <value name="StartServers">20</value>
                      <value name="MinSpareServers">5</value>
                      <value name="MaxSpareServers">35</value>
               </value>
        </value>
        <value name="request_execution_timeout">31s</value>
        <value name="rlimit_files">1024</value>
        <value name="rlimit_core">unlimited</value>
        <value name="chroot"></value>
        <value name="chdir"></value>
        <value name="catch_workers_output">yes</value>
        <value name="max_requests">500</value>
        <value name="allowed_clients">localhost</value>
        <value name="environment">
               <value name="HOSTNAME">$HOSTNAME</value>
               <value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
               <value name="TMP">/tmp</value>
               <value name="TMPDIR">/tmp</value>
               <value name="TEMP">/tmp</value>
               <value name="OSTYPE">$OSTYPE</value>
               <value name="MACHTYPE">$MACHTYPE</value>
               <value name="MALLOC_CHECK_">2</value>
        </value>
</section>

Сколько пользователей столько пулов.

Xcache

К сожалению, различные оптимизаторы из-за особенностей их инициализации нельзя загрузить отдельно для каждого пула. Поэтому кэш будет общим для всех. Конфигурационный файл для него присутствует в /usr/local/etc/php/, его можно поправить

vi /usr/local/etc/php/xcache.ini

Здесь можно поправить

; Размер кэша, по умолчанию 64 Мб
xcache.size  = 64M
; Размер кэша переменных, по умолчанию отключен
xcache.var_size  = 0M

Исправляем эти параметры согласно желаниям и необходимости, остальное оставляем по умолчанию.

У этого акселератора есть web-интерфейс на php, лежит в /usr/local/share/examples/xcache/admin/, при желании его можно подключить.

Тестовый запуск

Настало время протестировать нашу конструкцию

apachectl stop
/usr/local/etc/rc.d/php-fpm forcestart
/usr/local/etc/rc.d/lighttpd forcestart

Если все работает переходим к следующему разделу, если нет, проверяем все ли сделано правильно, мануал написан step-by-step и неработоспособность может быть вызвана только ошибкой при выполнении какого-нибудь из действий. Если все-таки все сделано верно, но все равно не работает, добро пожаловать сюда и сюда. Ну а если совсем ничего не помогает

/usr/local/etc/rc.d/lighttpd forcestop
/usr/local/etc/rc.d/php-fpm forcestop
apachectl start

Последние штрихи

Если все работает, нам остается только прописать только что настроенные сервисы в автозапуск при старте системы

vi /etc/rc.conf
apache22_enable="NO"
lighttpd_enable="YES"
php_fpm_enable="YES"


P.S. Стоит помнить, что патч php-fpm находится в стадии активной разработки, со всеми вытекающими последствиями.