Динамическое добавление апстримов в Nginx без перезагрузки: Consul Template
- Необходимость добавления или удаления серверов в Upstream Nginx в среде с автомасштабированием (Autoscaling) без ручной правки конфигов.
- Потеря соединений или скачки задержек при частых вызовах
systemctl restart nginx. - Ошибки 502 Bad Gateway при обращении к остановленным контейнерам или виртуальным машинам.
1. Установка Consul Template
wget https://releases.hashicorp.com/consul-template/0.35.0/consul-template_0.35.0_linux_amd64.zip
unzip consul-template_*.zip -d /usr/local/bin/
chmod +x /usr/local/bin/consul-template2. Создание HCL шаблона апстримов /etc/nginx/templates/upstream.ctmpl
upstream dynamic_app {
least_conn;
{{ range service "web-api" }}
server {{ .Address }}:{{ .Port }} max_fails=3 fail_timeout=10s;
{{ else }}
# Fallback сервер, если все инстансы упали
server 127.0.0.1:8080 backup;
{{ end }}
}3. Конфигурация запуска Consul Template (/etc/consul-template.d/nginx.hcl)
consul {
address = "127.0.0.1:8500"
}
template {
source = "/etc/nginx/templates/upstream.ctmpl"
destination = "/etc/nginx/conf.d/generated_upstream.conf"
perms = 0644
command = "nginx -t && systemctl reload nginx"
}4. Создание Systemd Unit сервиса (/etc/systemd/system/consul-template.service)
[Unit]
Description=Consul Template for Nginx
After=network.target consul.service nginx.service
[Service]
ExecStart=/usr/local/bin/consul-template -config=/etc/consul-template.d/nginx.hcl
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target5. Запуск и мониторинг
systemctl daemon-reload
systemctl enable --now consul-template
journalctl -u consul-template -f Частые вопросы (FAQ)
Приводит ли nginx -s reload к обрыву активных HTTP соединений?
Нет. При команде reload главный процесс (master) запускает новые воркеры с новым конфигом, а старым воркерам отправляет сигнал на плавное завершение (graceful shutdown) после обработки всех активных запросов.
Как Nginx Plus решает задачу динамических апстримов?
В платной версии Nginx Plus динамические апстримы управляются напрямую через Nginx Upstream Dynamic API на лету (HTTP POST/DELETE) без модификации текстовых файлов и без вызова reload.