Медленная работа nginx в качестве обратного прокси

Вопрос или проблема

Я использую nginx в качестве обратного прокси в следующей конфигурации: Ubuntu 22.04, nginx 1.18.0, доступ к двум веб-сервисам на хостах A и B, которые доступны через https://a.foo.com:8443 и https://b.foo.com:8443, соответственно.

Nginx «маршрутирует» их на 10.1.1.10:8080 и 10.1.1.20:8080 и обеспечивает завершение сертификата. Конфигурационный файл приведен ниже.

Проблема в том, что веб-сервисы имеют значительно более медленное поведение, чем при прямой маршрутизации портов с DNAT (iptables-файрвол без nginx): a.foo.com:8443 на 10.1.1.10:8443 и b.foo.com:8444 на 10.1.1.20:8444: до 5 секунд времени ответа по сравнению с менее чем 1 секундой с DNAT. Тем не менее, я должен использовать один и тот же порт в обоих случаях, что возможно только с обратным прокси.

Есть ли у кого-нибудь идеи, как улучшить производительность nginx в этом случае?

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  worker_connections 768;
}
http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  client_max_body_size 500M;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;

  upstream hostA {
    zone upstreams 64K;
    server 10.1.1.10:8080 max_fails=1 fail_timeout=2s;
    keepalive 4;
  }

  upstream hostB {
    … .20:8080 …
  }

  server {
    listen 8443 ssl;
    server_name a.foo.com;
    ssl_certificate /etc/nginx/..;
    ssl_certificate_key /etc/nginx/..;
    location / {
      proxy_pass http://hostA/;
      proxy_set_header X-Forwarded-Request https://$host:$server_port$request_uri;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header   "Connection" "";
      proxy_connect_timeout   180s;
      proxy_send_timeout      180s;
      proxy_read_timeout      180s;
      send_timeout      180s;
    }
  }

  server { #.. то же самое для hostB
  }
}

Ответ или решение

Ускорение Производительности Nginx в Режиме Обратного Прокси

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

Анализ Текущей Конфигурации

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

worker_processes auto;
worker_connections 768;

Значения параметров worker_processes и worker_connections могут быть не оптимальными для вашей системы. Рассмотрите возможность увеличения worker_connections, особенно если у вас много параллельных запросов.

Рекомендации по Оптимизации Производительности

  1. Настройка Уровня Рабочих Процессов:
    Убедитесь, что worker_processes настроен в зависимости от количества ядер процессора на вашем сервере. В идеале, это значение должно быть равно количеству ядер или вдвое больше.

  2. Оптимизация keepalive Параметров:
    Рассмотрите возможность изменения параметров keepalive в секции upstream. Например, значение keepalive можно увеличить, чтобы сократить время на установку новых соединений:

    upstream hostA {
       ...
       keepalive 32;  # Увеличьте количество поддерживаемых соединений
    }
  3. Снижение Задержек через Настройку SSL:
    Процесс SSL-терминации требует дополнительных ресурсов. Используйте параметры ssl_session_cache и ssl_session_timeout для оптимизации производительности:

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
  4. Проверка и Тюннинг Виртуальной Памяти:
    Параметры tcp_nopush и tcp_nodelay могут быть настроены для улучшения производительности. Убедитесь, что они находятся в состоянии оптимизации для ваших приложений:

    tcp_nopush on;
    tcp_nodelay off;  # Попробуйте оба состояния
  5. Мониторинг ресурсов:
    Используйте инструменты мониторинга, такие как htop, atop или nginx -t, для регулярного отслеживания нагрузки на CPU и использование памяти. Это может выявить неоптимальные настройки или проблемы с производительностью.

  6. Кэширование:
    Если ваши сервисы поддерживают кэширование, рассмотрите использование proxy_cache в Nginx для временного хранения ответов и минимизации обращений к бэкэндам:

    proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    Добавьте его в ваш location:

    location / {
       proxy_cache my_cache;
       ...
    }
  7. Настройка Временных Параметров:
    Убедитесь, что ваши таймауты настроены оптимально и не слишком длинные:

    proxy_connect_timeout   30s;
    proxy_send_timeout      30s;
    proxy_read_timeout      30s;

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...