دسته بندی:

حل خطای service httpd does not support chkconfig

حل خطای 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 Server
  • After=network.target remote-fs.target nss-lookup.target
  • [Service]
  • Type=forking
  • PIDFile=/usr/local/apache2/logs/httpd.pid
  • ExecStart=/usr/local/apache2/bin/apachectl start
  • ExecReload=/usr/local/apache2/bin/apachectl graceful
  • ExecStop=/usr/local/apache2/bin/apachectl stop
  • [Install]
  • WantedBy=multi-user.target

سپس به systemd بگویید فایل‌ها را دوباره بخواند و سرویس را فعال کنید:

  • systemctl daemon-reload
  • systemctl 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 است. لزوماً غلط نیست، ولی باید ترجمه‌اش کنید. قبل از اجرای هر دستور، نسخه توزیع خودتان را چک کنید و معادل امروزی را بزنید؛ همین یک عادت جلوی نیمی از خطاهای عجیب سرور را می‌گیرد. اگر ترجیح می‌دهید این جابه‌جایی‌ها و سخت‌سازی سرویس‌ها را به تیم متخصص بسپارید، خدمات پشتیبانی و مدیریت سرور آنلاین سرور روی آپاچی و سایر وب‌سرورها هم ارائه می‌شود.

آموزش‌های مرتبط

ارسال نظر