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

Обсуждаем, помогаем.

Модераторы: Conteo, Костик

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

Сообщение Conteo » 20 апр 2010, 16:14

Продолжаю делать всякие полезности для держателей серверов на правильном ПО.
Сегодня мы поговорим о поднятии высокопроизводительно веб-сервера на основе nginx и турбированного патчем fpm php-демона.
Сейчас ни для кого не секрет, что nginx является чуть ли не идеальным фронт-эндом. В качестве бек-энда сейчас часто используется старый добрый веб-сервер Apache, но при серьезных нагрузках на машину (высокая посещаемость сайта или выполнение требовательных к ресурсам задач) апач ведет себя как корова на льду: виснет, падает, жрет память, но не работает как надо. Да, апач хорош, ибо искаропки умеет php, но это только для баловства. Как веб-сервер для серьезных задач он не подходит категорически.
Сегодня речь пойдет о связке nginx+php-fpm как замена апачу.
Вы спросите: зачем заменять апач, если он и так хорош? За ответом я пошлю вас в гугл смотреть тесты производительности apache (1 и 2 версии. кстати 1.3 ведет себя живее чем 2) с упомянутой выше связкой.
Предупреждаю сразу: если посещаемость вашего сайта(ов) не велика, то советую пройти мимо этой статьи и продолжать использовать apache в качестве бек-энда для генерации динамики. Но можете прочитать статью, настроить, посмотреть и в принципе не увидеть разницы.
Делать все будем на CentOS 5 версии. На других дистрибутивах ничего сильно отличающегося нет, поэтому вполне подойдет и для остальных (за исключением того, что придется искать нужные пакеты на стороне и возможно в ручную патчить php). Хотел написать еще и для Gentoo, но пользователи данного дистрибутива и без того умные люди (ибо дурак не смог бы с ней работать), поэтому сами смогут решить задачу.
Поехали.
Проверяем наличие доступа к репозиторию EPEL. Если вы используете репозитории SAN, то значит все хорошо.
Устанавливаем nginx:
Код: Выделить всёРазвернуть
# yum install nginx

Подключаем репозиторий Varien следующим образом:
Код: Выделить всёРазвернуть
# cd /etc/yum.repos.d
# wget http://mirrors.nslp.ru/centos/nslp.repo

Далее выполняем попытку обновления системы:
Код: Выделить всёРазвернуть
# yum -y update

Если у вас уже стоят версии php младше 5.2.13 или php ручной компиляции, то ничего страшного. При обновлении установятся свежие (относительно) и главное вполне стабильные php-пакеты.
Если php не стоит (странно О_о), то устанавливаем:
Код: Выделить всёРазвернуть
# yum install php php-gd php-mbstring php-mcrypt

Устанавливаем гвоздь нашей программы:
Код: Выделить всёРазвернуть
# yum install php-fpm

Рассматривать установку и настройку mysql мы не будем. Сами разберетесь.
Теперь у нас имеется легковесный веб-сервер и пропатченая версия php-cgi. Но nginx вообще не умеет генерировать динамику (коими являются php-скрипты), поэтому начнем прикручить php-fpm к nginx.
Для начала открываем конфиг php-fpm и приводим его в божеский вид. Описывать каждую строчку не буду. Если интересно, то это вам задание на самостоятельную подготовку.
Код: Выделить всёРазвернуть
# nano /etc/php-fpm.conf

Приводим конфиг к следующему виду:
Код: Выделить всёРазвернуть
<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>
                <value name="process_control_timeout">5s</value>
                <value name="daemonize">yes</value>
        </section>
        <workers>
                <section name="pool">
                        <value name="name">default</value>
#                        <value name="listen_address">/tmp/fcgi.sock</value>
                         <value name="listen_address">127.0.0.1:9000</value>
                        <value name="listen_options">
                                <value name="owner"></value>
                                <value name="group"></value>
                                <value name="mode">0666</value>
                        </value>
                        <value name="php_defines">
                        </value>
                        <value name="user">nginx</value>
                        <value name="group">nginx</value>
                        <value name="pm">
                                <value name="style">static</value>
                                <value name="max_children">10</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_terminate_timeout">0s</value>
                        <value name="request_slowlog_timeout">0s</value>
                        <value name="slowlog">logs/slow.log</value>
                        <value name="rlimit_files">1024</value>
                        <value name="rlimit_core">0</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">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>

Обратите внимание на строчку
Код: Выделить всёРазвернуть
<value name="listen_address">127.0.0.1:9000</value>

Это адрес и порт, на котором будет висеть и слушать php-демон. Закомментированная строчка выше- использование unix-сокета для той же задачи. Вопрос о том, что эффективнее спорный: одни говорят что вешание демона на сокет эффективнее, другие считают наоборот.
Пробуем запустить php
Код: Выделить всёРазвернуть
# service php-fpm start

