← شروع آموزش

WIUNIX ACADEMY

عیب‌یابی خطاهای 502 و 504 در Nginx

صفحهٔ 2 از 3؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

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

Debian 12بررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من5 مقدار قابل‌تغییر
06

قدم بعدی

عبارت دقیق خطا را در لاگ بخوانید

در /var/log/nginx/error.log فقط همان بازه و همان سرور را بررسی کنید. Connection refused ابتدا به نبود شنونده، آدرس اشتباه یا چرخهٔ اجرای برنامه اشاره می‌کند. عبارت while connecting یعنی اتصال هنوز کامل نشده؛ while reading response header یعنی پس از اتصال منتظر هدر بوده‌اید.

بسته‌شدن زودهنگام اتصال می‌تواند از crash یا اشتباه پروتکل باشد. یک خط قدیمی یا خطای دامنهٔ دیگر را به این درخواست نسبت ندهید. در نصب سفارشی، مسیر واقعی لاگ را در تنظیمات ابتدای آموزش وارد کنید.

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

sudo tail -n 120 -- '/var/log/nginx/error.log'
از کجا بدانم درست انجام شد؟

خطای هم‌زمان با درخواست پیدا شده و مرحله‌ای که ارتباط در آن شکست خورده روشن است.

اگر لاگ کافی نیست، زمان‌های لازم را اضافه کنید

اگر لاگ فعلی زمان اتصال و پاسخ را دارد، همان را استفاده کنید. در غیر این صورت، قطعهٔ بعدی را فقط برای بررسی کوتاه‌مدت اضافه کنید: تعریف قالب در بخش http و خط access_log در server یا location هدف قرار می‌گیرد. این قطعه جایگزین کل تنظیمات Nginx نیست.

قالب نمونه عمداً URL، پارامترها، کوکی، اطلاعات ورود و IP کاربر را ذخیره نمی‌کند. نسخهٔ قبل، مدت نگهداری و چرخش لاگ را مشخص کنید و فقط محل درست را ویرایش کنید.

text · Optional Nginx fragment — merge into the correct existing contexts

محتوای فایل؛ این پنل را در ترمینال اجرا نکنید

# http context
log_format academy_phase escape=json
  '{"id":"$request_id","status":$status,'
  '"upstream":"$upstream_addr","upstream_status":"$upstream_status",'
  '"connect":"$upstream_connect_time","header":"$upstream_header_time",'
  '"response":"$upstream_response_time","total":"$request_time"}';
# affected server/location context only
access_log /var/log/nginx/academy-phase.log academy_phase;
07

قدم بعدی

تنظیم تغییرکرده را قبل از reload بررسی کنید

این گام فقط زمانی لازم است که برای همین بررسی تنظیم لاگ را تغییر داده‌اید. ابتدا اعتبارسنجی بومی Nginx باید موفق شود؛ سپس reload انجام می‌شود. اگر خطای نحوی دارید، همان تغییر را اصلاح یا نسخهٔ قبل را برگردانید؛ restart کورکورانه کمکی نمی‌کند.

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

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

sudo nginx -t && sudo systemctl reload nginx
از کجا بدانم درست انجام شد؟

اعتبارسنجی و reload موفق‌اند و نتیجهٔ درخواست تازه را می‌توان با لاگ تازه مقایسه کرد.

زمان هر تلاش را جدا تفسیر کنید

اگر Nginx چند بک‌اند یا چند تلاش داشته باشد، فیلدهای upstream ممکن است چند مقدار با جداکنندهٔ ویرگول یا دونقطه داشته باشند. آن‌ها را یک عدد واحد فرض نکنید؛ خط تیره هم لزوماً صفر نیست.

اتصال سریع همراه تأخیر زیاد هدر، انتظار پس از اتصال را نشان می‌دهد؛ اما به‌تنهایی مشخص نمی‌کند کدام کوئری یا سرویس جانبی کند است. شواهد worker، دیتابیس و trace همان درخواست را کنار هم بگذارید. سریع‌بودن health check، سلامت عملیات سنگین کاربر را ثابت نمی‌کند.

مهلت‌ها را متناسب با عملیات تنظیم کنید

مهلت اتصال با مهلت خواندن پاسخ یکسان نیست. proxy_read_timeout فاصلهٔ بین دو خواندن پیاپی را محدود می‌کند، نه کل مدت تراکنش؛ برنامه‌ای که گاهی داده می‌فرستد می‌تواند بسیار طولانی‌تر اجرا شود.

مهلت کلاینت، لبه، Nginx و برنامه را با نیاز واقعی هماهنگ کنید. افزایش همهٔ آن‌ها ممکن است اتصال‌های اشغال‌شده را بیشتر و ازدحام را بدتر کند. کار طولانی را در صورت تناسب به job غیرهم‌زمان بسپارید؛ تکرار درخواست نوشتنی هم بدون طراحی جلوگیری از اجرای دوباره، راه‌حل امنی نیست.

فقط تغییر تشخیصی را کنار بگذارید

درخواست‌های خواندنی چیزی را تغییر نمی‌دهند و بازگردانی لازم ندارند. اگر قالب زمان‌بندی اضافه کردید، فقط همان تعریف و اتصال لاگ موقت را در روند ویرایش قبلی حذف کنید؛ بعد از اعتبارسنجی reload کنید. لاگ اصلی و شواهد رخداد را نگه دارید.

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

bash

ترمینال همان میزبان معرفی‌شده در توضیح گام

sudo nginx -t && sudo systemctl reload nginx
از کجا بدانم درست انجام شد؟

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

همهٔ آموزش‌های آکادمی ↗