เริ่ม หยุด และรีสตาร์ต Apache: คำสั่งและความต่างของ graceful

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบเมื่อ 2026-10-29

บนเซิร์ฟเวอร์ Linux การเริ่ม หยุด และรีสตาร์ต Apache ทำด้วยคำสั่ง systemctl และชื่อเซอร์วิสคือ httpd ในตระกูล RHEL และ apache2 ในตระกูล Debian เมื่ออ่านเอาต์พุตของ systemctl status ไฟล์ยูนิตของ httpd และสคริปต์ apachectl บนเซิร์ฟเวอร์ AlmaLinux 9 แล้ว พบว่า restart จะปิด Apache แล้วเปิดขึ้นใหม่ ส่วน graceful จะคงโปรเซสแม่ไว้และอ่านเฉพาะการตั้งค่าใหม่

เนื่องจากการหยุดและรีสตาร์ตทำให้เซอร์วิสหยุดจริง เราจึงไม่ได้รัน start, stop หรือ restart บนเซิร์ฟเวอร์ทดสอบ แต่ตรวจสอบพฤติกรรมจากเอกสารทางการของ Apache คู่มือ httpd.service และบันทึก reload ที่เหลืออยู่บนเซิร์ฟเวอร์แทน ชื่อโฮสต์ หมายเลขพอร์ต เวลา และจำนวนคำขอในเอาต์พุตด้านล่างเป็นค่าตัวอย่าง

1️⃣ คำสั่งเริ่ม หยุด และรีสตาร์ต Apache

ชื่อเซอร์วิสของ Apache ต่างกันตามตระกูลของดิสทริบิวชัน ตระกูล RHEL เช่น RHEL, AlmaLinux และ Rocky Linux ลงทะเบียนกับ systemd ในชื่อ httpd ส่วน Ubuntu และ Debian ใช้ชื่อ apache2

งานตระกูล RHEL (httpd)ตระกูล Debian (apache2)
เริ่มsystemctl start httpdsystemctl start apache2
หยุดsystemctl stop httpdsystemctl stop apache2
รีสตาร์ตsystemctl restart httpdsystemctl restart apache2
อ่านการตั้งค่าใหม่ (graceful)systemctl reload httpdsystemctl reload apache2
ตรวจสอบสถานะsystemctl status httpdsystemctl status apache2
เริ่มอัตโนมัติตอนบูตsystemctl enable httpdsystemctl enable apache2

รันคำสั่งในตารางด้วยบัญชี root ถ้าใช้บัญชีทั่วไป ให้ใส่ sudo หน้าคำสั่ง

ถ้าสับสนตระกูลแล้วใส่ชื่อผิด คำสั่งจะไม่ทำงาน เมื่อถามสถานะด้วย apache2 บนเซิร์ฟเวอร์ตระกูล RHEL ได้ข้อผิดพลาดว่าหายูนิตไม่พบ

systemctl status apache2
Unit apache2.service could not be found.

ตอนนั้นรหัสออกเป็น 4 และเมื่อเปลี่ยนชื่อเป็น httpd บนเซิร์ฟเวอร์เดียวกัน ก็ได้เอาต์พุตปกติ

ในตระกูล RHEL ใช้สามคำสั่งด้านล่างเพื่อเริ่ม หยุด และรีสตาร์ต Apache

systemctl start httpd

start จะเปิด Apache ที่หยุดอยู่ ตรวจสอบว่าเริ่มแล้วหรือยังด้วย systemctl status

systemctl stop httpd

stop จะหยุด Apache และจะไม่รับคำขอเว็บจนกว่าคุณจะเริ่มใหม่

systemctl restart httpd

restart จะรัน stop และ start ตามลำดับ ถ้าคุณแก้เฉพาะไฟล์การตั้งค่า ให้ใช้ reload (graceful) ที่ไม่ตัดการเชื่อมต่อ

apachectl ของ AlmaLinux 9 เป็นเชลล์สคริปต์ที่ติดตั้งแทน apachectl ที่ Apache แจกจ่าย เมื่อได้รับ start, stop, restart และ status จะส่งต่อให้ systemctl ตามเดิม ดังนั้น apachectl restart กับ systemctl restart httpd จึงทำงานเหมือนกัน

2️⃣ ตรวจสอบสถานะเซอร์วิส Apache

ใช้ systemctl status เพื่อดูว่า Apache กำลังทำงานอยู่หรือไม่ และเริ่มทำงานเมื่อไร

systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Sat 2026-10-17 08:30:49 UTC; 1 week 4 days ago
       Docs: man:httpd.service(8)
    Process: 2930107 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
   Main PID: 741 (httpd)
     Status: "Total requests: 52418; Idle/Busy workers 75/0;Requests/sec: 0.0528; Bytes served/sec: 3.9KB/sec"
      Tasks: 224 (limit: 4615)
     Memory: 184.3M (peak: 593.8M)
        CPU: 47min 33.944s
     CGroup: /system.slice/httpd.service
             ├─    741 /usr/sbin/httpd -DFOREGROUND
             ├─2930111 /usr/sbin/httpd -DFOREGROUND
             ├─2930143 /usr/sbin/httpd -DFOREGROUND
             └─2930144 /usr/sbin/httpd -DFOREGROUND

Oct 28 15:00:00 server systemd[1]: Reloading The Apache HTTP Server...
Oct 28 15:00:00 server systemd[1]: Reloaded The Apache HTTP Server.
Oct 28 15:00:00 server httpd[741]: Server configured, listening on: port 80

active (running) ในบรรทัด [Active] หมายความว่ากำลังทำงานอยู่ และเวลาหลัง since คือตอนที่เริ่ม เซิร์ฟเวอร์นี้เริ่มเมื่อ 11 วันก่อนและไม่เคยหยุดเลย และ [Main PID] 741 คือโปรเซสแม่ที่เริ่มในตอนนั้น

ใต้ [CGroup] รายการที่เรียงอยู่ใต้ 741 คือโปรเซสลูกที่จัดการคำขอจริง (ดู โปรเซส) บรรทัด [Status] แสดงจำนวนคำขอที่จัดการไปแล้ว และจำนวนเวิร์กเกอร์ที่ว่างและที่กำลังทำงาน

ล็อกสามบรรทัดล่างสุดของเอาต์พุตเป็นบันทึก reload ที่เกิดวันละครั้งในเวลาเดียวกัน เครื่องมือแบ่งล็อกตามวันที่ logrotate รัน systemctl reload httpd หลังหมุนเวียนล็อกเสร็จ และคู่มือ httpd.service ก็ระบุว่า httpd จะถูก reload หลัง logrotate

ในสคริปต์และคำสั่งตรวจสอบ ให้ใช้ is-active และ is-enabled ที่พิมพ์ออกมาเพียงคำเดียว

systemctl is-active httpd
active

ตอนที่ทำงานอยู่ได้ active กับรหัสออก 0 แม้ใส่ apache2 ที่ไม่มีบนเซิร์ฟเวอร์ ก็ได้ inactive กับรหัสออก 3 เหมือนเซอร์วิสที่หยุด ดังนั้นในสคริปต์ให้ตรวจก่อนว่าชื่อเซอร์วิสถูกต้อง

systemctl is-enabled httpd
enabled

enabled คือสถานะที่ลงทะเบียนให้ Apache เริ่มอัตโนมัติตอนบูต

3️⃣ ความต่างระหว่างการรีสตาร์ต Apache กับ graceful

restart กับ graceful (reload) จัดการคำขอที่กำลังประมวลผลและโปรเซสแม่ต่างกัน เราตรวจความต่างนี้ก่อนจากบรรทัดในไฟล์ยูนิตของ httpd ที่ใช้กับ reload และ stop

systemctl cat httpd | grep -E "Exec|Kill"
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixed

บรรทัด ExecReload หมายความว่าเมื่อได้รับ reload จะรัน httpd -k graceful และบรรทัด KillSignal หมายความว่าสัญญาณที่ส่งตอน stop คือ SIGWINCH (graceful-stop)

ดังนั้น systemctl restart httpd จะหยุด Apache ด้วย graceful-stop แล้วเริ่มใหม่ คำขอที่กำลังประมวลผลจะเสร็จก่อนปิด แต่โปรเซสแม่เองเริ่มใหม่ หมายเลข [Main PID] จึงเปลี่ยน ระหว่างหยุดจนถึงเริ่มพอร์ตจะปิด จึงรับการเชื่อมต่อใหม่ไม่ได้ ไฟล์ยูนิต apache2.service ในแพ็กเกจ Debian ก็รัน apachectl graceful-stop ตอนหยุดเช่นกัน

httpd -k restart ส่งสัญญาณ HUP ไปยังโปรเซสแม่ ตามเอกสารทางการของ Apache โปรเซสแม่ยังอยู่ แต่โปรเซสลูกถูกปิดทันที คำขอที่กำลังประมวลผลจึงถูกตัด และสถิติคำขอก็กลับเป็น 0

