خطای TCP bind() error Address already in use چیست؟
خطای ERROR TCP bind() error Address already in use یکی از رایجترین خطاهای سرور لینوکسی است که هنگام تلاش یک سرویس برای اتصال (bind) به یک پورت یا سوکت که قبلاً توسط سرویس دیگری اشغال شده رخ میدهد.
این خطا اغلب هنگام ریاستارت سرویسهایی مانند ClamAV، Apache، MySQL، LiteSpeed یا Nginx دیده میشود. در این مقاله دلایل بروز و راهحلهای کامل رفع این خطا را بررسی میکنیم.
دلایل بروز خطای Address already in use
۱. سرویس قبلی هنوز در حال اجرا است
شایعترین دلیل این است که نمونه قبلی سرویس به درستی متوقف نشده و هنوز پورت یا سوکت مورد نظر را اشغال کرده است. مثلاً اگر Apache روی پورت ۸۰ در حال اجراست و شما بخواهید نمونه دیگری از Apache اجرا کنید، این خطا رخ میدهد.
۲. تداخل سوکت ClamAV
در بسیاری از سرورهای هاستینگ، این خطا مربوط به ClamAV (clamd) است که از سوکت /tmp/clamd.socket استفاده میکند. اگر فایل سوکت قبلی بهدرستی پاک نشده باشد، clamd نمیتواند استارت شود.
۳. دو سرویس روی یک پورت
گاهی دو وبسرور مختلف (مثلاً Apache و Nginx) هر دو تنظیم شدهاند تا روی پورت ۸۰ یا ۴۴۳ گوش دهند.
روشهای رفع خطا
روش ۱: رفع مشکل ClamAV (clamd)
اگر خطا مربوط به ClamAV است، فایل پیکربندی clamd.conf را ویرایش کنید:
nano /etc/clamd.conf
خط زیر را پیدا کنید:
LocalSocket /tmp/clamd.socket
آن را به مسیر زیر تغییر دهید:
LocalSocket /var/run/clamd/clamd.socket
سپس پوشه مورد نیاز را ایجاد کنید و سرویس را ریاستارت نمایید:
mkdir -p /var/run/clamd
chown clamav:clamav /var/run/clamd
systemctl restart clamd
روش ۲: شناسایی سرویس اشغالکننده پورت
برای پیدا کردن اینکه کدام سرویس یک پورت خاص را اشغال کرده:
lsof -i :80
یا:
netstat -tulnp | grep :80
یا با دستور جدیدتر:
ss -tulnp | grep :80
این دستورات نام سرویس و PID فرآیند اشغالکننده پورت را نشان میدهند.
روش ۳: متوقف کردن سرویس مزاحم
پس از شناسایی PID فرآیند، آن را متوقف کنید:
kill -9 PID_NUMBER
و سپس سرویس مورد نظر را مجدداً استارت کنید.
روش ۴: حذف فایل سوکت قدیمی
گاهی فایل سوکت از سشن قبلی باقی مانده و باید دستی حذف شود:
rm -f /tmp/clamd.socket
rm -f /var/run/clamd/clamd.socket
روش ۵: بررسی TIME_WAIT
پس از بسته شدن یک اتصال TCP، پورت ممکن است برای مدتی در وضعیت TIME_WAIT باقی بماند. برای بررسی:
ss -s
اگر تعداد زیادی اتصال در وضعیت TIME_WAIT دارید، میتوانید تنظیمات کرنل را بهینه کنید:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
پیشگیری از تکرار خطا
برای جلوگیری از بروز مجدد این خطا، توصیه میشود همیشه سرویسها را با دستورات استاندارد systemctl متوقف و استارت کنید (به جای kill کردن مستقیم). مطمئن شوید که دو سرویس مشابه روی یک پورت تنظیم نشدهاند. همچنین فایروال CSF را بهدرستی پیکربندی کنید تا از تداخل سرویسها جلوگیری شود.
اگر این خطا مکرراً روی سرور شما رخ میدهد، ممکن است منابع سرور کافی نباشد. ارتقا به یک سرور مجازی با رم و CPU بیشتر میتواند از بسیاری از مشکلات ناشی از کمبود منابع جلوگیری کند.
همچنین برای پیکربندی حرفهای ClamAV، فایروال و سایر سرویسهای سرور، خدمات کانفیگ سرور میهن هاستینگ در اختیار شماست.
⚙️ کانفیگ حرفهای سرور
تنظیم ClamAV، فایروال CSF و رفع مشکلات سرویسهای سرور توسط متخصصان میهن هاستینگ.