Khởi động, dừng và khởi động lại Apache: lệnh và khác biệt của graceful

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8Tài khoản rootKiểm tra ngày 2026-10-29

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 độngsystemctl start httpdsystemctl start apache2
Dừngsystemctl stop httpdsystemctl stop apache2
Khởi động lạisystemctl restart httpdsystemctl restart apache2
Đọc lại cấu hình (graceful)systemctl reload httpdsystemctl reload apache2
Xem trạng tháisystemctl status httpdsystemctl status apache2
Tự khởi động khi bootsystemctl enable httpdsystemctl 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 apache2
Unit 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 httpd

start khởi động Apache đang dừng. Hãy kiểm tra xem đã chạy chưa bằng systemctl status.

systemctl stop httpd

stop 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 httpd

restart 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 80

active (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 httpd
active

Khi đ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 httpd
enabled

enabled 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=mixed

Dò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.

🔁 Những gì thay đổi ở ba cách khởi động lại Apache
Sơ đồ giải thích
🔁 Lệnh
$ systemctl restart httpdhttpd -k restartsystemctl reload httpd
① Tiến trình cha (Main PID)Tắt rồi khởi động mớiSố Main PID thay đổi.Giữ nguyênNhận tín hiệu HUP và đọc lại tệp cấu hình.Giữ nguyênNhận tín hiệu USR1 và đọc lại tệp cấu hình.
② Yêu cầu đang xử lýXử lý xong rồi tắtViệc dừng là graceful-stop (WINCH) nên yêu cầu đang xử lý được hoàn tất.Bị cắt ngayKết thúc ngay các tiến trình con và khởi động tiến trình con mới.Xử lý đến cùngMỗi tiến trình con xong yêu cầu thì được thay bằng tiến trình con dùng cấu hình mới.
③ Kết nối mới đếnKhông nhận cho đến khi chạy lạiĐóng cổng khi dừng.Xử lý sau khi tiến trình con mới chạyGiữ cổng mở và xử lý khi tiến trình con mới đã chạy.Không bị cắtGiữ cổng mở để hệ điều hành cho các kết nối chờ.
systemctl restart httpd dừng Apache rồi khởi động lại, nên chính tiến trình cha cũng khởi động mới và trong lúc đó không nhận được kết nối mới.
httpd -k restart gửi tín hiệu HUP đến tiến trình cha và kết thúc ngay các tiến trình con, nên yêu cầu đang xử lý bị cắt.
systemctl reload httpd và apachectl graceful giữ nguyên tiến trình cha và thay tiến trình con theo thứ tự yêu cầu xử lý xong.

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 -t
Syntax OK

Chạ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 httpd

Nế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.

Trình mô phỏng lệnh Apachehttpd họ RHEL
[root@server work]#
Dùng phím ↑↓ trên bàn phím để gọi lại các lệnh đã gõ trước đó.

🔢 FAQ & nội dung đề xuất

Khi nhập apachectl fullstatus trên AlmaLinux 9, chúng tôi nhận lỗi báo không hỗ trợ tùy chọn fullstatus (not supported) và mã thoát 2. apachectl của họ RHEL là script được cài thay cho apachectl do Apache phân phối, nên chỉ nhận start, stop, restart, status, graceful, graceful-stop, configtest, -t và -v.

Theo hướng dẫn httpd.service, unit httpd mặc định ở trạng thái tắt (disabled), và preset: disabled ở dòng [Loaded] của systemctl status chính là giá trị mặc định đó. Chạy systemctl enable httpd một lần thì Apache sẽ khởi động mỗi lần boot, và thêm --now vào enable thì nó khởi động ngay lập tức.

Theo hướng dẫn httpd.service, nếu chạy httpd trực tiếp từ shell root, dịch vụ sẽ khởi động bên ngoài systemd và các giới hạn bảo mật mặc định như SELinux không được áp dụng. Vì vậy hãy khởi động và dừng bằng systemctl hoặc apachectl, và chỉ dùng lệnh httpd cho các tùy chọn không khởi động dịch vụ, như kiểm tra cú pháp -t.

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 0   +   2   =