Оптимизация настройки NGINX

NGINX — это быстродействующая замена медленному Apache2. Конечно, NGINX, как и любой другой веб-сервер требует корректной настройки для лучшей производительности.

Требования

  • Свежеустановленный и настроенный Debian 7 или Ubuntu 12 (13).
  • Установленный и настроенный NGINX сервер.
  • Понимание основ настройки Linux

Рабочие процессы и рабочие соединения

Первые две переменные, которые необходимо настроить это рабочие процессы и рабочие соединения. Сначала разберемся за что они отвечают. worker_process — основа настройки и жизнедеятельности NGINX. Эта переменная указывает допустимое количество процессов привязанных к определенному IP адресу и порту. Обычно допускают один процесс на ядро. Указав большее значение, системе мы не навредим, но, скорее всего, остальные процессы просто будут простаивать.

Чтобы определить оптимальное значение worker_process просто посмотрите сколько ядер у вас в системе. Если вы используете настройку настройку DigitalOcean на 512 МБ, то скорее всего у вас одно ядро. При расширении системы, стоит посмотреть сколько у вас ядер и в соответствии с их количеством установить значение worker_process.

Следующая команда нам в этом поможет:

~~~{.bash} grep processor /proc/cpuinfo | wc -l


Допустим вы получили значение 1. Это и есть ответ на вопрос, сколько ядер в вашей системе.
Переменная **worker_connections** определяет допустимое количество одновременных соединений обслуживаемых NGINX. Значение по умолчанию - 768, хотя, если принять во внимание, что один браузер как минимум открывает два соединения, то можно смело разделить это значение пополам.  Поэтому и нужно задать максимально допустимое значение. Проверить ограничения ядра можно при помощи команды:
~~~{.bash}
ulimit -n

На слабых машинах (512 МБ) это значение, скорее всего, будет 1024 — что и можно принять в качестве начального значения.

Обновим нашу настройку

~~~{.bash} sudo nano /etc/nginx/nginx.conf


~~~{.nginx}
# /etc/nginx/nginx.conf
worker_processes 1;
worker_connections 1024;

Помните, что максимальное количество обслуживаемых клиентов умножается на количество ядер в системе. В данном случае мы допускаем 1024 соединений в секунду. Так же это значение в последствии уменьшается директивой keepalive_timeout.

Буфер

Есть ещё небольшая уловка, которой мы можем воспользоваться. Это изменить размер буфера. Если этот размер слишком мал, то NGINX создаёт временный файл, тем самым провоцируя постоянные циклы чтения/записи с диска. Для начала, надо понять что означают следующие переменные.

client_body_buffer_size — размер буфера клиента. Это ограничения связанные с POST запросами. Обычно они используются при отправке форм.

client_header_buffer_size — то же самое, что и предыдущее, только ограничивает размер заголовков. Обычно 2К более чем достаточно.

client_max_body_size — максимальный размер запроса от клиента. При превышении этого ограничения NGINX выдаст ошибку 413 или Request Entity Too Large (размер запроса слишком велик)

large_client_header_buffers — максимальные число и размер буфера для больших заголовков.

~~~{.nginx}

/etc/nginx/nginx.conf

client_body_buffer_size 10K; client_header_buffer_size 2k; client_max_body_size 8m; large_client_header_buffers 2 2k;


### Таймуаты
Установка ограничений по времени также значительно увеличивает производительность.
Переменные **client_body_timeout** и **client_header_timeout** отвечают за установку времени ожидания прежде чем ответить на запрос клиента, будь то основная часть или заголовок. Если же ни того, ни другого отправлено не было, то сервер генерирует ошибку 408 или Request Time Out (время ожидания запроса превышено).
Переменная **keepalive_timeout** устанавливает время жизни соединения с клиентом. Проще говоря, сервер разрывает соединение с клиентом по истечению этого времени.
И наконец, **send_timeout** устанавливается не на весь период передачи ответа, а только на промежуток между двумя операциями чтения. Если клиент по истечению этого времени не выполнял никаких действий, то сервер разрывает соединение с ним.
~~~{.nginx}
# /etc/nginx/nginx.conf
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

Gzip сжатие

Такое сжатие позволяет уменьшить размер сетевых данных, с которыми работает NGINX. Но будьте аккуратны, при достаточно большом значении, сервер начинает довольно сильно нагружать CPU.

~~~{.nginx}

/etc/nginx/nginx.conf

gzip on; gzip_comp_level 2; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/x-javascript text/xml text/css application/xml;


### Кеширование статических файлов
Допускается установить время истечения заголовков для неизменных файлов, при условии что эти файлы часто передаются. Эту переменную можно установить в самом блоке виртуального хоста NGINX.
~~~{.nginx}
# /etc/nginx/sites-available/example-server.conf
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 365d;
}

Вы можете как добавлять, так и исключать типы файлов в массиве.

Ведение логов

NGINX отражает в своем логе каждый поступивший запрос. Если вы пользуетесь сторонними средствами мониторинга, то можете отключить эту функцию. Просто измените значение директивы access_log:

~~~{.nginx}

/etc/nginx/nginx.conf

access_log off


Сохраните и закройте файл, а затем выполните:
~~~{.bash}
sudo service nginx restart

Заключение

В конце концов, хорошо настроенный сервер это тот, который легко поддаётся мониторингу и тонкой настройке. Нельзя выделить уникальные настройки, каждый случай должен быть рассмотрен индивидуально. Более того, если уделить должное внимание быстродействию системы, то следует обратить внимание на балансировку и горизонтальное масштабирование системы. Это всего лишь несколько из многих пунктов по улучшению системы, которые должен знать каждый системный администратор.