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

Материал из Энциклопедия хостинга
Перейти к: навигация, поиск

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

Важно отметить, что используемая связка весьма экономно расходует память, и позволяет более эффективно использовать ресурсы вашего VDS.

Содержание

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

  • nginx (engine x) — это свободный Веб-сервер и почтовый прокси-сервер, работающий на Unix-подобных операционных системах (тестировалась сборка и работа на FreeBSD, GNU/Linux, Solaris, Mac OS X). Разрабатывается Игорем Сысоевым с 2002-го года для компании Rambler и постоянно модернизируется. Осенью 2004 года вышел первый публично доступный релиз.
  • php-fpm - это патч для PHP, для использования PHP как FastCGI процесса в высоконагруженных системах. Устраняет ряд проблем, мешающих использовать PHP в режиме FastCGI.
  • eAccelerator является PHP-акселератором, основное назначение которого состоит в кэшировании бинарного представления кода. Он увеличивает производительность PHP скриптов за счет их кеширования в скомпилированном состоянии, тем самым предотвращая их постоянную перекомпиляцию. В результате происходит увеличение скорости их выполнения. eAccelerator обычно уменьшает нагрузку на сервер и увеличивает скорость исполнения PHP кода на величину от 1 до 10 раз.

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

Предполагается, что домен, на котором будет работать данная связка, имеет адрес mydomain.com, а корневым www каталогом является /home/www. Также использована возможность php-fpm изолировать (chroot) свои процессы в домашнем каталоге, для дополнительной безопасности (при взломе через уязвимые скрипты потери будут минимальны).

Установка

Nginx

cd /usr/ports/www/nginx-devel
make install clean

В большинстве конфигураций необходимо отметить следующие пункты:

  • [X] HTTP_MODULE
  • [X] HTTP_PERL_MODULE
  • [X] HTTP_REWRITE_MODULE

а если нужна поддержка SSL, то и

  • [X] HTTP_SSL_MODULE

php-fpm

# cd /usr/ports/lang/php55
# make config-recursive

Phpfpm.png

# make install clean

eAccelerator

cd /usr/ports/www/eaccelerator
make install clean
mkdir /tmp/eaccelerator
chown www /tmp/eaccelerator
chmod 0700 /tmp/eaccelerator

если в /etc/rc.conf установлено clear_tmp_enable="YES" то лучше

mkdir /var/tmp/eaccelerator
chown www /var/tmp/eaccelerator
chmod 0700 /var/tmp/eaccelerator

иначе при перезагрузке папка "eaccelerator" удалится

Редактируем /usr/local/etc/php.ini:

; eAccelerator

; Подключаем расширение
zend_extension="eaccelerator.so"

; Включаем eAccelerator
eaccelerator.enable="1"

; Максимальный размер кеша в мегабайтах
eaccelerator.shm_size="64"

; Корневой каталог для хранения кеша
eaccelerator.cache_dir="/tmp/eaccelerator"

; Встроенный оптимизатор кода
eaccelerator.optimizer="1"

; Включаем проверку модификации PHP файлов. 
eaccelerator.check_mtime="1"

; Режим отладки
eaccelerator.debug="0"

; Фильтр файлов, которые должны быть закэшированы
eaccelerator.filter=""

; Максимально допустимое значение которое может быть
; отправлено в разделяемую память. По-умолчанию - без ограничений.
eaccelerator.shm_max="0"

; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для этого
; не окажется места, он попытается удалить файлы, которые
; не были запрошены в течении последних "shm_ttl" секунд.
; По-умолчанию, это значение равно "0" - не удалять ничего.
eaccelerator.shm_ttl="3600"

; Когда акселлератору потребуется отправить в разделяемую
; память какой-то объект и при этом в памяти для этого
; не окажется места, он попытается удалить старые скрипты,
; если предыдущие такие попытки были не больше, чем
; "shm_prune_period" секунд назад.По-умолчанию, это значение
; равно "0" - не удалять ничего.
eaccelerator.shm_prune_period="0"

; Включить или отключить кеширование скомпиленных скриптов
; _только_ на диск. Этот параметр не влияет на данные сессий
; и кеширование контента. По-умолчанию, значение 0, что означает
; что данные будут кешироваться и в памяти и на диске.
eaccelerator.shm_only="0"

; Включить или отключить сжатие закешированного контента.
; По-умолчанию, "1" - сжимать.
eaccelerator.compress="1"

; Уровень сжатия. По-умолчанию, "9" - максимум.
eaccelerator.compress_level="9"

Настройка конфигурации

Настройка конфигурации php-fpm

Редактируем файл /usr/local/etc/php-fpm.conf:

<?xml version="1.0" ?>
<configuration>
         <section name="global_options">
                <value name="pid_file">/var/run/php-fpm.pid</value>
                <value name="error_log">/var/log/php-fpm.log</value>
                <value name="log_level">notice</value>
                <value name="emergency_restart_threshold">10</value>
                <value name="emergency_restart_interval">1m</value>
                Time limit on waiting child's reaction on signals from master
                <value name="process_control_timeout">5s</value>
               <value name="daemonize">yes</value>
         </section>

        <workers>
                Main pool
                <section name="pool">
                        <value name="name">main</value>
                        <value name="listen_address">127.0.0.1:3000</value>
                        <value name="listen_options">
                               <value name="backlog">-1</value>
                                <value name="owner"></value>
                                <value name="group"></value>
                                <value name="mode">0666</value>
                        </value>
                        <value name="php_defines">
                        </value>
                        <value name="user">www</value>
                        <value name="group">www</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>
                       chroot в домашнюю директорию
                       <value name="chroot">/home/www</value>
                       <value name="chdir"></value>
                       <value name="catch_workers_output">yes</value>
                       <value name="max_requests">500</value>
                       <value name="allowed_clients">127.0.0.1</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>
       </workers>
</configuration>

Позднее могут быть добавлены дополнительные секции pool для виртуальных доменов, причем благодаря гибкости php-fpm, каждый из пулов может быть изолирован при помощи chroot. Это обеспечивает дополнительную безопасность (при взломе через уязвимые php скрипты потери будут минимальны).

Стартуем php:

/usr/local/etc/rc.d/php-fpm start

Добавляем запуск в /etc/rc.conf:

php_fpm_enable="YES"

Настройка конфигурации nginx

Редактируем файл /usr/local/etc/nginx/nginx.conf:

user  www;
worker_processes  2;

pid             /var/run/nginx.pid;
error_log       /var/log/nginx-error.log warn;

events {
    worker_connections  1024;
    use kqueue;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # log options
    log_format main      '$remote_addr - $remote_user [$time_local] '
                         '"$request" $status $bytes_sent '
                         '"$http_referer" "$http_user_agent" '
                         '"$gzip_ratio"';

    # nginx options
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    server_tokens       off;

    # fastcgi
    fastcgi_intercept_errors    on;

    server {
        listen       80;
        server_name  mydomain.com;

        access_log  /var/log/nginx.mydomain.log main;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:3000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
            include        fastcgi_params;
        }

        location / {
            root   /home/www/;
            index  index.php index.html index.htm;
        }
    }
}

Стартуем nginx:

/usr/local/etc/rc.d/nginx start

Добавляем запуск в /etc/rc.conf:

nginx_enable="YES"


Для повышения производительности лучше использовать сокеты. Для этого отредактируйте строчку в php-fpm.conf следующим образом: <value name="listen_address">/tmp/php-fpm.sock</value>

Настройка nginx будет выглядеть вот так: fastcgi_pass "unix:/tmp/php-fpm.sock";


Сервер готов к работе!


Смотрите также: второй вариант

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты

Заметили ошибку?

Выделите ее и нажмите CTRL+ENTER