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

Содержание

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

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

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

Debian
Freebsd

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

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

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

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

Nginx worker_processes и worker_connections

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

Linux
Freebsd

Nginx epoll

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

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

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

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

Логирование

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

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

Сжатие Gzip

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

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

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

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

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

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

Самое важное

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

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

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

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

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

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

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

Копируем ссылку на последнюю стабильную версию NGINX

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

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

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

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

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

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

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

./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

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

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

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

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

service nginx start

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

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

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

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

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

systemctl enable nginx

systemctl start nginx

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

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

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

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

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

multi_accept, по умолчанию off. Если включен, позволяет принимать максимально возможное количество соединений. Иначе, процесс 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. Пример настроенного файла конфигурации

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

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. Проверка корректности настроек и их применение

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

Information Security Squad

В этом руководстве мы рассмотрим, как настроить веб-сервер Nginx для производственной среды.

Веб-сервер в производственной среде отличается от веб-сервера в тестовой среде с точки зрения производительности, безопасности и так далее.

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

Однако конфигурация по умолчанию недостаточно хороша для производственной среды.

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

Если вы еще не установили Nginx на свой компьютер, вы можете произвести настройки локально.

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

Требования

На вашем компьютере должно быть установлено следующее программное обеспечение и убедитесь, что вы запускаете это руководство на любой платформе на основе Debian, такой как например Ubuntu.

Понимание структуры конфигурации Nginx

В этом разделе мы рассмотрим следующее:

Раздел Main

Разделы

Разделы в Nginx определяют конфигурацию для модулей Nginx.

Например, раздел http определяет конфигурацию для модуля ngx_http_core, раздел event определяет конфигурацию для модуля ngx_event_module, а mail определяет конфигурацию для модуля ngx_mail_module.

Вы можете посмотреть здесь полный список разделов в Nginx.

Директивы

Директивы в Nginx состоят из имени переменной и ряда аргументов, например:

Worker_processes – это имя переменной, в то время как auto служит аргументом.

Директивы заканчиваются точкой с запятой, как показано выше.

Наконец, файл конфигурации Nginx должен соответствовать определенному набору правил.

Ниже приведен правильный синтаксис конфигурации Nginx:

Настройка производительности Nginx

В этом разделе мы настроим Nginx, чтобы он работал надежнее во время интенсивного потока или скачка трафика и скачка.

Workers

Предполагая, что вы не закрыли редактор vim, нажмите кнопку i на клавиатуре, чтобы отредактировать файл nginx. conf.

Скопируйте и вставьте следующее в раздел event, как показано ниже:

Ввод / вывод диска

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

Дисковый ввод / вывод просто относится к операциям записи и чтения между жестким диском и оперативной памятью.

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

Вы можете использовать раздел http, раздел location и раздел server для директив в этой области.

Раздел location, раздел server можно встроить или поместить в раздел http, чтобы сделать конфигурацию удобочитаемой.

Скопируйте и вставьте следующий код в раздел location, встроенный в раздел HTTP.

Сетевой уровень

В этом разделе мы будем использовать директивы tcp_nodelay и tcp_nopush, чтобы предотвратить ожидание небольших пакетов в течение определенного периода времени около 200 миллисекунд, прежде чем они будут отправлены сразу.

Обычно, когда пакеты передаются «кусочками», они имеют тенденцию насыщать высоконагруженную сеть.

Поэтому Джон Нейгл создал алгоритм буферизации для решения этой проблемы.

Цель алгоритма буферизации Nagle – предотвратить насыщение небольших пакетов высоконагруженной сети.

Скопируйте и вставьте следующий код в раздел HTTP.

Буферы

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

Буфер – это временное хранилище, где некоторое время хранятся и обрабатываются данные.

Вы можете скопировать настройки, показанные ниже в разделе server.

Компрессия

Сжатие объема данных, передаваемых по сети, – это еще один способ повысить производительность вашего веб-сервера.

В этом разделе мы будем использовать директивы, такие как gzip, gzip_comp_level и gzip_min_length, для сжатия данных.

Вставьте следующий код в раздел http, как показано ниже:

Кэширование

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

Nginx предоставляет функции для кэширования метаданных статического содержимого с помощью директивы

Тайм-аут

Сконфигурируйте время ожидания, используя директивы, такие как keepalive_timeout и keepalive_requests, чтобы предотвратить долгое ожидание соединений от потери ресурсов.

В разделе HTTP скопируйте и вставьте следующий код:

Настройка безопасности Nginx

Далее рассказывается только о том, как безопасно настроить Nginx а не само веб-приложения.

Таким образом, мы не будем рассматривать веб-атаки, такие как SQL-инъекция и так далее.

В этом разделе мы рассмотрим, как настроить следующее:

Ограничить доступ к файлам и каталогам

Давайте посмотрим, как ограничить доступ к конфиденциальным файлам и каталогам с помощью следующих методов.

Используя HTTP-аутентификацию

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

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

Затем создайте файл паролей и пользователя, используя инструмент htpasswd, как показано ниже.

Инструмент htpasswd предоставляется утилитой apache2-utils.

Вы можете подтвердить, успешно ли вы создали пользователя и случайный пароль, с помощью следующей команды

Используя директиву Allow

В дополнение к директиве basic_auth мы можем использовать директиву allow для ограничения доступа.

Внутри раздела location вы можете использовать следующий код, чтобы разрешить указанным IP-адресам доступ к конфиденциальной области.

Настрйка логов для мониторинга вредоносных действий

В этом разделе мы настроим журналы error и access, чтобы специально отслеживать допустимые и недействительные запросы.

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

Внутри раздела HTTP вы можете использовать следующую настройку:

Предотвращение DDOS

Вы можете защитить Nginx от DDOS-атаки следующими способами:

Ограничение запросов пользователей

Вы можете использовать директивы limit_req_zone и limit_req, чтобы ограничить частоту запросов, отправляемых пользователями в течение нескольких минут.

Добавьте следующий код в раздел location, встроенный в раздел server.

Ограничение количества подключений

Вы можете использовать директивы limit_conn и limit_conn_zone, чтобы ограничить соединение с определенными местоположениями или областями.

Например, приведенный ниже код позволяет 15 соединений от клиентов за определенный период.

Следующий код должен быт помещен в раздел location.

Завершить медленные соединения

Вы можете использовать директивы timeouts, такие как client_body_timeout и client_header_timeout, чтобы контролировать, как долго Nginx будет ожидать записи из тела и заголовка клиента.

Добавьте следующее в разделе server.

Отключить список каталогов

Вы можете использовать директиву auto_index, чтобы предотвратить листинг каталога, как показано ниже в коде.

Вам нужно установить его в значение off, чтобы отключить список каталогов.

Заключение

Мы настроили веб-сервер Nginx для эффективной работы и защиты от чрезмерного злоупотребления ресурсов в производственной среде.

Источники:

https://highload. today/index-php-2009-04-24-nastroyka-nginx/

https://www. dmosk. ru/instruktions. php? object=kak-optimizirovat-veb-server-nginx

https://itsecforu. ru/2020/02/25/%F0%9F%8C%90-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8-%D0%B8-%D0%B1%D0%B5/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: