เริ่ม หยุด และรีสตาร์ต Apache: คำสั่งและความต่างของ graceful
บนเซิร์ฟเวอร์ 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 httpd | systemctl start apache2 |
| หยุด | systemctl stop httpd | systemctl stop apache2 |
| รีสตาร์ต | systemctl restart httpd | systemctl restart apache2 |
| อ่านการตั้งค่าใหม่ (graceful) | systemctl reload httpd | systemctl reload apache2 |
| ตรวจสอบสถานะ | systemctl status httpd | systemctl status apache2 |
| เริ่มอัตโนมัติตอนบูต | systemctl enable httpd | systemctl enable apache2 |
รันคำสั่งในตารางด้วยบัญชี root ถ้าใช้บัญชีทั่วไป ให้ใส่ sudo หน้าคำสั่ง
ถ้าสับสนตระกูลแล้วใส่ชื่อผิด คำสั่งจะไม่ทำงาน เมื่อถามสถานะด้วย apache2 บนเซิร์ฟเวอร์ตระกูล RHEL ได้ข้อผิดพลาดว่าหายูนิตไม่พบ
systemctl status apache2Unit apache2.service could not be found.ตอนนั้นรหัสออกเป็น 4 และเมื่อเปลี่ยนชื่อเป็น httpd บนเซิร์ฟเวอร์เดียวกัน ก็ได้เอาต์พุตปกติ
ในตระกูล RHEL ใช้สามคำสั่งด้านล่างเพื่อเริ่ม หยุด และรีสตาร์ต Apache
systemctl start httpdstart จะเปิด Apache ที่หยุดอยู่ ตรวจสอบว่าเริ่มแล้วหรือยังด้วย systemctl status
systemctl stop httpdstop จะหยุด Apache และจะไม่รับคำขอเว็บจนกว่าคุณจะเริ่มใหม่
systemctl restart httpdrestart จะรัน 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 80active (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 httpdactiveตอนที่ทำงานอยู่ได้ active กับรหัสออก 0 แม้ใส่ apache2 ที่ไม่มีบนเซิร์ฟเวอร์ ก็ได้ inactive กับรหัสออก 3 เหมือนเซอร์วิสที่หยุด ดังนั้นในสคริปต์ให้ตรวจก่อนว่าชื่อเซอร์วิสถูกต้อง
systemctl is-enabled httpdenabledenabled คือสถานะที่ลงทะเบียนให้ 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 ไปยังโปรเซสแม่ โปรเซสแม่อ่านไฟล์การตั้งค่าใหม่ ส่วนโปรเซสลูกแต่ละตัวจะถูกแทนด้วยโปรเซสลูกที่ใช้การตั้งค่าใหม่ทันทีที่จัดการคำขอที่ค้างอยู่เสร็จ การเชื่อมต่อที่เข้ามาระหว่างนั้นระบบปฏิบัติการจะให้รอไว้ จึงไม่หายไป
เหมือนร้านที่เปิดอยู่โดยไม่ปิดประตู แล้วพนักงานแคชเชียร์แต่ละคนที่ดูแลลูกค้าเสร็จก็สลับกะกับพนักงานตามตารางกะใหม่ทีละคน
เราตรวจความต่างนี้ด้วย 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 -tSyntax 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 ก็เปลี่ยนเป็นหมายเลขใหม่
🔢 FAQ & เนื้อหาแนะนำ
Apache · ข้อผิดพลาดตอนรีสตาร์ต
ข้อผิดพลาดตอนรีสตาร์ต Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
สาเหตุที่คำสั่งอย่าง apachectl restart เกิดข้อผิดพลาดไฟล์ pid และขั้นตอนจัดการ httpd.pid ที่ว่างเปล่า
Apache · php-fpm
คำเตือน php-fpm max_children: หาสาเหตุจากล็อกก่อนเพิ่มเวิร์กเกอร์
บันทึกการใช้ล็อกหาสาเหตุที่คำเตือน max_children สะสมบนเซิร์ฟเวอร์ WordPress ที่ใช้ Nginx, Apache และ php-fpm
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน