مقدمه
خطای Apache AH00072: make_sock: could not bind to address زمانی رخ میدهد که وبسرور Apache نتواند روی آدرس IP یا پورتی که در فایلهای پیکربندی تعریف شده است، گوش دهد (Bind شود). این مشکل معمولاً هنگام راهاندازی یا ریاستارت سرویس Apache مشاهده میشود و باعث میشود سرویس به درستی اجرا نشود.
این خطا اغلب به یکی از دلایل زیر رخ میدهد:
- پورت موردنظر قبلاً توسط برنامه دیگری اشغال شده است.
- آدرس IP تعریفشده روی سرور وجود ندارد.
- چند VirtualHost یا سرویس مختلف از یک پورت و IP مشابه استفاده میکنند.
- فایلهای پیکربندی Apache دارای تنظیمات نادرست هستند.
- سرویس دیگری مانند Nginx، LiteSpeed یا Apache دوم روی همان پورت فعال است.
در این آموزش یاد میگیرید چگونه علت این خطا را پیدا کرده و آن را برطرف کنید.
مشاهده خطا
معمولاً هنگام بررسی وضعیت سرویس Apache با دستور زیر، خطا مشاهده میشود:
sudo systemctl status apache2
یا در توزیعهای مبتنی بر CentOS:
sudo systemctl status httpd
نمونه خروجی:
AH00072: make_sock: could not bind to address [::]:80
AH00451: no listening sockets available, shutting down
AH00015: Unable to open logs
این پیام نشان میدهد Apache نتوانسته روی پورت 80 گوش دهد.
علت اول: اشغال بودن پورت
رایجترین دلیل بروز این خطا، اشغال بودن پورت توسط سرویس دیگری است.
برای بررسی اینکه چه برنامهای از پورت 80 استفاده میکند، دستور زیر را اجرا کنید:
sudo ss -tulpn | grep :80
یا:
sudo lsof -i :80
نمونه خروجی:
nginx 1234 root 6u IPv4 12345 TCP *:80 (LISTEN)
در این مثال، سرویس Nginx روی پورت 80 فعال است و مانع اجرای Apache میشود.
راهحل
اگر به Nginx نیاز ندارید:
sudo systemctl stop nginx
sudo systemctl disable nginx
سپس Apache را مجدداً راهاندازی کنید:
sudo systemctl restart apache2
علت دوم: تعریف آدرس IP اشتباه
اگر در فایلهای پیکربندی Apache آدرس IP مشخصی تعریف شده باشد که روی سرور وجود ندارد، این خطا نمایش داده میشود.
نمونه تنظیم اشتباه:
Listen 192.168.1.100:80
در صورتی که این IP روی سرور فعال نباشد، Apache قادر به Bind شدن نخواهد بود.
بررسی IPهای سرور
ip addr show
یا:
hostname -I
راهحل
تنظیم Listen را به حالت عمومی تغییر دهید:
Listen 80
یا از IP صحیح استفاده کنید.
پس از ویرایش:
sudo apachectl configtest
اگر خروجی زیر نمایش داده شد:
Syntax OK
تنظیمات صحیح هستند.
علت سوم: وجود چند Listen مشابه
گاهی چند فایل پیکربندی مختلف یک پورت را چند بار تعریف میکنند.
برای بررسی:
grep -R "Listen" /etc/apache2/
یا:
grep -R "Listen" /etc/httpd/
نمونه مشکل:
Listen 80
Listen 80
یا:
Listen 0.0.0.0:80
Listen *:80
راهحل
تنها یک تعریف معتبر برای پورت باقی بگذارید:
Listen 80
علت چهارم: تنظیمات اشتباه VirtualHost
برخی اوقات VirtualHost روی IP یا پورتی تنظیم میشود که در سرور وجود ندارد.
نمونه:
<VirtualHost 10.10.10.10:80>
در حالی که این IP روی سرور تعریف نشده است.
راهحل
استفاده از:
<VirtualHost *:80>
یا IP واقعی سرور.
علت پنجم: اجرای همزمان چند نمونه Apache
در برخی موارد ممکن است یک نسخه دیگر از Apache از قبل در حال اجرا باشد.
برای بررسی:
ps aux | grep apache
یا:
ps aux | grep httpd
در صورت وجود پردازشهای اضافی:
sudo kill -9 PID
سپس:
sudo systemctl restart apache2
بررسی لاگهای Apache
برای مشاهده جزئیات بیشتر خطا:
در Ubuntu و Debian:
sudo journalctl -u apache2
یا:
sudo tail -f /var/log/apache2/error.log
در CentOS و AlmaLinux:
sudo tail -f /var/log/httpd/error_log
تست نهایی پیکربندی
قبل از هر بار ریاستارت Apache، بهتر است تنظیمات را بررسی کنید:
sudo apachectl configtest
خروجی صحیح:
Syntax OK
سپس:
sudo systemctl restart apache2
جمعبندی
خطای AH00072: make_sock: could not bind to address نشان میدهد Apache قادر به اتصال به آدرس IP یا پورت مشخصشده نیست. در اکثر مواقع، دلیل اصلی اشغال بودن پورت توسط سرویس دیگری مانند Nginx یا تعریف اشتباه IP در فایلهای پیکربندی است. با بررسی پورتهای فعال، تنظیمات Listen، VirtualHostها و لاگهای Apache میتوانید به سرعت علت مشکل را شناسایی و برطرف کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران