Меню

Настройка nginx под высокие нагрузки



Оптимальная настройка Nginx

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

Как настраивать и тюнинговать Nginx

Обычно конфигурационный файл называется nginx.conf. Его можно найти:

Debian
Freebsd

Файл настроек обычно выглядит так:

Оптимизация параметров

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

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

# Определяет количество рабочих процессов. Его лучше устанавливать в auto в новых версиях.

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

Директива use устанавливает метод выбора соединений. Для разных операционных систем нужно использовать разные методы.

Linux
Freebsd

По умолчанию, Nginx постарается выбрать наиболее эффективный метод самостоятельно.

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

# Будет принимать максимально возможное количество соединений

# Метод отправки данных sendfile более эффективен, чем стандартный метод read+write

# Будет отправлять заголовки и и начало файла в одном пакете

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

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

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

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

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

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

Логирование

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

Сжатие Gzip

Обязательно нужно использовать сжатие, это значительно уменьшит трафик. Проверить, включено ли сжатие, можно с помощью Gzip checker.

# Будет сжимать все файлы с перечисленными типами

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

Keepalive соединения позволяют избежать необходимости повторного создания соединения между клиентом и сервером.

# Будет ждать 30 секунд перед закрытием keepalive соединения

# Максимальное количество keepalive запросов от одного клиента

Много проблем могут создать медленные (тупящие) клиенты. Медленная передача тела запроса от клиента к серверу и неожиданное закрытие клиентом соединений могут создать большое количество лишних соединений на сервере.

# Если клиент перестал читать отвечать, Nginx будет сбрасывать соединение с ним

# Будет ждать 10 секунд тело запроса от клиента, после чего сбросит соединение

# Если клиент прекратит чтение ответа, Nginx подождет 2 секунды и сбросит соединение

Ограничивайте отправку больших запросов на сервер (например, загрузку больших файлов), если это не предусмотрено сайтом.

# В этом случае сервер не будет принимать запросы размером более 1Мб

После правки настроек необходимо выполнить перезагрузку:

Вся конфигурация

Самое важное

Самым большим эффектом на посетителей окажет включение сжатия gzip.

Основы оптимизации работы Web сервера

Примеры использования Lua в Nginx для решения стандартных задач

Настройка Nginx для отдачи статических файлов

Использование Nginx, как кэширующего сервера

Кэширование динамических страниц с помощью SSI

Распространенные ошибки конфигурации Nginx, подводные камни и лучшие практики

Как собирать статистику Nginx при помощи встроенного модуля и Zabbix

Методы улучшения производительности TLS/SSL

Примеры применения Javascript в Nginx’e

Кэширование динамических сайтов с помощью ESI

Как использовать Varnish для кэширования HTTP запросов

Настраиваем Apache на максимальную производительность

4 шага и 9 инструментов для анализа нагрузки на сервер

Как настроить веб-сервер Nginx для работы с Magento

Правильное использование ngx.req.get_body_data() для чтения тела запроса

Эффективный механизм записи данных из Nginx’a прямо в Clickhouse минуя промежуточные узлы

Главные возможности нового протокола HTTP/2

Работа приложения с несколькими бэкендами при помощи Nginx

Где находится nginx.conf и пример настроек

Причины возникновения ошибки Ошибка 502 bad gateway в Nginx и методы исправления

Причины и методы исправления ошибки Gateway Timeout, Nginx

Как исправить ошибку Primary script unknown в Nginx

Как исправить ошибку 405 Not Allowed в Nginx

Читайте также:  Инструкция по настройке микрофона doogee x5

Включение и использование log-файлов для проверки работы Nginx

Источник

Настройка nginx под высокие нагрузки

Nginx — самый популярный веб-сервер, применяемый в системах, обслуживающих нагруженные веб проекты. Nginx выбирают из-за высокой скорости отдачи контента и возможности его использования для проксирования.

Можно использовать конфигурацию по умолчанию и дефолтные виртуальные хосты (которые копируются, переименовываются и в которых заменяют имя сайта и каталог, к которому следует обращаться). Для Nginx конфигурационный файл /etc/nginx/nginx.conf является основным, в нем подключаются все остальные. Путем добавления нужных директив и подбора их значений выполняется тонкая настройка .

Для нагруженных проектов усилия на это затраченные оправдывают себя.

Будем рассматривать тонкую настройку веб-севрера Nginx, работающего на сервере под управлением операционной системы Debian.

Nginx конфигурационный файл

Основной конфигурационный файл имеет следующую структуру:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events <
worker_connections 768;
# multi_accept on;
>

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

Для приведенного файла запускается веб-сервер от имени пользователя www-data. Максимальное количество возможных соединений определяется произведением значений worker_processes и worker_connections — каждый воркер может обрабатывать количество соединений, заданное в соответствующей директиве конфига (в примере значение worker_connections равно 768, и задано 4 воркера).

Стандартное для веб-серверов правило — устанавливать количество воркеров в соответствии с количеством ядер процессора для nginx не критично, также значение worker_processes можно устанавливать в auto, но эта настройка актуальна не для всех версий Nginx.

Следующая директива важна для снятия ограничений количества возможных соединений — она находится в блоке events и по-умолчанию закомментирована, чтобы активировать директиву достаточно снять знак комментария и перезапустить Nginx

multi_accept on;

Директивы, задающиеся в разделе конфигурационного файла http

Метод отправки информации

sendfile on;

Указание на необходимость отправки заголовков вместе с данными, что позволит ускорить процесс обработки запросов

tcp_nodelay on;

tcp_nopush on;

Самым важным для быстродействия является включение сжатия — производится обычно также в разделе http

gzip on;

gzip_disable «msie6»;

gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json application/javascript;

Большой эффект дает сжатие css и javascript

При активных директивах будет использоваться GZIP сжатие, что покажет GooglePageSpeedInsights

Логирование подключается директивами в секции http, но может также задаваться и в файлах виртуальных хостов

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

Полностью конфигурационный файл может выглядеть так:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events <
worker_connections 768;
# multi_accept on;
>

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

server_names_hash_bucket_size 64;

include /etc/nginx/mime.types;
default_type application/octet-stream;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

gzip on;
gzip_disable «msie6»;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

После внесения изменений в конфигурационный файл необходимо протестировать конфигурацию

Если ошибок в консоль не вывелось — веб-сервер можно перезапускать

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

Источник

Практические советы по тюнингу веб-сервера NGINX

Советы и примеры по тюнингу NGINX показаны на базе операционных систем FreeBSD и CentOS, но они подойдут для любой системы семейства Linux.

Все действия нужно выполнять от суперпользователя, поэтому для удобства, сразу зайдем в систему под ним:

1. Установка NGINX

Для тюнинга установка из пакетов или портов не подходит. Лучше всего выполнять сборку и установку из исходников.

Скачайте последнюю стабильную версию nginx (актуальную ссылку можно посмотреть по адресу http://nginx.org/ru/download.html):

. и с помощью данной ссылки скачиваем исходник.

* На момент обновления статьи актуальная версия nginx — 1.16.1.

Распакуйте скачанный архив и сразу удалите его, чтобы не мешался:

tar -xvf nginx-*.tar.gz && \rm nginx-*.tar.gz

Читайте также:  Утилиты для настройки директа

И перейдите в распакованную директорию:

Сконфигурируйте исходники для установки:

Сначала устанавливаем пакеты, необходимые для сборки:

pkg install pcre

Приступаем к конфигурированию:

./configure \
—prefix=/usr/local/etc/nginx \
—with-cc-opt=’-I /usr/local/include’ \
—with-ld-opt=’-L /usr/local/lib’ \
—conf-path=/usr/local/etc/nginx/nginx.conf \
—sbin-path=/usr/local/sbin/nginx \
—pid-path=/var/run/nginx.pid \
—error-log-path=/var/log/nginx-error.log \
—user=www \
—group=www \
—http-client-body-temp-path=/var/tmp/nginx/client_body_temp \
—http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp \
—http-proxy-temp-path=/var/tmp/nginx/proxy_temp \
—http-scgi-temp-path=/var/tmp/nginx/scgi_temp \
—http-uwsgi-temp-path=/var/tmp/nginx/uwsgi_temp \
—http-log-path=/var/log/nginx-access.log \
—with-http_ssl_module \
—with-file-aio \
—with-pcre \
—with-http_stub_status_module \
—without-http_charset_module \
—without-http_ssi_module \
—without-http_userid_module \
—without-http_autoindex_module \
—without-http_geo_module \
—without-http_map_module \
—without-http_split_clients_module \
—without-http_referer_module \
—without-http_empty_gif_module \
—without-http_browser_module \
—without-http_upstream_hash_module \
—without-http_upstream_ip_hash_module \
—without-http_upstream_least_conn_module \
—without-http_upstream_keepalive_module \
—without-mail_pop3_module \
—without-mail_imap_module \
—without-mail_smtp_module

Сначала устанавливаем пакеты, необходимые для сборки:

yum install gcc pcre-devel openssl-devel make

Приступаем к конфигурированию:

./configure \
—prefix=/etc/nginx \
—sbin-path=/usr/sbin/nginx \
—pid-path=/var/run/nginx.pid \
—error-log-path=/var/log/nginx/error.log \
—lock-path=/var/run/nginx.lock \
—user=nginx \
—group=nginx \
—http-log-path=/var/log/nginx-access.log \
—with-http_ssl_module \
—with-file-aio \
—with-pcre \
—with-http_stub_status_module \
—without-http_charset_module \
—without-http_ssi_module \
—without-http_userid_module \
—without-http_autoindex_module \
—without-http_geo_module \
—without-http_map_module \
—without-http_split_clients_module \
—without-http_referer_module \
—without-http_empty_gif_module \
—without-http_browser_module \
—without-http_upstream_hash_module \
—without-http_upstream_ip_hash_module \
—without-http_upstream_least_conn_module \
—without-http_upstream_keepalive_module \
—without-mail_pop3_module \
—without-mail_imap_module \
—without-mail_smtp_module

* Данный список опций подойдет для большинства серверов, но не помешает узнать о всех возможностях при помощи команды ./configure —help

Теперь запустите сборку дистрибутива из исходника:

И установите nginx:

Теперь можно запустить и проверить наш веб-сервер.

а) во FreeBSD необходимо разрешить запуск демона nginx:

