Thank you for reading this post, don't forget to subscribe!
В стандартной конфигурации Nginx может работать при очень больших нагрузках. Тем не менее, эффективность его работы можно значительно повысить, настроив его параметры. Такая настройка называется тюнинг (tuning — подстройка, регулировка).
Как настраивать и тюнинговать Nginx
Обычно конфигурационный файл называется nginx.conf. Его можно найти:
Debian
1 |
/etc/nginx/<a class="conf" href="https://ruhighload.com/post/nginx.conf">nginx.conf</a> |
Freebsd
1 |
/usr/local/etc/nginx/<a class="conf" href="https://ruhighload.com/post/nginx.conf">nginx.conf</a> |
Файл настроек обычно выглядит так:
1 2 3 4 5 6 7 8 9 10 |
user www-data; worker_processes 1; events { worker_connections 1024; } http { ... } |
Оптимизация параметров
Обработка соединений
Максимальное количество соединений, которые Nginx может обслуживать одновременно определяются произведением двух параметров:
1 |
Всего соединений = worker_processes x worker_connections |
1 |
worker_processes auto; |
# Определяет количество рабочих процессов. Его лучше устанавливать в auto в новых версиях.
1 |
worker_connections 1024; |
# Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096.
Директива use устанавливает метод выбора соединений. Для разных операционных систем нужно использовать разные методы.
Linux
1 |
use epoll |
Freebsd
1 |
use kqueue |
По умолчанию, Nginx постарается выбрать наиболее эффективный метод самостоятельно.
Обработка запросов
1 |
multi_accept on; |
# Будет принимать максимально возможное количество соединений
1 |
sendfile on; |
# Метод отправки данных sendfile более эффективен, чем стандартный метод read+write
1 2 |
tcp_nodelay on; tcp_nopush on; |
# Будет отправлять заголовки и и начало файла в одном пакете
Информация о файлах
Nginx умеет кешировать информацию о файлах, с которыми ему приходится работать (например, css стили или картинки). Если к таким файлам происходит много обращений, кеширование может значительно ускорить этот процесс.
1 |
open_file_cache max=200000 inactive=20s; |
# Определяет максимальное количество файлов, информация о которых будет содержаться в кеше
1 |
open_file_cache_valid 30s; |
# Определяет через какое время информация будет удалена из кеша
1 |
open_file_cache_min_uses 2; |
# Будет кешировать информацию о тех файлах, которые были использованы хотя бы 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 соединения позволяют избежать необходимости повторного создания соединения между клиентом и сервером.
1 |
keepalive_timeout 30; |
# Будет ждать 30 секунд перед закрытием keepalive соединения
1 |
keepalive_requests 100; |
# Максимальное количество keepalive запросов от одного клиента
Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере.
1 |
reset_timedout_connection on; |
# Если клиент перестал читать отвечать, Nginx будет сбрасывать соединение с ним
1 |
client_body_timeout 10; |
# Будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение
1 |
send_timeout 2; |
# Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение
Ограничивайте отправку больших запросов на сервер (например, загрузку больших файлов), если это не предусмотрено сайтом.
1 |
client_max_body_size 1m; |
# В этом случае сервер не будет принимать запросы размером более 1Мб
После правки настроек необходимо выполнить перезагрузку:
1 |
nginx -s reload |
Вся конфигурация
[codesyntax lang="php"]
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 32 33 |
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_nodelay on; tcp_nopush on; 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; open_file_cache max=200000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; } |
[/codesyntax]
Самым большим эффектом на посетителей окажет включение сжатия gzip.