انجیناکس؛ شب ۴۲: درخواست، health check و ارتقای کانتینر
فهرست نوشته
بالا بودن فرایند Nginx تضمین نمیکند backend سالم است. امشب وضعیت فرایند، مسیر واقعی درخواست، rollout و rollback را با artifact مشخص جداگانه بررسی میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: Compose شب ۴۰ یا ۴۱، config و digest قبلی ذخیره شدهاند؛ درخواستهای آزمایشگاهی کوتاه و بلند داریم. docker compose up روی یک frontend تنها میتواند وقفه ایجاد کند.
چه چیزی را health مینامیم؟#
/healthz محلی شب ۳۹ فقط پاسخدهی Nginx را میسنجد. برای readiness برنامه، یک endpoint backend با پاسخ بدون راز طراحی کن و درخواست واقعی از frontend بفرست. خرابی database، resolve error و timeout backend باید در نتیجه و log دیده شود.
در image Alpine پس از تأیید وجود wget، healthcheck زیر را برای server HTTP داخلی frontend اضافه کن:
healthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:8080/healthz"]
interval: 10s
timeout: 3s
retries: 3
start_period: 10s
stop_signal: SIGQUIT
stop_grace_period: 30s
اگر شاخهٔ TLS server HTTP را حذف کرده، یک listener سلامت loopback داخل کانتینر بساز یا healthcheck را متناسب کن؛ TLS را با no-check-certificate دور نزن. وضعیت unhealthy بهتنهایی در Compose standalone به معنی restart یا حذف سرویس از پراکسی نیست؛ automation یا load balancer باید آن را مصرف کند.
config پیش از rollout#
docker compose -p nginx-lab config --quiet
docker compose -p nginx-lab run --rm --no-deps frontend -t
docker compose -p nginx-lab logs --tail 50 frontend backend
فرمان run با entrypoint nginx همان config readonly را در کانتینر تازه syntax-check میکند؛ resolver هنگام runtime و سلامت backend را جدا بسنج. اگر nginx -t خطا داد، deployment را متوقف کن. فایل mountشده را روی میزبان تغییر بده؛ تغییر داخل کانتینر موقت، منبع استقرار نیست.
ارتقا و حفظ درخواستها#
نسخهٔ جدید image را با advisory رسمی و digest انتخاب کن، در staging همین آزمونها را اجرا و فقط سپس .env را تغییر بده. پیش از recreate frontend یک درخواست طولانی یا SSE راه بینداز؛ SIGQUIT درخواست graceful shutdown میدهد، ولی ۳۰ ثانیه timeout Docker یا اتصال WebSocket بلند میتواند آن را قطع کند. policy drain باید با رفتار برنامه و زمان توقف هماهنگ باشد.
برای تمرین بدون قطع frontend قبلی، پروژهٔ دوم را با port میزبان متفاوت بالا بیاور، از edge آن را تست کن و پس از موفقیت edge را به port جدید هدایت/reload کن. backend، شبکه و TLS پروژهٔ دوم را نیز مشخص کن؛ اجرای دوبارهٔ همین Compose با همان published port با conflict روبهرو میشود. تغییر route بهتنهایی state database یا session مشترک را مدیریت نمیکند.
در rollout ثبت کن: digest قبل/بعد، config hash، درخواست سالم/منفی، latency، تعداد 5xx و نتیجهٔ drain. stdout/stderr با rotation در logging driver یا collector نگهداری شود؛ log نامحدود فضای میزبان را پر میکند. Docker logs را برای دادهٔ حساس review کن.
بازگشت: .env و config قبلی را برگردان، validate و recreate کن و درخواست تازه بفرست. اگر backend schema تغییر کرده، rollback image frontend کافی نیست؛ مانند شب ۳۴ داده و نسخهها باید سازگار باشند.
منبع: healthcheck و توقف در Compose ، سیگنالهای Nginx ، logging Docker .