NGINX-MOD
Как вы, возможно, знаете, наш репозиторий содержит последнюю стабильную версию NGINX и широкий спектр динамических модулей для него.
Тем не менее, некоторые ориентированные на производительность люди всегда ищут способы ускорить то, что уже быстро - то есть сам NGINX.
Существуют некоторые патчи с открытым исходным кодом для него, в основном от Cloudflare, чтобы улучшить ситуацию дальше. Чтобы избежать проблем для многих людей, полагающихся на ручную компиляцию, мы собираем этот лучше патчированный NGINX в виде пакета, совместимого со всеми модулями NGINX, которые у нас есть! Его официальное название - NGINX-MOD.
NGINX-MOD основан на последнем стабильном NGINX с следующими дополнениями:
- Бесшовная поддержка HTTP/3: Ощутите более быстрые и надежные веб-соединения с передовым протоколом HTTP/3.
- Улучшенная компрессия HTTP/2 HPACK: Увеличьте производительность вашего сайта за счет оптимизированной компрессии заголовков, обеспечивая более быструю передачу данных.
- Динамическое управление записями TLS: Улучшите как безопасность, так и скорость с динамически обрабатываемыми записями TLS, адаптирующимися к потребностям вашего сайта в реальном времени.
- Расширенное ограничение по скорости: Получите точный контроль над трафиком с помощью расширенного
ngx_http_limit_req_module, позволяющего устанавливать лимиты запросов на почасовой, ежедневной, еженедельной или ежегодной основе. - Активный мониторинг состояния: Поддерживайте высокий уровень доступности и надежности с помощью проверки состояния ваших upstream-серверов в реальном времени. Узнать больше
- Улучшенные функции безопасности: Защитите информацию о вашем сервере, отключив отображение названия программного обеспечения NGINX как в заголовке Server:, так и на страницах ошибок.
- Безопасное проксирование SSL с помощью метода
CONNECT: Обрабатывайте и проксируйте SSL-запросы с использованием методаCONNECT, обеспечивая безопасную и эффективную передачу данных. - Поддержка темного режима: Автоматическая поддержка темного режима для страниц ошибок NGINX.
- Эмуляция заголовка Host для HTTP/3: Переменная
$http_hostинициализируется из authority, обеспечивая лучшую совместимость с приложениями, которые полагаются на заголовокHost.
Обновитесь до GetPageSpeed сегодня и воспользуйтесь всеми преимуществами этих продвинутых функций NGINX-MOD для оптимизации производительности, безопасности и надежности вашего сайта!
Больше о этих патчах в документации ниже.
Как установить NGINX-MOD
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install dnf-plugins-core
dnf config-manager --disable getpagespeed-extras-mainline
dnf config-manager --enable getpagespeed-extras-nginx-mod
dnf -y install nginx-mod
systemctl enable --now nginx
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y install nginx-mod
systemctl enable --now nginx
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
amazon-linux-extras install epel
yum -y install yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y install nginx-mod
systemctl enable --now nginx
Как переключиться на NGINX-MOD с нашего обычного NGINX
Если вы использовали нашу обычную сборку NGINX, вы можете выполнить ряд команд, чтобы обновиться до NGINX-MOD, не затрагивая установленные модули или конфигурацию:
yum -y install https://extras.getpagespeed.com/release-latest.rpm yum-utils
yum-config-manager --disable getpagespeed-extras-mainline
yum-config-manager --enable getpagespeed-extras-nginx-mod
yum -y update nginx
service nginx upgrade
Модули для NGINX-MOD
NGINX-MOD полностью совместим с более чем 50 пакетами модулей NGINX в нашем базовом репозитории. Поэтому вы можете устанавливать их как обычно, например:
dnf -y install nginx-module-pagespeed
Активные проверки состояния
Ключевые функции активных проверок состояния
- Поддержка нескольких протоколов: HTTP, TCP, SSL Hello, MySQL, AJP, FastCGI.
- Настраиваемые проверки: Интервал, тайм-аут, пороги успеха/неудачи.
- Панель состояния: Мониторинг в реальном времени через HTML, CSV или JSON.
- Динамические корректировки: Помечайте серверы как работающие/неработающие на основе проверок состояния.
Основы конфигурации для активных проверок состояния
Пример: Проверка состояния HTTP
http {
upstream backend {
server 192.168.1.10:80;
server 192.168.1.11:80;
# Конфигурация проверки состояния
check interval=5s rise=2 fall=3 timeout=4s type=http;
check_http_send "GET /health HTTP/1.1\r\nHost: example.com\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
# Панель состояния здоровья (ограниченный доступ)
location /status {
check_status html;
allow 10.0.0.0/8; # Разрешенные IP
deny all;
access_log off;
}
}
}
Объяснение:
check:interval=5s: Проверка каждые 5 секунд.rise=2: Пометить сервер "работающим" после 2 последовательных успешных проверок.fall=3: Пометить сервер "неработающим" после 3 последовательных неудач.type=http: Использовать HTTP проверки.check_http_send: Пользовательский HTTP-запрос, отправляемый на upstream-серверы.check_http_expect_alive: Рассматривать HTTP 2xx/3xx ответы как здоровые.check_status: Открывает панель состояния на/statusв формате HTML.
Справочник директив активных проверок состояния
Основные директивы
| Директива | Синтаксис | По умолчанию | Описание |
|---|---|---|---|
check |
interval=ms [fall=count] [rise=count] [timeout=ms] [type=protocol] [default_down=true\|false] [port=number] |
interval=30s fall=5 rise=2 timeout=1s type=tcp default_down=true |
Настраивает параметры проверки состояния. |
check_http_send |
"HTTP_REQUEST" |
"GET / HTTP/1.0\r\n\r\n" |
Пользовательский HTTP-запрос для проверок type=http. |
check_http_expect_alive |
http_2xx \| http_3xx \| ... |
http_2xx \| http_3xx |
HTTP-коды состояния, указывающие на здоровый сервер. |
Расширенные директивы
| Директива | Назначение |
|---|---|
check_keepalive_requests |
Количество запросов на соединение (по умолчанию: 1). |
check_fastcgi_param |
Пользовательские параметры FastCGI для проверок type=fastcgi. |
check_shm_size |
Размер общей памяти для проверок состояния (по умолчанию: 1M). |
Типы активных проверок состояния
1. type=http
- Использование:
check type=http; check_http_send "HEAD /health HTTP/1.1\r\nHost: example.com\r\n\r\n"; check_http_expect_alive http_200 http_302; - Коды ответов: Настройте допустимые статусы (например,
http_2xx).
2. type=tcp
- Простая проверка TCP-соединения:
check interval=10s type=tcp;
3. type=mysql
- Проверяет доступность MySQL-сервера:
check type=mysql port=3306;
4. type=fastcgi
- Пользовательские параметры FastCGI:
check type=fastcgi; check_fastcgi_param "REQUEST_METHOD" "GET"; check_fastcgi_param "SCRIPT_FILENAME" "index.php";
Настройка страницы состояния
Конфигурация конечной точки
location /status {
check_status [html|csv|json]; # По умолчанию: html
allow 192.168.1.0/24; # Ограничить доступ
deny all;
}
Параметры запроса
format: Переопределить формат вывода (например,/status?format=json).status: Фильтровать серверы по статусу (например,/status?status=down).
Примеры выводов
- HTML: Интерактивная таблица со статусом серверов.
- JSON: Формат, удобный для автоматизации.
- CSV: Упрощенные значения, разделенные запятыми.
Устранение неполадок и лучшие практики для активных проверок состояния
Общие проблемы
- Исчерпана общая память:
-
Решение: Увеличьте
check_shm_sizeв блокеhttp:http { check_shm_size 10M; # По умолчанию: 1M } -
Ложные срабатывания/неудачи:
-
Настройте пороги
rise/fallи проверьте запросыcheck_http_send. -
Ошибки тайм-аута:
- Увеличьте
timeout, если upstream-серверы отвечают медленно.
Советы по безопасности
- Ограничьте доступ к конечной точке
/status, используяallow/deny. - Используйте HTTPS для страницы состояния, если раскрываются конфиденциальные данные.
Активные проверки работают без проблем с ip_hash, least_conn и сторонними модулями, такими как sticky или fair.
Патч ngx_http_limit_req_module
Некоторые пользователи NGINX стремятся определить ограничение по скорости на один раз в день для конкретных ресурсов. Это невозможно с обычным NGINX. Наш патч позволяет более детально настраивать конфигурацию ограничения скорости. Примеры:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/h; # 1 запрос в час
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/d; # 1 запрос в день
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/w; # 1 запрос в неделю
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/M; # 1 запрос в месяц
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/Y; # 1 запрос в год
Важно отметить, что размер памяти, определенной для вашей зоны, должен позволять сохранять старые IP-записи, прежде чем будет применено определенное ограничение по скорости.
Например, вы определили зону 10m и 1r/d для конкретного ресурса. 10m может хранить около 160,000 IP-адресов.
Таким образом, если кто-то посещает ваш ресурс с ограничением по скорости, и ваш трафик на него превышает 160K уникальных посетителей в течение 24 часов, то тот же посетитель теоретически не может быть ограничен по скорости в течение того же дня, потому что информация о его IP-адресе будет удалена из памяти после того, как достаточно посетителей посетят ресурс.
Это замечание также применимо к конфигурации стандартного модуля, но в меньшей степени.
Таким образом, основные правила:
- Вам, вероятно, нужно увеличить память зоны, если ваш трафик достаточен, чтобы удалить старые IP-адреса "слишком рано"
- Это более уместно для ограничения скорости конкретных ресурсов, а не всего сайта
Что такое патч HPACK
Патч HPACK реализует полный HPACK в NGINX. Короче говоря, это позволяет сжимать HTTP-заголовки.
Что такое поддержка метода CONNECT
NGINX-MOD предоставляет поддержку запроса метода CONNECT. Этот метод в основном используется
для туннелирования SSL-запросов через прокси-серверы.
Чтобы включить и настроить, пожалуйста, обратитесь к директивам proxy_connect.
Конфигурационные директивы NGINX-MOD
В этой сборке есть некоторые конфигурационные директивы, которые недоступны в обычных сборках. Давайте задокументируем их здесь.
Следующий набор конфигурационных директив добавляется патчем динамических TLS-записей.
ssl_dyn_rec_enable on|off
Включить или отключить динамические TLS-записи.
ssl_dyn_rec_size_lo
Размер TLS-записи, с которой начинать. По умолчанию 1369 байт (разработан для того, чтобы поместить всю запись в один TCP-сегмент: 1369 = 1500 - 40 (IPv6) - 20 (TCP) - 10 (время) - 61 (максимальные накладные расходы TLS)) ssl_dyn_rec_size_hi: размер TLS-записи, до которого расти. По умолчанию 4229 байт (разработан для того, чтобы поместить всю запись в 3 TCP-сегмента)
ssl_dyn_rec_threshold
Количество записей, которые нужно отправить перед изменением размера записи.
Поскольку мы собираем с последней версией OpenSSL:
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Не новая директива. Но поскольку мы собираем с самой последней стабильной версией OpenSSL, это позволяет использовать значение TLSv1.3.
Скрытие информации о программном обеспечении
По умолчанию NGINX поддерживает только server_tokens off;, что все равно приводит к отображению nginx в заголовке Server: и на страницах ошибок.
С помощью NGINX-MOD вы можете указать новое значение none, которое заставит NGINX прекратить выводить информацию о своем присутствии на сервере:
server_tokens none;
Проверка
Чтобы проверить, как вы можете воспользоваться NGINX-MOD, вы можете провести несколько тестов.
Проверьте сжатие заголовков HTTP/2
yum install nghttp2
h2load https://example.com -n 2 | tail -6 | head -1
Пример вывода:
traffic: 71.46KB (73170) total, 637B (637) headers (space savings 78.68%), 70.61KB (72304) data
Если вы видите экономию пространства 50% или более, это означает, что используется полное сжатие HPACK.
Как переключиться обратно на стабильный NGINX
Возврат к стабильному пакету с сохранением существующей конфигурации:
yum-config-manager --disable getpagespeed-extras-nginx-mod
MOD_PKGS=$(rpm -qa --queryformat '%{NAME}\n' | grep nginx-mod | grep -v nginx-module)
rpm --erase --justdb --nodeps ${MOD_PKGS}
STABLE_PKGS=$(echo ${MOD_PKGS} | sed 's@nginx-mod@nginx@g')
yum -y install ${STABLE_PKGS}
yum history sync
Эти команды отключат репозиторий NGINX-MOD и заменят любые пакеты nginx-mod* их эквивалентами из базового репозитория, тем самым понизив версию до стабильного NGINX.
Примечания по совместимости
- NGINX-MOD в настоящее время несовместим с панелью управления Plesk