Вдогонку к предыдущей статье Настраиваем связку apache2, mod_wsgi, django под ubuntu, centos захотелось мне проверить как себя поведет в этой связке nginx.
Nginx представляет собой легковесный, асинхронный HTTP-сервер. Более полный список возможностей nginx доступен тут или на сайте разработчика.
Из-за особенности архитектуры (асинхронная обработка запросов) и меньшей прожорливости к ресурсам сервера (по сравнению с apache) nginx чаще всего применяют для отдачи статики, либо для замены apache как обработчика динамических страничек. Если с первым вариантом все гладко, как в плане установки/настройки так и в плане конечной выгоды, то со вторым вариантом есть пара нюансов.
Во-первых, mod_wsgi для nginx давно не обновлялся и что бы заставить работать последний nginx с mod_wsgi придется патчить mod_wsgi. Во-вторых, из-за асинхронной обработки запросов, при резком всплеске запросов к сайту и больших по времени вычислений nginx начнет резать все обращения большие за число worker_processes * worker_connections (параметры настройки nginx), в то время как apache просто будет их ставить в очередь. Про эту особенность написано тут и тут.
В связи с этим все дальнейшие повествование о nginx будет как о сервере для отдачи статики (frontend), а apache будет обслуживать динамические странички (backend).
Установка под Ubuntu 9.10
Поставить можно либо с репозитариев либо с исходников. Первый способ самый простой:
sudo apt-get install nginx
Второй способ еще проще :) + у нас будет последняя версия nginx. Для начала установим нужные зависимости:
apt-get install libpcre3-dev build-essential libssl-dev
Качаем последнюю версию nginx и распаковываем.
cd ~/sources/ wget http://sysoev.ru/nginx/nginx-0.8.36.tar.gz tar -zxvf nginx-0.8.36.tar.gz cd nginx-0.8.36/
Устанавливаем.
./configure --prefix=/opt/nginx make sudo checkinstall
Последняя команда собирает сорцы в deb-пакет и ставит его, потом все можно зачистить обычными средствами apt-get remove nginx. Ставим checkinstall так: sudo apt-get install checkinstall.
Устанавливаем скрипт для управления nginx.
wget http://library.linode.com/web-servers/nginx/installation/reference/init-deb.sh mv init-deb.sh /etc/init.d/nginx chmod +x /etc/init.d/nginx /usr/sbin/update-rc.d -f nginx defaults
Для запуска nginx вводим:
/etc/init.d/nginx start
Теперь создаем папку /opt/ngix/sites-enabled в которой будем хранить все виртуальные хосты. В /opt/nginx/conf/nginx.conf, в блок http {} добавляем строчку для подключения всех виртуальных хостов из папки /opt/ngix/sites-enabled:
include /opt/nginx/sites-enabled/*;
У меня получился такой конфиг nginx:
user www-data; worker_processes 2; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /opt/nginx/conf/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; keepalive_timeout 65; tcp_nopush on; tcp_nodelay on; gzip on; include /opt/nginx/conf.d/*.conf; include /opt/nginx/sites-enabled/*; }
Файл dev.conf - конфиг виртуального хоста, лежит в папке /opt/nginx/sites-enabled:
server { listen 127.0.0.1:80; server_name dev.local; server_tokens off; access_log /var/www/dev/logs/nginx_access.log; error_log /var/www/dev/logs/nginx_error.log; location / { proxy_pass http://127.0.0.2:80; include /opt/nginx/conf/proxy.conf; } location /media { root /opt/django/contrib/admin; } location /static { root /var/www/dev; expires 24h; } }
Файл proxy.conf - содержит параметры для nginx, когда он работает как frontend для apache (или другого сервера, обрабатывающего динамику). Файл лежит в папке /opt/nginx/conf.d/.
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
C настройкой nginx покончено, осталось указать apache новый ip:port, на который nginx перенаправлят запросы для динамики. Для этого правим файл /etc/apache2/ports.conf
NameVirtualHost *:80 Listen 127.0.0.2:80
Запускаем браузер и любуемся результатом.
Установка под Centos 5.4
Для установки nginx под Centos 5.4 (последняя версия на момент написания поста) можно пойти двумя путями:
Обновляемся и устанавливаем нужные зависимости:
yum update yum groupinstall "Development Tools" yum install zlib-devel wget openssl-devel pcre pcre-devel
Скаичваем последнюю версию nginx и собираем ее.
cd ~/sources/ wget http://sysoev.ru/nginx/nginx-0.8.36.tar.gz tar -zxvf nginx-0.8.36.tar.gz cd nginx-0.8.36/ ./configure --prefix=/opt/nginx make make install
Устанавливаем скрипт для управления nginx.
wget http://library.linode.com/web-servers/nginx/installation/reference/init-rpm.sh mv init-rpm.sh /etc/rc.d/init.d/nginx chmod +x /etc/rc.d/init.d/nginx chkconfig --add nginx chkconfig --level 35 nginx on
Все, nginx установлен. Теперь можно запустить nginx и посмотреть на доступный по умолчанию сайт:
/etc/init.d/nginx start curl http://127.0.0.1
По материалам: Host Websites with nginx on CentOS 5
Связка frontend + backend настраивается также само как в разделе с ubuntu.
Тестирование
Тестирование проводилось с помощью утилиты Autobench и по ее результатам строились графики с помощью утилиты bench2graph (входит в комплект с Autobench).
Замеры проводились с такими параметрами:
autobench --single_host --host1 calza.local --uri1 / --quiet --low_rate 20 --high_rate 200 --rate_step 20 --num_call 10 --num_conn 2000 --timeout 5 --file calza.tsv
Ниже приводится два графика, первый, для apache в роли обработчика статики и динамики, второй, для apache (backend) + nginx (frontend).
Тестирование проводились в академических условиях: ubuntu 9.10, box с двухядерным процом, 2 ГБ RAM, настройки особо не тюненговались, только то что приведено в этом посте и предыдущем.
Еще тестирования:
Дополнительное чтиво