Как известно, nginx очень продуктивный веб-сервер, но всё же его тоже можно ускорить. Я облазил интернет и решил все советы собрать в одном месте.
Поехали. Для начала нужно открыть конфиг nginx, ну, это и так должно бить понято. В debian он обычно в /etc/nginx/nginx.conf, в freebsd — /usr/local/etc/nginx/nginx.conf
Оптимизация
Я уже, наверное, задолбал теорией, так что давайте приступим к практике.
Обработка соединений
Максимальное количество соединений, которые Nginx может обслуживать одновременно, определяются произведением двух параметров:
Всего соединений = worker_processes x worker_connections
worker_processes auto;
Nginx и сам может посчитать и поверьте, сделает это лучше. Рекомендую ставить в auto в последних версиях.
worker_connections 1024;
Устанавливает максимальное количество соединений одного рабочего процесса. Следует выбирать значения от 1024 до 4096.
А use нам поможет выбрать тип соединения. В linux — epoll, freebsd — kqueue
use epoll;
Если не укажем — 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