graceful ส่งสัญญาณ USR1 ไปยังโปรเซสแม่ โปรเซสแม่อ่านไฟล์การตั้งค่าใหม่ ส่วนโปรเซสลูกแต่ละตัวจะถูกแทนด้วยโปรเซสลูกที่ใช้การตั้งค่าใหม่ทันทีที่จัดการคำขอที่ค้างอยู่เสร็จ การเชื่อมต่อที่เข้ามาระหว่างนั้นระบบปฏิบัติการจะให้รอไว้ จึงไม่หายไป

เหมือนร้านที่เปิดอยู่โดยไม่ปิดประตู แล้วพนักงานแคชเชียร์แต่ละคนที่ดูแลลูกค้าเสร็จก็สลับกะกับพนักงานตามตารางกะใหม่ทีละคน

🔁 สิ่งที่เปลี่ยนไปในการรีสตาร์ต Apache สามแบบ
แผนภาพอธิบาย
🔁 คำสั่ง
$ systemctl restart httpdhttpd -k restartsystemctl reload httpd
① โปรเซสแม่ (Main PID)ปิดแล้วเริ่มใหม่หมายเลข Main PID เปลี่ยนคงเดิมรับสัญญาณ HUP แล้วอ่านไฟล์การตั้งค่าใหม่คงเดิมรับสัญญาณ USR1 แล้วอ่านไฟล์การตั้งค่าใหม่
② คำขอที่กำลังประมวลผลทำเสร็จแล้วจึงปิดการหยุดเป็น graceful-stop (WINCH) คำขอที่กำลังประมวลผลจึงทำจนเสร็จถูกตัดทันทีปิดโปรเซสลูกทันทีแล้วเริ่มโปรเซสลูกใหม่ประมวลผลจนจบโปรเซสลูกแต่ละตัวถูกแทนด้วยตัวที่ใช้การตั้งค่าใหม่เมื่อจัดการคำขอเสร็จ
③ การเชื่อมต่อใหม่ที่เข้ามารับไม่ได้จนกว่าจะเริ่มใหม่ปิดพอร์ตระหว่างหยุดประมวลผลหลังโปรเซสลูกใหม่เริ่มเปิดพอร์ตไว้ และประมวลผลเมื่อโปรเซสลูกใหม่เริ่มแล้วไม่ถูกตัดเปิดพอร์ตไว้ ระบบปฏิบัติการจึงให้การเชื่อมต่อรอ
systemctl restart httpd หยุด Apache แล้วเริ่มใหม่ โปรเซสแม่จึงเริ่มใหม่ด้วย และระหว่างนั้นรับการเชื่อมต่อใหม่ไม่ได้
httpd -k restart ส่งสัญญาณ HUP ไปยังโปรเซสแม่และปิดโปรเซสลูกทันที คำขอที่กำลังประมวลผลจึงถูกตัด
systemctl reload httpd และ apachectl graceful คงโปรเซสแม่ไว้ แล้วเปลี่ยนโปรเซสลูกตามลำดับที่คำขอเสร็จ

เราตรวจความต่างนี้ด้วย Main PID แม้ reload จะรันทุกวัน แต่ Main PID 741 และเวลา Active ยังเหมือนเมื่อ 11 วันก่อน และหมายเลขโปรเซสลูก (2930111 เป็นต้น) ต่อจาก 2930107 ในบรรทัด [Process] ของ reload ครั้งล่าสุดทันที

systemctl reload httpd, apachectl graceful และ httpd -k graceful ล้วนเป็น graceful เดียวกัน apachectl ของ AlmaLinux 9 เมื่อได้รับ graceful จะส่ง SIGUSR1 ไปยังโปรเซสแม่ด้วย systemctl kill และ apachectl -k graceful ที่ใส่ -k ไว้ข้างหน้าก็จะตัด -k ออกแล้วทำงานเหมือนกัน

graceful อ่านเฉพาะการตั้งค่าใหม่ จึงไม่เหมาะหลังอัปเดตแพ็กเกจ httpd ตามคู่มือ httpd.service ถ้าโมดูลที่อัปเดตใช้ฟีเจอร์ที่มีเฉพาะใน httpd ตัวใหม่ reload จะไม่ปลอดภัย แพ็กเกจ httpd จึงรีสตาร์ต Apache อัตโนมัติด้วย systemctl try-restart เมื่อมีการอัปเดต

4️⃣ ตรวจไวยากรณ์การตั้งค่า Apache

แม้จะใช้ graceful เพื่อให้มีผลโดยไม่ตัดการเชื่อมต่อ ถ้าไฟล์การตั้งค่ามีคำพิมพ์ผิด Apache ก็จะไม่เปลี่ยนไปใช้การตั้งค่าใหม่ ตามเอกสารทางการของ Apache restart และ graceful จะตรวจไวยากรณ์ก่อนทำงาน และถ้ามีข้อผิดพลาดจะแสดงแค่ข้อความข้อผิดพลาดโดยไม่รีสตาร์ต

ดังนั้นหลังแก้การตั้งค่า ให้ตรวจไวยากรณ์ด้วย apachectl -t ก่อน

apachectl -t
Syntax OK

เมื่อรัน apachectl -t ได้ Syntax OK หนึ่งบรรทัด และรันด้วย apachectl configtest ก็ได้ผลเหมือนกัน apachectl ของตระกูล RHEL เมื่อได้รับ -t จะรัน httpd -t ตามนั้น

เมื่อตรวจไฟล์การตั้งค่าทดสอบที่สะกดชื่อไดเรกทีฟผิดหนึ่งตัว แทนที่จะได้ Syntax OK กลับได้ข้อผิดพลาด AH00526 พร้อมบอกว่าเป็นบรรทัดที่เท่าไรและไดเรกทีฟใดที่ไม่รู้จัก ([Invalid command 'DirectoryIndx']) และรหัสออกเป็น 1 ให้แก้บรรทัดที่ข้อความข้อผิดพลาดระบุแล้วตรวจอีกครั้ง

systemctl reload httpd

ถ้าผ่านการตรวจ ให้ใช้ reload เพื่อให้การตั้งค่ามีผล ตามเอกสารทางการของ Apache การตรวจไวยากรณ์ดูแค่ไวยากรณ์ แม้จะผ่านก็ยังอาจใช้การตั้งค่าไม่สำเร็จ หลัง reload ให้ตรวจบรรทัด [Active] ของ systemctl status และล็อกล่างสุดอีกครั้ง

🔲 ตัวจำลองคำสั่ง Apache

บนเซิร์ฟเวอร์เสมือนในตัวจำลองด้านล่าง คุณพิมพ์คำสั่ง systemctl, apachectl และ httpd -k ได้เอง หลัง reload Main PID จะเหมือนเดิมและเปลี่ยนแค่หมายเลขโปรเซสลูก หลัง restart แม้แต่ Main PID ก็เปลี่ยนเป็นหมายเลขใหม่

ตัวจำลองคำสั่ง Apachehttpd ตระกูล RHEL
[root@server work]#
ใช้ปุ่ม ↑↓ บนแป้นพิมพ์เพื่อเรียกคำสั่งที่พิมพ์ไว้ก่อนหน้ากลับมา

🔢 FAQ & เนื้อหาแนะนำ

เมื่อพิมพ์ apachectl fullstatus บน AlmaLinux 9 ได้ข้อผิดพลาดว่าไม่รองรับตัวเลือก fullstatus (not supported) และรหัสออก 2 apachectl ของตระกูล RHEL เป็นสคริปต์ที่ติดตั้งแทน apachectl ที่ Apache แจกจ่าย จึงรับเฉพาะ start, stop, restart, status, graceful, graceful-stop, configtest, -t และ -v

ตามคู่มือ httpd.service ยูนิต httpd ปิดอยู่ (disabled) เป็นค่าเริ่มต้น และ preset: disabled ในบรรทัด [Loaded] ของ systemctl status คือค่าเริ่มต้นนั้น ถ้ารัน systemctl enable httpd ครั้งเดียว Apache จะเริ่มทุกครั้งที่บูต และถ้าใส่ --now กับ enable ก็จะเริ่มทันทีด้วย

ตามคู่มือ httpd.service ถ้ารัน httpd โดยตรงจากเชลล์ root เซอร์วิสจะเริ่มนอก systemd และข้อจำกัดด้านความปลอดภัยเริ่มต้นอย่าง SELinux จะไม่ถูกใช้ ดังนั้นให้เริ่มและหยุดด้วย systemctl หรือ apachectl และใช้คำสั่ง httpd เฉพาะกับตัวเลือกที่ไม่เปิดเซอร์วิส เช่น การตรวจไวยากรณ์ -t

🔗 เนื้อหาแนะนำ
ขั้นต่อไป โมดูล MPM ของ Apache: เปรียบเทียบ Prefork, Worker, Event และการปรับแต่งโมดูล Event บทความที่เปรียบเทียบว่า MPM สามแบบ Prefork, Worker และ Event แบ่งคำขอให้โปรเซสและเธรดต่างกันอย่างไร พร้อมค่าการตั้งค่าโมดูล Event อ่านบทความ → Linux

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 5   +   6   =