Вопрос или проблема
Я использую 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
, особенно если у вас много параллельных запросов.
Рекомендации по Оптимизации Производительности
-
Настройка Уровня Рабочих Процессов:
Убедитесь, чтоworker_processes
настроен в зависимости от количества ядер процессора на вашем сервере. В идеале, это значение должно быть равно количеству ядер или вдвое больше. -
Оптимизация
keepalive
Параметров:
Рассмотрите возможность изменения параметровkeepalive
в секцииupstream
. Например, значениеkeepalive
можно увеличить, чтобы сократить время на установку новых соединений:upstream hostA { ... keepalive 32; # Увеличьте количество поддерживаемых соединений }
-
Снижение Задержек через Настройку SSL:
Процесс SSL-терминации требует дополнительных ресурсов. Используйте параметрыssl_session_cache
иssl_session_timeout
для оптимизации производительности:ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
-
Проверка и Тюннинг Виртуальной Памяти:
Параметрыtcp_nopush
иtcp_nodelay
могут быть настроены для улучшения производительности. Убедитесь, что они находятся в состоянии оптимизации для ваших приложений:tcp_nopush on; tcp_nodelay off; # Попробуйте оба состояния
-
Мониторинг ресурсов:
Используйте инструменты мониторинга, такие какhtop
,atop
илиnginx -t
, для регулярного отслеживания нагрузки на CPU и использование памяти. Это может выявить неоптимальные настройки или проблемы с производительностью. -
Кэширование:
Если ваши сервисы поддерживают кэширование, рассмотрите использование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; ... }
-
Настройка Временных Параметров:
Убедитесь, что ваши таймауты настроены оптимально и не слишком длинные:proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s;
Заключение
Медленная производительность Nginx как обратного прокси может быть вызвана множеством факторов, включая количество рабочих процессов, параметры SSL и настройки самого Nginx. Подробный анализ текущей конфигурации и применения предложенных улучшений может значительно повысить скорость обработки запросов. Обратите внимание на мониторинг и тестирование после каждой настройки, чтобы оценить влияние изменений на производительность.
Результаты могут значительно варьироваться в зависимости от нагрузки и архитектуры системы, поэтому обязательно учитывайте специфику вашего окружения при применении предложенных рекомендаций.