Практические советы по тюнингу веб-сервера NGINX

Здесь может быть ваша реклама

Советы и примеры по тюнингу nginx показаны на базе операционной системы FreeBSD, но они подойдут для любой системы семейства Linux.

Все действия нужно выполнять от суперпользователя, поэтому для удобства, сразу зайдем в систему под ним:
$ su

1. Установка NGINX

Когда речь заходит о тюнинге, установка из пакетов или портов неприемлема. Необходимо выполнять сборку и установку из исходников.

Для начала, установите пакет pcre, иначе сборка завершится ошибкой:
# pkg install pcre
Скачайте последнюю версию nginx (актуальную ссылку можно посмотреть по адресуhttp://nginx.org/ru/download.html):
# fetch http://nginx.org/download/nginx-1.8.0.tar.gz
* На момент написания статьи актуальная версия nginx — 1.8.0
** В Linux команда для скачивания не fetch, а wget

Распакуйте скачанный архив:
# tar -xvf nginx-1.8.0.tar.gz
И перейдите в распакованную директорию:
# cd nginx-1.8.0
Сконфигурируйте исходники для установки:
# ./configure \
--prefix=/usr/local/etc/nginx \
--with-cc-opt='-I /usr/local/include' \
--with-ld-opt='-L /usr/local/lib' \
--conf-path=/usr/local/etc/nginx/nginx.conf \
--sbin-path=/usr/local/sbin/nginx \
--pid-path=/var/run/nginx.pid \
--error-log-path=/var/log/nginx-error.log \
--user=www \
--group=www \
--http-client-body-temp-path=/var/tmp/nginx/client_body_temp \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp \
--http-proxy-temp-path=/var/tmp/nginx/proxy_temp \
--http-scgi-temp-path=/var/tmp/nginx/scgi_temp \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp \
--http-log-path=/var/log/nginx-access.log \
--with-http_ssl_module \
--with-file-aio \
--with-pcre \
--with-http_stub_status_module \
--without-http_charset_module \
--without-http_ssi_module \
--without-http_userid_module \
--without-http_autoindex_module \
--without-http_geo_module \
--without-http_map_module \
--without-http_split_clients_module \
--without-http_referer_module \
--without-http_empty_gif_module \
--without-http_browser_module \
--without-http_upstream_hash_module \
--without-http_upstream_ip_hash_module \
--without-http_upstream_least_conn_module \
--without-http_upstream_keepalive_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

* Обратите особое внимание на опции —prefix, —with-cc-opt, —with-ld-opt, —conf-path, —sbin-path, —user, —group — в Linux их можно не указывать.
** Данный список опций подойдет для большинства серверов, но не помешает узнать о всех возможностях при помощи команды ./configure —help

Теперь запустите сборку дистрибутива из исходника:
# make
И установите nginx:

# make install
# echo 'nginx_enable="YES"' >> /etc/rc.conf
Во FreeBSD необходимо разрешить запуск демона nginx:

Теперь можно запустить и проверить наш веб-сервер:
# nginx

2. Настройка NGINX

Продолжим тюнинг nginx, настроив несколько основных параметров, отвечающих за количество обрабатываемых соединений и сроки их поддержания.

Пример настроенного nginx.conf:
worker_processes  auto;
worker_priority     -2;events {
worker_connections  2048;
}http {
...
keepalive_timeout          45;
reset_timedout_connection  on;
client_body_timeout        35;
send_timeout               30;
...
}

worker_processes, по умолчанию 1. Определяет количество рабочих процессов. Обычно, выставляют равному числу ядер, но в новых версиях его лучше устанавливать в auto.

worker_priority, по умолчанию 0. Задает приоритет рабочих процессов от -20 до 20 (отрицательное число означает более высокий приоритет). Ему стоит отдать чуть больший приоритет (-2). Это нужно для того, чтобы при сильной нагрузке на скриптовую часть сайта или DDoS атаке, nginx продолжал обрабатывать запросы и отдавать статику.

worker_connections, по умолчанию 512. Устанавливает максимальное количество соединений одного рабочего процесса, то есть nginx будет обрабатывать worker_processes * worker_connections, остальные запросы ставить в очередь. Следует выбирать значения от 1024 до 4096. В нашем примере — 2048.

keepalive_timeout, по умолчанию 75. Отвечает за максимальное время поддержания keepalive-соединения, в случае, если пользователь по нему ничего не запрашивает. Для современных систем, стоит выставить от 30 до 50. В нашем случае 45.

reset_timedout_connection, по умолчанию off. Если клиент перестал читать страницу, Nginx будет сбрасывать соединение с ним.

client_body_timeout, по умолчанию 60. Будет ждать выставленное количество секунд тело запроса от клиента, после чего сбросит соединение. Значение по умолчанию слишком высокое и мы его снизили до 35.

send_timeout, по умолчанию 60. Если клиент прекратит чтение ответа, Nginx подождетвыставленное количество секунд и сбросит соединение.

3. Оптимизация работы с файлами

Пример настроенного nginx.conf:
http {


sendfile      on;
aio           on;
tcp_nopush    on;

}
sendfile позволяет использовать более совершенный системный вызов, который обеспечивает прямую передачу файла (без системных вызовов read + write).

aio включает использование асинхронного обращения к файлам, что избавит от очередей запросов.

tcp_nopush позволит передавать заголовок ответа и начало файла в одном пакете.

Также вы можете найти инструкции по тюнингу, где говорится об опции tcp_nodelay. Ее менять не нужно, так как по умолчанию она уже включена.

Для того, чтобы aio заработал в FreeBSD, необходимо выполнить следующее.

Подгружаем модуль aio в ядро системы:
# kldload aio
Для автоматической подгрузки модуля во время включения нашего веб-сервера:
# ee /boot/loader.conf
...

aio_load=»YES»

4. Логирование

Если отключить логирование всех подключений к nginx, можно немного снизить нагрузку на дисковую систему. Но при этом стоит оставить логирование критических ошибок.

Пример настроенного nginx.conf:
error_log /var/log/nginx-error.log crit;

http {

access_log off;
Само собой, не стоит отключать логирование на хостинге или если вы предоставляете доступ к веб-сервису третьим лицам.

5. Сжатие

Это один из самых эффективных методов ускорить ответ от вашего веб-сервера nginx.

Пример настроенного nginx.conf:
http {

gzip                on;
gzip_min_length     1000;
gzip_proxied        expired no-cache no-store private auth;
gzip_types          application/x-javascript text/plain application/xml text/css image/svg+xml;
gzip_disable        «msie6»;


gzip включает сжатие.

gzip_min_length устанавливает минимальную длину ответов, для которых будет применяться сжатие. По умолчанию 20, но имеет смысл поставить больше, так как постоянное сжатие приведет к повышению нагрузки на процессоры сервера и клиента.

gzip_proxied перечисляет параметры проксированных запросов, для которых будет разрешено сжатие.

gzip_types по умолчанию включено сжатие для ответов типа текст. В данном параметре можно перечислить все необходимые типы ответов.

gzip_disable запрещает для перечисленных параметров заголовка User-Agent сжатие. В данном примере для Internet Explorer 6 сжатие применяться не будет (данный браузер не умеет принимать сжатые ответы).

6. Настройка метода select

В Linux и FreeBSD используются свои методы обработки соединений. На данный момент наиболее эффективными являются epoll (Linux) и kqueue (FreeBSD).

Пример nginx.conf для FreeBSD:
events {
...
use kqueue;
}

Пример nginx.conf для Linux:
events {
...
use epoll;
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *