خطای شبکه HAProxy: cannot bind socket

مقدمه

خطای cannot bind socket در HAProxy زمانی رخ می‌دهد که:

  1. یک پروسه‌ی دیگر از همان IP و پورت استفاده می‌کند.
  2. یا HAProxy تلاش می‌کند به یک IP که روی سیستم وجود ندارد متصل شود.

این خطاها از سمت سیستم‌عامل (Linux) می‌آیند:

  • EADDRINUSE → پورت قبلاً توسط برنامه‌ای دیگر استفاده شده
  • EADDRNOTAVAIL → IP مورد نظر روی سیستم وجود ندارد

با این حال، هر دو حالت یک پیام خطای یکسان در HAProxy ایجاد می‌کنند، بنابراین برای عیب‌یابی باید وضعیت پورت‌ها و IPها را بررسی کنید.


مرحله ۱: بررسی با systemctl

اولین قدم بررسی وضعیت HAProxy است:

sudo systemctl status haproxy.service -l --no-pager

اگر خطا وجود داشته باشد، خروجی چیزی شبیه این خواهد بود:

cannot bind socket [0.0.0.0:80]

این یعنی HAProxy نتوانسته روی پورت 80 برای همه IPها اجرا شود.

اگر اطلاعات کامل نبود (مثلاً در Ubuntu)، باید از journalctl استفاده کنید.


مرحله ۲: بررسی لاگ‌ها با journalctl

sudo journalctl -u haproxy.service --since today --no-pager

در خروجی به دنبال این خط بگردید:

cannot bind socket [0.0.0.0:80]
cannot bind socket [:::80]
  • 0.0.0.0:80 → همه IPv4
  • :::80 → همه IPv6

مرحله ۳: پیدا کردن برنامه‌ای که پورت را گرفته (ss و ps)

برای دیدن اینکه چه برنامه‌ای پورت را گرفته:

sudo ss -4 -tlnp | grep 80

نمونه خروجی:

LISTEN ... 0.0.0.0:80 ... users:(("nginx",pid=40))

یعنی nginx روی پورت 80 اجراست.

برای دیدن جزئیات:

sudo ps -p 40

راه‌حل‌ها:

  • توقف سرویس مزاحم:
sudo systemctl stop nginx
  • تغییر پورت nginx یا HAProxy
  • یا اجرای HAProxy روی پورت دیگر (مثلاً 8080)

بررسی IPv6 (در صورت نیاز)

sudo ss -6 -tlnp | grep 80

مرحله ۴: بررسی IPهای سیستم (ip command)

اگر هیچ برنامه‌ای پورت را نگرفته بود، مشکل احتمالاً IP است:

sudo ip -4 -c address show

و برای IPv6:

sudo ip -6 -c address show

اگر IP مورد استفاده در HAProxy در این لیست نبود → خطا از نوع EADDRNOTAVAIL است.


اصلاح کانفیگ HAProxy

فایل زیر را ویرایش کنید:

/etc/haproxy/haproxy.cfg

مثلاً:

❌ اشتباه:

bind 198.51.100.123:80

✅ درست:

bind 198.51.100.1:80

ریستارت HAProxy

sudo systemctl restart haproxy.service

بررسی وضعیت:

sudo systemctl status haproxy.service

اگر درست شده باشد:

Active: active (running)

جمع‌بندی

برای رفع خطای cannot bind socket:

  1. با systemctl وضعیت را چک کن
  2. با journalctl جزئیات خطا را ببین
  3. با ss و ps بررسی کن چه برنامه‌ای پورت را گرفته
  4. با ip مطمئن شو IP معتبر است
  5. کانفیگ HAProxy را اصلاح کن

 

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *