Оптимизация nginx

в 9:43, , рубрики: highload, nginx, оптимизация, Серверная оптимизация, Серверное администрирование

Как известно, nginx очень продуктивный веб-сервер, но всё же его тоже можно ускорить. Я облазил интернет и решил все советы собрать в одном месте.

Поехали. Для начала нужно открыть конфиг nginx, ну, это и так должно бить понято. В debian он обычно в /etc/nginx/nginx.conf, в freebsd — /usr/local/etc/nginx/nginx.conf

Оптимизация

Я уже, наверное, задолбал теорией, так что давайте приступим к практике.

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

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

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

Оптимизация nginx

worker_processes auto; 

Nginx и сам может посчитать и поверьте, сделает это лучше. Рекомендую ставить в auto в последних версиях.

worker_connections 1024;

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

А use нам поможет выбрать тип соединения. В linux — epoll, freebsd — kqueue

use epoll;

Оптимизация nginx

Если не укажем — nginx сам подумает. Умница! А вы говорите нет штучного интелекта.

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

multi_accept on; #nginx будет обрабатывать максимальное количество соединений
sendfile on; #Метод отправки данных sendfile более эффективен, чем стандартный метод read+write
# Nginx будет отправлять заголовки и начало файла в одном пакете:
tcp_nodelay on; 
tcp_nopush on;

Без этого никак.

Файлы

directio 10m;

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

Cache-Control

location ~* ^.+.(js|css)$ {
	expires max;
}

Этот код будет кешировать js, css -файлы навечно. Но по скольку они время от времени изменяются, нужно делать так:

<link rel="stylesheet" href="/styles.v2.css" type="text/css" />
<script  src="/scripts.v2.js"></script>

Для удобства сделать rewrite на script.js/style.css и заливать файлы так, а если есть изменения — просто заменить цифру после v.
С неизменяемой статикой всё значительно проще:

location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
		expires max;
	}

UPD: товарищ symbix советует указывать не regexp, а папку где оно хранится:

location /static/ {expires max;}

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

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

open_file_cache max=200000 inactive=20s;

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

open_file_cache_valid 30s;

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

open_file_cache_min_uses 2;

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

open_file_cache_errors on;

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

limit_rate

limit_rate 200K; #отдавать файлы со скоростью 200 кб/сек

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

set $limit_rate 196K;

В Nginx также есть возможность установить порог отдачи, после которой ограничение войдет в силу. Также имеет смысл для потокового медиа (в этом случае первая указанная часть будет отдаваться без ограничений):

limit_rate_after 1m; #Ограничение скорости отдачи будет накладываться после 1Мб

Логи

access_log /dev/null; #нам логи не нужны
error_log /var/log/nginx/error.log; #а вот ошибки нужно знать!

UPD: BuriK666 советует ставить acces_log off; Похоже у новых версиях баг з созданиям файла off — исправили.

Сжатия gzip

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;

Для text/html не нужно, поскольку nginx для него сжимает автоматически.

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

keepalive

keepalive_timeout = 30;
keepalive_requests 100; #максимально от одного клиента

Внимания! Это не копировать, а обдумать. Как подсказал gnomeby:
Если держать keepalive для подгрузки статики, то будет примерно так:
keepalive_timeout = 5; #
keepalive_requests %максимальное количество подгрузок + 2-10%

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

Ограничения и отключения

reset_timedout_connection on;#Если клиент перестал читать, отвечать nginx сбрасывает соединение с ним
client_body_timeout 10;#nginx будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение
send_timeout 2; #Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение
client_max_body_size  1m; #больше одного мегабайта запрос - ни-ни, хотя нужно на стороне приложения ограничивать

С этим нужно быть очень осторожным.

The end! Надеюсь, этот пост будет вам полезен.

Автор: Webius

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js