حل خطای service httpd does not support chkconfig
پیام service httpd does not support chkconfig یعنی فایل /etc/init.d/httpd هدر مخصوصی که ابزار chkconfig انتظار دارد را ندارد. اما پاسخ کاملتر این است که روی هیچ توزیع بهروزی نباید سراغ chkconfig بروید؛ مدیریت سرویسها سالهاست به systemd منتقل شده و راه درست امروز، ساختن یک یونیت systemd و اجرای systemctl enable --now httpd است.
چرا این خطا ظاهر میشود
chkconfig ابزار دوران SysV init است. کار آن این است که اسکریپتهای داخل /etc/init.d/ را بخواند و مشخص کند سرویس در کدام سطح اجرا (runlevel) بالا بیاید. این ابزار برای شناختن یک اسکریپت، به دو خط توضیح در ابتدای فایل نیاز دارد: یکی با الگوی # chkconfig: levels start stop و دیگری # description:. وقتی آپاچی را از سورس کامپایل میکنید و فایل apachectl را مستقیماً در /etc/init.d/httpd کپی میکنید، آن دو خط وجود ندارند و chkconfig فایل را نمیپذیرد.
دلیل دوم و مهمتر: روی توزیعهای امروزی chkconfig فقط یک لایه سازگاری نازک روی systemd است. سرویسهایی که به شکل یونیت بومی systemd تعریف شدهاند اصلاً در /etc/init.d/ فایلی ندارند، پس chkconfig هم آنها را نمیبیند. یعنی حتی اگر خطا را با ترفند قدیمی دور بزنید، باز هم دارید با ابزاری کار میکنید که قرار نیست مرجع باشد.
اول ببینید سیستم شما اصلاً SysV است یا نه
احتمال بسیار زیادی هست که سیستم شما systemd باشد. خانواده ردهت از CentOS 7 به بعد، دبیان از Debian 8 به بعد و اوبونتو از Ubuntu 15.04 به بعد همگی systemd دارند. برای اطمینان این دو دستور را بزنید:
cat /etc/os-release— نام و نسخه دقیق توزیعps -p 1 -o comm=— اگر خروجیsystemdبود، تکلیف روشن است
نکته دیگری هم هست که آموزشهای قدیمی به شما نمیگویند: CentOS 8 در پایان دسامبر ۲۰۲۱ و CentOS 7 در پایان ژوئن ۲۰۲۴ به پایان پشتیبانی رسیدند و دیگر بهروزرسانی امنیتی نمیگیرند. اگر هنوز روی این نسخهها هستید، مهاجرت به AlmaLinux، Rocky Linux، RHEL یا یک نسخه LTS اوبونتو اولویت اول شماست. روی سرور مجازی ابری ایران دسترسی کامل مدیریتی در اختیار شماست و میتوانید سیستمعامل را خودتان نصب کنید، پس از همان ابتدا کار را روی یک پایه پشتیبانیشده شروع کنید.
راهحل درست: یونیت systemd بسازید
قبل از هر کاری یک نکته: اگر آپاچی را خودتان کامپایل نکردهاید و سرور زیر یک کنترلپنل مثل دایرکتادمین یا cPanel است، وبسرور از قبل یونیت systemd خودش را دارد. در آن حالت فایل دستی نسازید؛ فقط systemctl status httpd را ببینید و اگر لازم بود از خود کنترلپنل سرویس را بازسازی کنید.
اما اگر آپاچی را دستی کامپایل کردهاید، به جای دستکاری /etc/init.d/ یک فایل جدید در مسیر /etc/systemd/system/httpd.service بسازید و این خطوط را در آن قرار دهید (مسیرها را با محل نصب واقعی خودتان جایگزین کنید؛ پیشفرض کامپایل از سورس معمولاً /usr/local/apache2 است):
[Unit]Description=The Apache HTTP ServerAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/apache2/logs/httpd.pidExecStart=/usr/local/apache2/bin/apachectl startExecReload=/usr/local/apache2/bin/apachectl gracefulExecStop=/usr/local/apache2/bin/apachectl stop[Install]WantedBy=multi-user.target
سپس به systemd بگویید فایلها را دوباره بخواند و سرویس را فعال کنید:
systemctl daemon-reloadsystemctl enable --now httpd
سوییچ --now سرویس را هم فعال و هم همان لحظه اجرا میکند. از این به بعد آپاچی بعد از هر ریبوت خودکار بالا میآید، بدون اینکه به chkconfig نیازی باشد.
معادلهای systemd برای دستورهای قدیمی
| دستور قدیمی | معادل امروزی |
chkconfig httpd on |
systemctl enable httpd |
chkconfig httpd off |
systemctl disable httpd |
chkconfig --list httpd |
systemctl is-enabled httpd |
chkconfig --list |
systemctl list-unit-files --type=service |
service httpd restart |
systemctl restart httpd |
service httpd status |
systemctl status httpd |
runlevel 3 و runlevel 5 |
multi-user.target و graphical.target |
همین جدول توضیح میدهد چرا سوییچ --level 235 در آموزشهای قدیمی امروز بیمعناست: systemd اصلاً مفهوم runlevel عددی ندارد و به جای آن از تارگت استفاده میکند.
چطور مطمئن شویم کار کرده است
خروجی systemctl is-enabled httpd باید enabled باشد و systemctl status httpd باید وضعیت active (running) نشان دهد. اگر چیزی درست نبود، journalctl -u httpd -n 50 --no-pager دقیقترین لاگ را میدهد. بهترین تست نهایی هم یک ریبوت واقعی است؛ چه روی سرور مجازی کار کنید چه روی سرور اختصاصی ایران، این ریبوت را در یک بازه کمترافیک و پیش از رفتن به محیط عملیاتی انجام دهید تا مطمئن شوید سرویس واقعاً خودکار بالا میآید.
خطاهای رایج بعد از ساخت یونیت
- Unit httpd.service not found — یا
systemctl daemon-reloadرا نزدهاید یا مسیر و نام فایل اشتباه است. - سرویس failed نشان میدهد ولی آپاچی بالاست — معمولاً مقدار
PIDFileبا مسیر واقعی نمیخواند. مسیر درست را باhttpd -Vو خطDEFAULT_PIDLOGپیدا کنید. - پورت اشغال است — یک وبسرور دیگر (نسخه بستهای آپاچی، انجینایکس یا لایتاسپید) روی همان پورت نشسته. با
ss -lntpببینید چه چیزی گوش میدهد. - یونیت masked شده — با
systemctl unmask httpdآزادش کنید. - سرویس دستی بالا میآید ولی بعد از ریبوت نه — یعنی
systemctl enable httpdاجرا نشده؛ باsystemctl is-enabled httpdبررسی کنید.
درس کلی برای آموزشهای قدیمی
هر وقت در یک راهنما به chkconfig، /etc/init.d/، service یا runlevel عددی برخوردید، بدانید متن مربوط به نسلی قبل از systemd است. لزوماً غلط نیست، ولی باید ترجمهاش کنید. قبل از اجرای هر دستور، نسخه توزیع خودتان را چک کنید و معادل امروزی را بزنید؛ همین یک عادت جلوی نیمی از خطاهای عجیب سرور را میگیرد. اگر ترجیح میدهید این جابهجاییها و سختسازی سرویسها را به تیم متخصص بسپارید، خدمات پشتیبانی و مدیریت سرور آنلاین سرور روی آپاچی و سایر وبسرورها هم ارائه میشود.
ارسال نظر