Apache HTTP 伺服器 2.4 版
本文檔涵蓋在類 Unix 系統上停止和重新啟動 Apache HTTP 伺服器。Windows NT、2000 和 XP 用戶應參閱 將 httpd 作為服務運行,而 Windows 9x 和 ME 用戶應參閱 將 httpd 作為主控台應用程式運行,以了解如何在這些平台上控制 httpd。
要停止或重新啟動 Apache HTTP 伺服器,您必須向正在運行的 httpd
程序發送信號。發送信號的方法有兩種。首先,您可以使用 unix 的 kill
命令直接向程序發送信號。您會注意到系統上運行了許多 httpd
可執行檔,但您不應向其中任何一個發送信號,除了父程序,其 pid 位於 PidFile
中。也就是說,除了父程序之外,您永遠不需要向任何程序發送信號。您可以向父程序發送四個信號:TERM
、USR1
、HUP
和 WINCH
,稍後將對其進行說明。
要向父程序發送信號,您應該發出如下命令
kill -TERM `cat /usr/local/apache2/logs/httpd.pid`
向 httpd
程序發送信號的第二種方法是使用 -k
命令列選項:stop
、restart
、graceful
和 graceful-stop
,如下所述。這些是 httpd
二進位檔的參數,但我們建議您使用 apachectl
控制腳本來發送它們,它會將它們傳遞給 httpd
。
向 httpd
發送信號後,您可以通過發出以下命令來了解其進度
tail -f /usr/local/apache2/logs/error_log
修改這些範例以符合您的 ServerRoot
和 PidFile
設定。
apachectl -k stop
向父程序發送 TERM
或 stop
信號會導致它立即嘗試殺死所有子程序。它可能需要幾秒鐘才能完成殺死其子程序。然後父程序本身退出。任何正在進行的請求都將終止,並且不再提供進一步的請求。
apachectl -k graceful
USR1
或 graceful
信號會導致父程序 建議 子程序在其當前請求之後退出(或者如果它們沒有提供任何服務則立即退出)。父程序重新讀取其設定檔並重新打開其日誌檔。當每個子程序都消失後,父程序會用來自新一代設定的子程序替換它,該子程序立即開始服務新的請求。
此程式碼旨在始終遵循 MPM 的程序控制指令,因此在整個重新啟動過程中,可用於為客戶端提供服務的程序和執行緒數量將保持在適當的值。此外,它還以以下方式遵循 StartServers
:如果在一秒鐘後至少沒有建立 StartServers
個新的子程序,則建立足夠的子程序來彌補不足。因此,程式碼嘗試同時維護適合伺服器當前負載的子程序數量,並遵循您對 StartServers
參數的期望。
mod_status
的使用者會注意到,當發送 USR1
時,伺服器統計資訊 不會 設定為零。編寫程式碼是為了最大程度地減少伺服器無法服務新請求的時間(它們將由作業系統排隊,因此無論如何都不會丟失),並遵循您的調整參數。為了做到這一點,它必須保留用於跨代跟踪所有子程序的 記分板。
狀態模組還將使用 G
來指示那些仍在服務在發出優雅重新啟動之前啟動的請求的子程序。
目前,使用 USR1
的日誌輪換腳本無法確定所有寫入重新啟動前日誌的子程序都已完成。我們建議您在發送 USR1
信號後,在對舊日誌執行任何操作之前使用適當的延遲。例如,如果大多數點擊對於低頻寬連結上的使用者而言,完成時間不到 10 分鐘,則您可以在對舊日誌執行任何操作之前等待 15 分鐘。
apachectl -k restart
向父程序發送 HUP
或 restart
信號會導致它像在 TERM
中一樣殺死其子程序,但父程序不會退出。它重新讀取其設定檔,並重新打開任何日誌檔。然後它產生一組新的子程序並繼續服務點擊。
mod_status
的使用者會注意到,當發送 HUP
時,伺服器統計資訊會設定為零。
apachectl -k graceful-stop
WINCH
或 graceful-stop
信號會導致父程序 建議 子程序在其當前請求之後退出(或者如果它們沒有提供任何服務則立即退出)。然後,父程序將刪除其 PidFile
並停止偵聽所有連接埠。父程序將繼續運行,並監視正在處理請求的子程序。一旦所有子程序都已完成並退出或已達到 GracefulShutdownTimeout
指定的超時,父程序也將退出。如果達到超時,將向任何剩餘的子程序發送 TERM
信號以強制它們退出。
當處於“優雅”狀態時,TERM
信號將立即終止父程序和所有子程序。但是,由於 PidFile
已被刪除,因此您將無法使用 apachectl
或 httpd
發送此信號。
graceful-stop
信號允許您同時運行多個配置相同的 httpd
實例。這是在執行 httpd 的優雅升級時的一項強大功能,但是它也可能導致某些配置出現死結和競爭條件。
已採取措施確保磁碟上的檔案(例如鎖定檔案 (Mutex
) 和 Unix 通訊端檔案 (ScriptSock
))包含伺服器 PID,並且應該可以毫無問題地共存。但是,如果配置指令、第三方模組或持久性 CGI 使用任何其他磁碟鎖定或狀態檔案,則應注意確保 httpd
的多個正在運行的實例不會相互覆蓋檔案。
您還應警惕其他潛在的競爭條件,例如使用 rotatelogs
樣式的管道日誌記錄。多個 rotatelogs
實例嘗試同時輪換相同的日誌檔可能會破壞彼此的日誌檔。