echo ‘nginx_enable=»YES»‘ >> /etc/rc.conf

service nginx start

б) в CentOS действий больше.

Создаем учетную запись nginx и в качестве владельца каталога для его настроек:

chown -R nginx:nginx /etc/nginx

Создаем юнит для systemd:

[Unit]
Description=nginx — high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure

Применяем изменения в systemd:

Разрешаем автозапуск сервиса и стартуем его:

systemctl enable nginx

systemctl start nginx

2. Настройка NGINX

Продолжим тюнинг nginx, настроив несколько основных параметров, отвечающих за количество обрабатываемых соединений и сроки их поддержания.

Открываем конфигурационный файл nginx.

. или, если nginx ставился из пакетов:

Пример настроенного nginx.conf:

worker_processes auto;
worker_priority -2;
.
events <
worker_connections 2048;
multi_accept on;
>
.
http <
.
keepalive_timeout 45;
reset_timedout_connection on;
client_body_timeout 35;
send_timeout 30;
.
>

worker_processes, по умолчанию 1. Определяет количество рабочих процессов. Обычно, выставляют равному числу ядер, но в новых версиях его лучше устанавливать в auto .

worker_priority, по умолчанию 0. Задает приоритет рабочих процессов от -20 до 20 (отрицательное число означает более высокий приоритет). Ему стоит отдать чуть больший приоритет (-2). Это нужно для того, чтобы при сильной нагрузке на скриптовую часть сайта или DDoS атаке, nginx продолжал обрабатывать запросы и отдавать статику.

worker_connections, по умолчанию 512. Устанавливает максимальное количество соединений одного рабочего процесса, то есть nginx будет обрабатывать worker_processes * worker_connections, остальные запросы ставить в очередь . Следует выбирать значения от 1024 до 4096. В нашем примере — 2048.

multi_accept, по умолчанию off. Если включен, позволяет принимать максимально возможное количество соединений. Иначе, процесс nginx за один раз будет принимать только одно новое соединение.

keepalive_timeout , по умолчанию 75 . Отвечает за максимальное время поддержания keepalive-соединения, в случае, если пользователь по нему ничего не запрашивает. Для современных систем, стоит выставить от 30 до 50. В нашем случае 45.

reset_timedout_connection, по умолчанию off . Если клиент перестал читать страницу, Nginx будет сбрасывать соединение с ним.

client_body_timeout , по умолчанию 60. Будет ждать выставленное количество секунд тело запроса от клиента, после чего сбросит соединение. Значение по умолчанию слишком высокое и мы его снизили до 35.

send_timeout , по умолчанию 60. Если клиент прекратит чтение ответа, Nginx подождет выставленное количество секунд и сбросит соединение.

3. Оптимизация работы с файлами

Пример настроенного nginx.conf:

