Khởi động, dừng và khởi động lại Apache: lệnh và khác biệt của graceful
Trên máy chủ Linux, việc khởi động, dừng và khởi động lại Apache được thực hiện bằng lệnh systemctl, và tên dịch vụ là httpd ở họ RHEL, apache2 ở họ Debian. Sau khi đọc đầu ra của systemctl status, tệp unit của httpd và script apachectl trên máy chủ AlmaLinux 9, chúng tôi thấy restart tắt Apache rồi bật lại, còn graceful giữ nguyên tiến trình cha và chỉ đọc lại cấu hình.
Vì dừng và khởi động lại sẽ thật sự làm dịch vụ ngừng chạy, chúng tôi không chạy start, stop hay restart trên máy chủ thử nghiệm. Thay vào đó, chúng tôi kiểm tra hoạt động qua tài liệu chính thức của Apache, hướng dẫn httpd.service và các bản ghi reload còn lại trên máy chủ. Tên máy chủ, số cổng, thời gian và số yêu cầu trong đầu ra bên dưới là giá trị ví dụ.
1️⃣ Lệnh khởi động, dừng và khởi động lại Apache
Tên dịch vụ của Apache khác nhau tùy họ bản phân phối. Họ RHEL như RHEL, AlmaLinux và Rocky Linux đăng ký với systemd dưới tên httpd, còn Ubuntu và Debian dưới tên apache2.
| Tác vụ | Họ RHEL (httpd) | Họ Debian (apache2) |
|---|---|---|
| Khởi động | systemctl start httpd | systemctl start apache2 |
| Dừng | systemctl stop httpd | systemctl stop apache2 |
| Khởi động lại | systemctl restart httpd | systemctl restart apache2 |
| Đọc lại cấu hình (graceful) | systemctl reload httpd | systemctl reload apache2 |
| Xem trạng thái | systemctl status httpd | systemctl status apache2 |
| Tự khởi động khi boot | systemctl enable httpd | systemctl enable apache2 |
Hãy chạy các lệnh trong bảng bằng tài khoản root. Nếu dùng tài khoản thường, hãy thêm sudo trước lệnh.
Nếu nhầm họ và nhập tên kia, lệnh sẽ không chạy. Khi hỏi trạng thái bằng apache2 trên máy chủ họ RHEL, chúng tôi nhận được lỗi báo không tìm thấy unit.
systemctl status apache2Unit apache2.service could not be found.Lúc đó mã thoát là 4, và khi đổi tên thành httpd trên cùng máy chủ thì đầu ra bình thường xuất hiện.
Trên họ RHEL, bạn khởi động, dừng và khởi động lại Apache bằng ba lệnh bên dưới.
systemctl start httpdstart khởi động Apache đang dừng. Hãy kiểm tra xem đã chạy chưa bằng systemctl status.
systemctl stop httpdstop dừng Apache. Cho đến khi bạn khởi động lại, Apache không nhận yêu cầu web.
systemctl restart httpdrestart lần lượt chạy stop và start. Nếu bạn chỉ đổi tệp cấu hình, hãy áp dụng bằng reload (graceful), cách này không cắt kết nối.
Trên AlmaLinux 9, apachectl là một shell script được cài thay cho apachectl do Apache phân phối. Khi nhận start, stop, restart và status, nó chuyển nguyên cho systemctl, nên apachectl restart và systemctl restart httpd hoạt động giống nhau.
2️⃣ Kiểm tra trạng thái dịch vụ Apache
Để biết Apache có đang chạy không và khởi động lúc nào, hãy dùng systemctl status.
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) ở dòng [Active] nghĩa là đang chạy, và thời điểm sau since là lúc khởi động. Máy chủ này khởi động 11 ngày trước và chưa dừng lần nào, và [Main PID] 741 là tiến trình cha được khởi động lúc đó.
Dưới [CGroup], các mục xếp bên dưới 741 là tiến trình con thực sự xử lý yêu cầu (xem Tiến trình). Dòng [Status] cho biết số yêu cầu đã xử lý đến nay và số worker đang rảnh, đang làm việc.
Ba dòng log ở cuối đầu ra là bản ghi reload xuất hiện mỗi ngày một lần vào cùng giờ: công cụ logrotate, vốn chia log theo ngày, đã chạy systemctl reload httpd sau khi xoay vòng xong, và hướng dẫn httpd.service cũng ghi rằng httpd được reload sau logrotate.
Trong script và lệnh kiểm tra, hãy dùng is-active và is-enabled, vốn chỉ in ra một từ.
systemctl is-active httpdactiveKhi đang chạy, kết quả là active với mã thoát 0. Ngay cả khi nhập apache2, vốn không có trên máy chủ, kết quả cũng là inactive với mã thoát 3 giống như dịch vụ đã dừng, nên trong script hãy kiểm tra trước tên dịch vụ có đúng không.
systemctl is-enabled httpdenabledenabled là trạng thái Apache được đăng ký để tự khởi động khi boot.
3️⃣ Khác biệt giữa khởi động lại Apache và graceful
restart và graceful (reload) xử lý khác nhau các yêu cầu đang chạy và tiến trình cha. Chúng tôi kiểm tra khác biệt đó trước tiên qua các dòng dùng cho reload và stop trong tệp unit của httpd.
systemctl cat httpd | grep -E "Exec|Kill"ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixedDòng ExecReload nghĩa là khi nhận reload sẽ chạy httpd -k graceful, còn dòng KillSignal nghĩa là tín hiệu gửi khi stop là SIGWINCH (graceful-stop).
Vì vậy systemctl restart httpd dừng Apache bằng graceful-stop rồi khởi động lại. Các yêu cầu đang chạy được xử lý xong rồi mới tắt, nhưng chính tiến trình cha cũng khởi động lại nên số [Main PID] thay đổi. Từ lúc dừng đến lúc khởi động, cổng bị đóng nên không nhận kết nối mới. Tệp unit apache2.service trong gói Debian cũng chạy apachectl graceful-stop khi dừng.
httpd -k restart gửi tín hiệu HUP đến tiến trình cha. Theo tài liệu chính thức của Apache, tiến trình cha vẫn còn nhưng các tiến trình con bị kết thúc ngay, nên yêu cầu đang chạy bị cắt và thống kê yêu cầu cũng về 0.
graceful gửi tín hiệu USR1 đến tiến trình cha. Tiến trình cha đọc lại tệp cấu hình, còn mỗi tiến trình con được thay bằng tiến trình con dùng cấu hình mới ngay khi xử lý xong yêu cầu đang làm. Các kết nối đến trong lúc đó được hệ điều hành cho chờ nên không bị mất.
Giống như một cửa hàng vẫn mở cửa, còn từng nhân viên thu ngân phục vụ xong khách thì lần lượt đổi ca với đồng nghiệp theo lịch ca mới.
Chúng tôi kiểm tra khác biệt này bằng Main PID. Dù reload chạy mỗi ngày, Main PID 741 và thời điểm Active vẫn như 11 ngày trước, còn số của các tiến trình con (2930111 v.v.) nối ngay sau 2930107 ở dòng [Process] của lần reload cuối.
systemctl reload httpd, apachectl graceful và httpd -k graceful đều là cùng một graceful. Trên AlmaLinux 9, khi nhận graceful, apachectl gửi SIGUSR1 đến tiến trình cha bằng systemctl kill, và apachectl -k graceful có -k phía trước cũng bỏ -k rồi làm y như vậy.
graceful chỉ đọc lại cấu hình nên không phù hợp sau khi cập nhật gói httpd. Theo hướng dẫn httpd.service, nếu module được cập nhật dùng tính năng chỉ có trong httpd mới thì reload không an toàn, vì vậy gói httpd tự khởi động lại Apache bằng systemctl try-restart khi được cập nhật.
4️⃣ Kiểm tra cú pháp cấu hình Apache
Dù bạn áp dụng thay đổi bằng graceful để không cắt kết nối, nếu tệp cấu hình có lỗi gõ thì Apache không chuyển sang cấu hình mới. Theo tài liệu chính thức của Apache, restart và graceful kiểm tra cú pháp trước khi chạy, và nếu có lỗi thì chỉ in thông báo lỗi chứ không khởi động lại.
Vì vậy, sau khi sửa cấu hình, hãy kiểm tra cú pháp trước bằng apachectl -t.
apachectl -tSyntax OKChạy apachectl -t cho ra một dòng Syntax OK, và chạy apachectl configtest cũng cho kết quả giống vậy. apachectl của họ RHEL khi nhận -t sẽ chạy nguyên httpd -t.
Khi kiểm tra một tệp cấu hình thử có một tên chỉ thị bị viết sai, thay vì Syntax OK là lỗi AH00526 kèm số dòng và chỉ thị không nhận ra ([Invalid command 'DirectoryIndx']), và mã thoát là 1. Hãy sửa dòng được nêu trong thông báo lỗi rồi kiểm tra lại.
systemctl reload httpdNếu qua kiểm tra, hãy áp dụng cấu hình bằng reload. Theo tài liệu chính thức của Apache, kiểm tra cú pháp chỉ xem cú pháp, nên dù qua vẫn có thể áp dụng thất bại. Sau reload, hãy xem lại dòng [Active] của systemctl status và log ở cuối thêm một lần.
🔲 Trình mô phỏng lệnh Apache
Trên máy chủ ảo của trình mô phỏng bên dưới, bạn có thể tự nhập lệnh systemctl, apachectl và httpd -k. Sau reload, Main PID giữ nguyên và chỉ số tiến trình con thay đổi. Sau restart, ngay cả Main PID cũng đổi sang số mới.
🔢 FAQ & nội dung đề xuất
Apache · Lỗi khởi động lại
Lỗi khởi động lại Apache | (20014)Internal error: Error retrieving pid file logs/httpd.pid
Nguyên nhân lỗi tệp pid ở các lệnh như apachectl restart và các bước dọn httpd.pid trống.
Apache · php-fpm
Cảnh báo php-fpm max_children: tìm nguyên nhân trong log trước khi tăng worker
Ghi chép việc dùng log tìm ra nguyên nhân cảnh báo max_children dồn lại trên máy chủ WordPress chạy Nginx, Apache và php-fpm.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.