Оптимальная настройка NGINX

Оптимальная настройка NGINX

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

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

Оптимизация параметров

Обработка соединений

Максимальное количество соединений, которые Nginx может обслуживать одновременно определяются произведением двух параметров:

1
Всего соединений = worker_processes x worker_connections

nginx

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

1
worker_processes auto;

Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096.

1
worker_connections 1024;

Директива use устанавливает метод выбора соединений. Для разных операционных систем нужно использовать разные методы.

Linux

1
use epoll

Freebsd

1
use kqueue

nginx

По умолчанию, Nginx постарается выбрать наиболее эффективный метод самостоятельно.

Обработка запросов

Будем принимать максимально возможное количество соединений

1
multi_accept on;

Метод отправки данных sendfile более эффективен, чем стандартный метод read+write

1
sendfile on;

Будем отправлять заголовки и начало файла в одном пакете

1
2
tcp_nodelay on;
tcp_nopush on;

Информация о файлах

Nginx умеет кешировать информацию о файлах, с которыми ему приходится работать (например, css стили или картинки). Если к таким файлам происходит много обращений, кеширование может значительно ускорить этот процесс.

Определяем максимальное количество файлов, информация о которых будет содержаться в кеше

1
open_file_cache max=200000 inactive=20s;

Определяет через какое время информация будет удалена из кеша

1
open_file_cache_valid 30s;

Будем кешировать информацию о тех файлах, которые были использованы хотя бы 2 раза

1
open_file_cache_min_uses 2;

Будем кешировать информацию об отсутствующих файлах

1
open_file_cache_errors on;

Логирование

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

1
2
access_log off;
error_log /var/log/nginx/error.log crit;

Сжатие Gzip

Обязательно нужно использовать сжатие, это значительно уменьшит трафик. Проверить, включено ли сжатие, можно с помощью Gzip checker.

Будем сжимать все файлы с перечисленными типами

1
2
3
gzip on;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

Обработка клиентов

Keepalive соединения позволяют избежать необходимости повторного создания соединения между клиентом и сервером.

Будем ждать 30 секунд перед закрытием keepalive-соединения

1
keepalive_timeout = 30;

Максимальное количество keepalive запросов от одного клиента

1
keepalive_requests 100;

Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере.

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

1
reset_timedout_connection on;

Будем ждать 10 секунд тело запроса от клиента, после чего сбросим соединение

1
client_body_timeout 10;

Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение

1
send_timeout 2;

Ограничивайем отправку больших запросов на сервер (например, загрузку больших файлов), если это не предусмотрено сайтом.

В этом случае сервер не будет принимать запросы размером более 1Мб

1
client_max_body_size  1m;

После правки настроек необходимо выполнить перезагрузку:

1
nginx -s reload

Окончательный конфигурационный файл

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
worker_processes  auto;
events {
use epoll;
worker_connections 1024;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

access_log off;
error_log /var/log/nginx/error.log crit;

keepalive_timeout 30;
keepalive_requests 100;

client_max_body_size 1m;
client_body_timeout 10;
reset_timedout_connection on;
send_timeout 2;
sendfile on;
tcp_nopush on;

gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}

Самым большим эффектом на посетителей окажет включение сжатия gzip.