Перейти к содержанию

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: Упрощенные значения, разделенные запятыми.

Устранение неполадок и лучшие практики для активных проверок состояния

Общие проблемы

  1. Исчерпана общая память:
  2. Решение: Увеличьте check_shm_size в блоке http:

    http {
      check_shm_size 10M;  # По умолчанию: 1M
    }
    

  3. Ложные срабатывания/неудачи:

  4. Настройте пороги rise/fall и проверьте запросы check_http_send.

  5. Ошибки тайм-аута:

  6. Увеличьте 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