[Из песочницы] Оптимизация 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 -файлы навечно. Но по скольку они время от времени изменяются, нужно делать так:
Для удобства сделать 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! Надеюсь, этот пост будет вам полезен.