http <
.
sendfile on;
aio on;
tcp_nopush on;

open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
.
>

sendfile позволяет использовать более совершенный системный вызов, который обеспечивает прямую передачу файла (без системных вызовов read + write).

aio включает использование асинхронного обращения к файлам, что избавит от очередей запросов.

tcp_nopush позволит передавать заголовок ответа и начало файла в одном пакете.

Читайте также:  Сбил настройки нтв плюс

open_file_cache по умолчанию выключена. Задает настройку для кэширования информации о файлах, с которыми работает nginx. По умолчанию, выключено.

open_file_cache_valid задает время, через которое веб-сервер будет проверять актуальность данных. По умолчанию, 60 секунд.

open_file_cache_min_uses задает минимальное число обращений к файлу, чтобы дескриптор файла оставался открытым в кэше.

open_file_cache_errors включает или выключает кэширование ошибок.

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

Для того, чтобы aio заработал в FreeBSD, необходимо выполнить следующее.

Подгружаем модуль aio в ядро системы:

Для автоматической подгрузки модуля во время включения нашего веб-сервера:

Открываем на редактирование файл с настройками лимитов для пользователей и групп:

.
nginx hard nofile 199680
nginx soft nofile 65535
.

* в данном примере мы задаем ограничение для пользователя nginx на количество открытых файлов.

Зададим ограничение для текущей загрузки:

4. Логирование

Если отключить логирование всех подключений к nginx, можно немного снизить нагрузку на дисковую систему. Но при этом стоит оставить логирование критических ошибок.

Пример настроенного nginx.conf:

error_log /var/log/nginx-error.log crit;

* само собой, не стоит отключать логирование на хостинге или если вы предоставляете доступ к веб-сервису третьим лицам.

5. Сжатие

Это один из самых эффективных методов ускорить ответ от вашего веб-сервера nginx.

Пример настроенного nginx.conf:

http <
.
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable «msie6»;
.

gzip включает сжатие.

gzip_min_length устанавливает минимальную длину ответов, для которых будет применяться сжатие. По умолчанию 20, но имеет смысл поставить больше, так как постоянное сжатие приведет к повышению нагрузки на процессоры сервера и клиента.

gzip_proxied перечисляет параметры проксированных запросов, для которых будет разрешено сжатие.

gzip_types по умолчанию включено сжатие для ответов типа текст. В данном параметре можно перечислить все необходимые типы ответов.

gzip_disable запрещает для перечисленных параметров заголовка User-Agent сжатие. В данном примере для Internet Explorer 6 сжатие применяться не будет (данный браузер не умеет принимать сжатые ответы).

6. Настройка метода select

В Linux и FreeBSD используются свои методы обработки соединений. На данный момент наиболее эффективными являются epoll (Linux) и kqueue (FreeBSD).

а) Пример nginx.conf для FreeBSD:

б) Пример nginx.conf для Linux:

7. Обработка статики и ее кэширование

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

* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js|svg|woff2|ttf)$ <
root /var/www/site
expires modified +1w;
>
>

* в данном примере для перечисленных статических файлов NGINX сам будет сам их отдавать. Сами файлы мы будем искать в каталоге /var/www/site, однако, опцию root можно и не задавать в location, если мы ее задали уровнем выше (в секции server). Также мы задали время кэширования для файлов, равное 1 недели от момента их модификации.

8. Пример настроенного файла конфигурации

В итоге, у нас получиться что-то на подобие:

worker_processes auto;
worker_priority -2;

events <
worker_connections 2048;
multi_accept on;
use epoll;
>

http <
include mime.types;
default_type application/octet-stream;

keepalive_timeout 45;
reset_timedout_connection on;
client_body_timeout 35;
send_timeout 30;

sendfile on;
aio on;
tcp_nopush on;

open_file_cache max=100000 inactive=20s;
open_file_cache_valid 45s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

access_log off;
error_log /var/log/nginx-error.log crit;

gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript text/xml application/xml application/xml+rss application/json;
gzip_disable «msie6»;

server <
listen 80;
server_name localhost;

location / <
root html;
index index.html index.htm;
>

error_page 500 502 503 504 /50x.html;
location = /50x.html <
root html;
>
>
>

* обратите внимание, что в Linux в events use задается epoll, во FreeBSD — kqueue.

9. Проверка корректности настроек и их применение

После внесения всех настроек необходимо проверить их корректность командой:

Источник

Adblock
detector