или
Код: Выделить всёРазвернуть
# /etc/init.d/php-fpm start

Если в консоли появилось нечто вроде
Код: Выделить всёРазвернуть
[root@server etc]# /etc/init.d/php-fpm start
Запускается php-fpm:                                       [  OK  ]

значит все хорошо и php в данный момент висит на 9000 порту ожидая запросов.
Теперь настраиваем nginx на перенаправление запросов к php-страницам на php-fpm.
Конфиг /etc/nginx/nginx.conf будет приблизительно следующим:
Код: Выделить всёРазвернуть
user              nginx;
worker_processes  1;

error_log         /var/log/nginx/error.log;
#error_log        /var/log/nginx/error.log  notice;
#error_log        /var/log/nginx/error.log  info;

pid               /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] $request '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  mydomain.com;
        location / {
            root   /var/www/mydomain;
            index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/mydomain$fastcgi_script_name;
            include        fastcgi_params;
          }
        }
    }
}

В данном примере наш сайт лежит в дериктории /var/www/mydomain и имеет адрес mydomain.com. Указана корневая дериктория хоста (/var/www/mydomain). Далее, если идет запрос на php-страницу, то nginx переадресовывет его на php-cgi, который висит на 9000 порту. После обработки запроса php-демоном, nginx возвращает ответ клиенту.
Вот в принципе и все.
Добавляем nginx и php-fpm в автозагрузку
Код: Выделить всёРазвернуть
# chkconfig --level 345 add nginx on
# chkconfig --level 345 add php-fpm on

Вот собственно и все. Не используя apache мы получили неплохой и производительный веб-сервер.
Статья полностью написана мною. При перепечатке или копировании ссылка на данную статью и автора обязательна.
Замечания и предложения приветствуются.
Изображение
Пользователи федоры - как тараканы. Слабые духом и нервами давно вымерли, а оставшихся в живых уже ничем не взять.
Аватара пользователя
Conteo
Активный участник
 
Сообщения: 1813
Зарегистрирован: 14 мар 2008, 13:21
Откуда: Саратов, Заводской район
Домен: http://conteo.vfose.ru

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение DPX-Infinity » 21 апр 2010, 22:28

насчёт сокетов. файловые сокеты немного более эффективны, потому что не используют сетевую подсистему, в отличие от TCP/IP-шных, хоть и лупбэк-интерфейс не то чтобы совсем сетевой :)
а так статья отличная, молодца.
Изображение
Переходите на Jabber! За ним будущее!
Желаю вам опенсорса!
Аватара пользователя
DPX-Infinity
Активный участник
 
Сообщения: 723
Зарегистрирован: 02 сен 2007, 20:45
Откуда: Саратов

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение Conteo » 22 апр 2010, 08:47

Я про то и говорю, что одни говорят так, другие с точностью до наоборот.
В прочем кто желает вешать php на файловый сокет, то отличия будут в следующем:
Конфигурация php-fpm.conf
Код: Выделить всёРазвернуть
                <section name="pool">
                        <value name="name">default</value>
                        <value name="listen_address">/tmp/fcgi.sock</value>
...

Конфигурация nginx
Код: Выделить всёРазвернуть
user              nginx;
worker_processes  1;

error_log         /var/log/nginx/error.log;
#error_log        /var/log/nginx/error.log  notice;
#error_log        /var/log/nginx/error.log  info;

pid               /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] $request '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  mydomain.com;
        location / {
            root   /var/www/mydomain;
            index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   unix:/tmp/fcgi.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/mydomain$fastcgi_script_name;
            include        fastcgi_params;
          }
        }
    }
}
Изображение
Пользователи федоры - как тараканы. Слабые духом и нервами давно вымерли, а оставшихся в живых уже ничем не взять.
Аватара пользователя
Conteo
Активный участник
 
Сообщения: 1813
Зарегистрирован: 14 мар 2008, 13:21
Откуда: Саратов, Заводской район
Домен: http://conteo.vfose.ru

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение AVX » 22 апр 2010, 12:08

забыли про несколько моментов:

Код: Выделить всёРазвернуть
# chkconfig --level 345 add nginx on

где это будет находиться (в каком файле) после выполнения? что-то пробовал просто /usr/local/nginx/nginx добавить в /etc/rc.d/rc.local - не запускается, хотя в кроне та же строка выполняется и nginx запускается нормально. Как правильно прописать в rc.local?

И самое главное: нет упоминания про такие мощные возможности, как распределение нагрузки между несколькими серверами, с указанием "весов" серверов и т.п. А возможности проксирования? - тоже очень нужная штука! причем для разного содержимого, или для разных страниц можно указать разные сервера, откуда все это будет браться.

ИМХО, можно создать еще статейку - организация зеркала сайта в ФОСе. Т.е. пользователь подключается, например, к yandex.vfose.ru, и видит страничку yandex.ru, не имея при этом доступа в инет. Всего надо для этого - один комп с безлимиткой, подключенный через ВТ, и nginx, настроенный на проксирование на указанный адрес. Конфиг там всего ничего - несколько строк поменять нужно в стандартном.
AVX
Активный участник
 
Сообщения: 227
Зарегистрирован: 07 ноя 2008, 23:36
Откуда: Пугачев
Домен: http://pug-cs.ru/

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение Conteo » 22 апр 2010, 16:08

Это лишнее. Проксирование дело не сложное, так что можно и самому разобраться. C весом тоже ничего сложного нет. Если вы не заметили, то суть данной статьи совсем в другом. Пишите свою статью, с блекджеком и шлюхами :) Будем только рады.
Насчет того, где хранится автозапуск, то это зависит от дистрибутива. В вашем дистрибутиве вы должны сами знать где что находится. В CentOS запись строки
Код: Выделить всёРазвернуть
/etc/init.d/nginx start
'
в файл /etc/rc.d/rc.local гарантированно сработает.
В генте делается тоже легко
Код: Выделить всёРазвернуть
#rc-update add nginx default
Изображение
Пользователи федоры - как тараканы. Слабые духом и нервами давно вымерли, а оставшихся в живых уже ничем не взять.
Аватара пользователя
Conteo
Активный участник
 
Сообщения: 1813
Зарегистрирован: 14 мар 2008, 13:21
Откуда: Саратов, Заводской район
Домен: http://conteo.vfose.ru

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение DPX-Infinity » 22 апр 2010, 23:06

rc.local использовать для init-сервисов - дело неправильное. в дженте и арче с этим нет проблем вообще - в дженте этим рулит rc-config (или rc-update если нету baselayout-2 и openrc), а в арче - поправить rc.conf. в других системах, в частности, в центосе, этим заведует жуткая схема симлинков на разных ранлевелах. вообще говоря, chkconfig, насколько я понимаю, это всё в достаточной степени автоматизирует, так что одного его достаточно, и rc.local править не надо.
Изображение
Переходите на Jabber! За ним будущее!
Желаю вам опенсорса!
Аватара пользователя
DPX-Infinity
Активный участник
 
Сообщения: 723
Зарегистрирован: 02 сен 2007, 20:45
Откуда: Саратов

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение AVX » 23 апр 2010, 08:25

все понял, спасибо.
Короче, если правильно - нужно юзать chkconfig, если в файлик - то не просто nginx указать, а nginx start
AVX
Активный участник
 
Сообщения: 227
Зарегистрирован: 07 ноя 2008, 23:36
Откуда: Пугачев
Домен: http://pug-cs.ru/

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение Conteo » 23 апр 2010, 16:20

AVX
да
DPX-Infinity
Есть ситуации, когда нет возможности использовать сервис, но при старте системы необходимо выполнить определенную команду. Конечно можно использовать задачу в кроне вроде
Код: Выделить всёРазвернуть
@reboot /etc/init.d/nginx start

но не стоит забывать, что крон так же являетчся программой. А rc.local есть скрипт, который проверяется последним при запуске. Поэтому его вполне можно использовать, если использование сервиса невозможно или затруднительно.
Изображение
Пользователи федоры - как тараканы. Слабые духом и нервами давно вымерли, а оставшихся в живых уже ничем не взять.
Аватара пользователя
Conteo
Активный участник
 
Сообщения: 1813
Зарегистрирован: 14 мар 2008, 13:21
Откуда: Саратов, Заводской район
Домен: http://conteo.vfose.ru

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение server801 » 23 апр 2010, 20:48

Код: Выделить всёРазвернуть
sysv-rc-conf

это в дебиане.но вообще с вашим вариантов насчет rc.local не есть гуд.для автозагрузки нужно поместить исполняемый скрипт в директорию /etc/init.d а потом сделать симлинк в /etc/rc2.d.
ИзображениеИзображение
Изображение
Аватара пользователя
server801
Активный участник
 
Сообщения: 511
Зарегистрирован: 14 янв 2009, 14:28

Re: Высокопроизводительный веб-сервер на основе NGINX

Сообщение DPX-Infinity » 23 апр 2010, 23:39

Conteo писал(а):Есть ситуации, когда нет возможности использовать сервис, но при старте системы необходимо выполнить определенную команду.

rc.local использовать для init-сервисов - дело неправильное.

ессно, рц.локал предназначен для выполнения команд, которые другим способом не выполнишь :)

а в убунте, кстати, этим заведует update-rc.d, но она кривая. есть ещё кучка других конфигураторов, достаточно погуглить.
Изображение
Переходите на Jabber! За ним будущее!
Желаю вам опенсорса!
Аватара пользователя
DPX-Infinity
Активный участник
 
Сообщения: 723
Зарегистрирован: 02 сен 2007, 20:45
Откуда: Саратов

След.

Вернуться в *nix

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

cron