رفتن به محتوا
زیرساخت فناوری اطلاعات

چرا لاگ‌های کانتینر را به stdout می‌فرستیم، نه فایل

یک ریبیلد معمولی nginx، مدرکی را پاک کرد که نمی‌دانستیم بهش نیاز داریم. فیکس فقط دو خط بود، ولی فهمیدن اینکه بهش نیاز داریم بیشتر از حد لازم طول کشید.

H
Hamze Zare Nasiri
۲۵ شهریور ۱۴۰۵

یک ریبیلد معمولی nginx در هفته‌ی گذشته، مدرکی را پاک کرد که نمی‌دانستیم بهش نیاز داریم. فیکس فقط دو خط بود، ولی فهمیدن اینکه بهش نیاز داریم بیشتر از حد لازم طول کشید.

چیزی که متوجه شدیم

هنگام بررسی آمار Google Analytics برای ترافیک ارگانیک، یک چیز عجیب به چشم خورد: تقریباً یک چهارم سشن‌های کانال «Direct» روی آدرس /customer/login?returnTo=/payment/<plan>/<period> فرود می‌آمدند، برای تقریباً همه‌ی پلن‌های قیمت‌گذاری ما، نه فقط دو یا سه تا از آن‌ها. هر بار همان اثرانگشت مرورگر: مرورگر ناشناس، دسکتاپ، یک کشور خاص. تعامل صفر روی تک‌تکشان.

این رفتار یک مشتری که دارد پلن‌ها را نگاه می‌کند نیست. این یک اسکریپت است که دارد همه‌ی آدرس‌های خرید قابل‌کشف را یکی‌یکی بررسی می‌کند، تقریباً حتماً با استخراج مستقیم از همان صفحه‌ی قیمت‌گذاری خودمان.

مدرک از قبل نابود شده بود

رفتیم سراغ لاگ access نجینکس تا IP منبع را پیدا کنیم و هیچ‌چیزی نبود. کانتینر چند روز قبل برای یک فیکس نامرتبط ریبیلد شده بود، و access_log به یک فایل داخل کانتینر اشاره می‌کرد نه stdout. ریبیلد آن را کاملاً پاک کرده بود. docker logs هیچ‌چیزی نشان نمی‌داد، چون چیزی روی stdout نبود که نشان بدهد. پایپ‌لاین لاگی که از قبل داشتیم و خروجی کانتینرها را به یک مخزن لاگ مرکزی می‌فرستاد، حتی یک خط از این ماجرا را ندیده بود، چون آن پایپ‌لاین فقط چیزی را جمع‌آوری می‌کند که کانتینرها روی stdout و stderr می‌نویسند.

آدرس IP بات از بین رفته. دیگر راهی برای برگرداندنش نیست.

فیکس

access_log /dev/stdout main;
error_log /dev/stderr warn;

nginx به /dev/stdout و /dev/stderr مثل فایل‌های معمولی نگاه می‌کند که می‌تواند رویشان بنویسد، پس این یک یکپارچه‌سازی خاص نیست. همان خطوط لاگی که قبلاً داخل یک فایل می‌نشستند، حالا از طریق خروجی استاندارد کانتینر عبور می‌کنند، همان چیزی که سیستم ارسال لاگ ما از قبل از تمام کانتینرهای دیگرمان می‌خواند.

درس واقعی

خودِ بات چیز جالبی نبود. بررسی کم‌سرعت آدرس‌های عمومی قیمت‌گذاری به تنهایی تهدید بزرگی نیست. چیزی که مهم بود این بود که ما یک استک مانیتورینگ داشتیم که کامل به نظر می‌رسید، درحالی‌که یک کانتینر بی‌سروصدا از آن بیرون مانده بود، چون کانفیگ پایه‌اش هنوز مثل ده سال پیش روی یک سرور فیزیکی، پیش‌فرضش نوشتن فایل لاگ بود. اگر آن کانتینر ماه بعد دوباره ریبیلد شود، هر کاری آن‌وقت انجام بدهد، واقعاً می‌توانیم ببینیمش.

اگر nginx را داخل Docker اجرا می‌کنید، ارزش دارد دایرکتیوهای access_log و error_log خودتان را چک کنید. یک استک مانیتورینگ فقط به‌اندازه‌ی کانتینرهایی کامل است که واقعاً رویش می‌نویسند.

به زیرساخت پروداکشن درست‌وحسابی نیاز دارید؟

ما استک Docker/nginx/مانیتورینگ پشت محصولات خودمان را در مقیاس واقعی می‌سازیم و اداره می‌کنیم. همین کار را برای شما هم می‌توانیم انجام بدهیم.

خدمات DevOps ما را ببینید

اشتراک‌گذاری این مقاله