مقدمه
یکی از مشکلات رایجی که در سرورهای لینوکسی میزبان پروژههای Django رخ میدهد، پر شدن فضای دیسک است. در این حالت معمولاً سایت ناگهان با خطای 500 مواجه میشود و در لاگهای Gunicorn یا Django خطای اتصال به دیتابیس مشاهده میشود.
در این مقاله یک سناریوی واقعی را بررسی میکنیم که در آن به دلیل پر شدن دیسک، PostgreSQL متوقف شده بود و باعث خطای 500 در سایت Django شده بود. همچنین مراحل عیبیابی و رفع مشکل را قدمبهقدم توضیح میدهیم.
نشانههای مشکل
در چنین شرایطی معمولاً با موارد زیر روبهرو میشوید:
- سایت Django خطای 500 Internal Server Error میدهد
- در لاگ Gunicorn خطای اتصال به دیتابیس دیده میشود
- دسترسی به دیتابیس PostgreSQL قطع شده است
نمونهای از خطای لاگ:
django.db.utils.OperationalError:
connection to server at "localhost", port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
این خطا نشان میدهد که Django نمیتواند به PostgreSQL متصل شود.
مرحله اول: بررسی پر بودن دیسک سرور
اولین قدم بررسی وضعیت دیسک است:
df -h
اگر دیسک 100٪ پر شده باشد، بسیاری از سرویسها از جمله PostgreSQL ممکن است متوقف شوند.
برای پیدا کردن پوشههایی که بیشترین فضا را مصرف کردهاند:
du -h / | sort -hr | head
یا:
du -sh /var/* /backup/*
در بسیاری از سرورها موارد زیر باعث پر شدن دیسک میشوند:
- بکاپهای قدیمی
- فایلهای media
- لاگهای حجیم
- فایلهای موقت آپدیت
مرحله دوم: آزاد کردن فضای دیسک
بعد از پیدا کردن فایلهای حجیم، میتوانید فایلهای غیرضروری را حذف کنید.
مثلاً حذف بکاپهای قدیمی:
rm /backup/media_20260404_060001.tar.gz
rm /backup/media_20260405_060001.tar.gz
یا پاک کردن فایلهای موقت آپدیت:
rm -rf /var/nextcloud-data/updater-*
همچنین اگر فایل لاگ بسیار بزرگ شده باشد میتوانید آن را خالی کنید:
truncate -s 0 /var/log/syslog
مرحله سوم: بررسی وضعیت PostgreSQL
بعد از آزاد شدن فضای دیسک باید بررسی کنید که PostgreSQL در حال اجرا است یا نه:
systemctl status postgresql
اگر سرویس متوقف شده باشد معمولاً وضعیت آن failed یا inactive خواهد بود.
در این صورت کافی است آن را اجرا کنید:
systemctl start postgresql
مرحله چهارم: راهاندازی مجدد سرویسهای سایت
بعد از اجرای دیتابیس بهتر است سرویسهای مرتبط با سایت را نیز ریستارت کنید:
systemctl restart postgresql
systemctl restart gunicorn
systemctl restart nginx
پس از این مرحله معمولاً سایت دوباره در دسترس قرار میگیرد.
چرا پر شدن دیسک باعث توقف PostgreSQL میشود؟
PostgreSQL برای عملیات مختلف مانند موارد زیر نیاز به فضای دیسک دارد:
- نوشتن WAL logs
- ایجاد temporary files
- ثبت لاگها
- اجرای queryهای سنگین
اگر دیسک کاملاً پر شود، دیتابیس نمیتواند فایلهای جدید ایجاد کند و در نتیجه سرویس متوقف میشود یا crash میکند.
چند راهکار برای جلوگیری از تکرار این مشکل
برای جلوگیری از این مشکل در آینده بهتر است چند اقدام پیشگیرانه انجام دهید.
1. مدیریت خودکار بکاپها
فقط تعداد محدودی از بکاپها را نگه دارید (مثلاً ۷ نسخه آخر).
2. فعال کردن logrotate
تا لاگهای سیستم بیش از حد بزرگ نشوند.
3. مانیتورینگ فضای دیسک
با ابزارهایی مثل:
- Netdata
- Prometheus
- Uptime Kuma
4. بررسی دورهای پوشههای حجیم
پوشههایی که معمولاً سریع بزرگ میشوند:
- `/var/log`
- `/backup`
- `/var/www/*/media`
جمعبندی
اگر سایت Django شما ناگهان با خطای 500 مواجه شد و در لاگها خطای اتصال به PostgreSQL دیدید، یکی از اولین چیزهایی که باید بررسی کنید پر بودن فضای دیسک سرور است.
مراحل حل مشکل به طور خلاصه:
1. بررسی فضای دیسک با `df -h`
2. پیدا کردن فایلهای حجیم
3. حذف یا پاکسازی فایلهای غیرضروری
4. راهاندازی مجدد PostgreSQL
5. ریستارت سرویسهای Gunicorn و Nginx
با همین چند مرحله ساده معمولاً سایت دوباره در دسترس قرار میگیرد.
نظرات کاربران (0)
هنوز نظری ثبت نشده است. اولین نفری باشید که نظر میدهید!