Высокопроизводительный web-сервер
Здесь автором предложен вариант и описана процедура установки высокопроизводительной связки 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 находится в стадии активной разработки, со всеми вытекающими последствиями.