...

четверг, 5 июня 2014 г.

[Из песочницы] Оптимизация nginx

Как известно, 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;
}


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




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; #а вот ошибки нужно знать!


Сжатия 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; #максимально от одного клиента


Тут, думаю, всё ясно.


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



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


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


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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий