<-
Apache > HTTP 伺服器 > 文件 > 2.4 版

停止和重新啟動 Apache HTTP 伺服器

可用語言: de  |  en  |  es  |  fr  |  ja  |  ko  |  tr 

本文檔涵蓋在類 Unix 系統上停止和重新啟動 Apache HTTP 伺服器。Windows NT、2000 和 XP 用戶應參閱 將 httpd 作為服務運行,而 Windows 9x 和 ME 用戶應參閱 將 httpd 作為主控台應用程式運行,以了解如何在這些平台上控制 httpd。

Support Apache!

另請參閱

top

簡介

要停止或重新啟動 Apache HTTP 伺服器,您必須向正在運行的 httpd 程序發送信號。發送信號的方法有兩種。首先,您可以使用 unix 的 kill 命令直接向程序發送信號。您會注意到系統上運行了許多 httpd 可執行檔,但您不應向其中任何一個發送信號,除了父程序,其 pid 位於 PidFile 中。也就是說,除了父程序之外,您永遠不需要向任何程序發送信號。您可以向父程序發送四個信號:TERMUSR1HUPWINCH,稍後將對其進行說明。

要向父程序發送信號,您應該發出如下命令

kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

httpd 程序發送信號的第二種方法是使用 -k 命令列選項:stoprestartgracefulgraceful-stop,如下所述。這些是 httpd 二進位檔的參數,但我們建議您使用 apachectl 控制腳本來發送它們,它會將它們傳遞給 httpd

httpd 發送信號後,您可以通過發出以下命令來了解其進度

tail -f /usr/local/apache2/logs/error_log

修改這些範例以符合您的 ServerRootPidFile 設定。

top

立即停止

信號:TERM
apachectl -k stop

向父程序發送 TERMstop 信號會導致它立即嘗試殺死所有子程序。它可能需要幾秒鐘才能完成殺死其子程序。然後父程序本身退出。任何正在進行的請求都將終止,並且不再提供進一步的請求。

top

優雅地重新啟動

信號:USR1
apachectl -k graceful

USR1graceful 信號會導致父程序 建議 子程序在其當前請求之後退出(或者如果它們沒有提供任何服務則立即退出)。父程序重新讀取其設定檔並重新打開其日誌檔。當每個子程序都消失後,父程序會用來自新一代設定的子程序替換它,該子程序立即開始服務新的請求。

此程式碼旨在始終遵循 MPM 的程序控制指令,因此在整個重新啟動過程中,可用於為客戶端提供服務的程序和執行緒數量將保持在適當的值。此外,它還以以下方式遵循 StartServers:如果在一秒鐘後至少沒有建立 StartServers 個新的子程序,則建立足夠的子程序來彌補不足。因此,程式碼嘗試同時維護適合伺服器當前負載的子程序數量,並遵循您對 StartServers 參數的期望。

mod_status 的使用者會注意到,當發送 USR1 時,伺服器統計資訊 不會 設定為零。編寫程式碼是為了最大程度地減少伺服器無法服務新請求的時間(它們將由作業系統排隊,因此無論如何都不會丟失),並遵循您的調整參數。為了做到這一點,它必須保留用於跨代跟踪所有子程序的 記分板

狀態模組還將使用 G 來指示那些仍在服務在發出優雅重新啟動之前啟動的請求的子程序。

目前,使用 USR1 的日誌輪換腳本無法確定所有寫入重新啟動前日誌的子程序都已完成。我們建議您在發送 USR1 信號後,在對舊日誌執行任何操作之前使用適當的延遲。例如,如果大多數點擊對於低頻寬連結上的使用者而言,完成時間不到 10 分鐘,則您可以在對舊日誌執行任何操作之前等待 15 分鐘。

當您發出重新啟動時,會先執行語法檢查,以確保設定檔中沒有錯誤。如果您的設定檔中有錯誤,您將收到有關該語法錯誤的錯誤訊息,並且伺服器將拒絕重新啟動。這避免了伺服器停止然後無法重新啟動的情況,從而導致伺服器無法運作。

這仍然不能保證伺服器會正確重新啟動。要檢查設定檔的語義以及語法,您可以嘗試以非 root 使用者的身份啟動 httpd。如果沒有錯誤,它將嘗試打開其通訊端和日誌,但會失敗,因為它不是 root(或者因為當前運行的 httpd 已經綁定了這些連接埠)。如果它由於任何其他原因失敗,則可能是設定檔錯誤,並且應在發出優雅重新啟動之前修復該錯誤。

top

立即重新啟動

信號:HUP
apachectl -k restart

向父程序發送 HUPrestart 信號會導致它像在 TERM 中一樣殺死其子程序,但父程序不會退出。它重新讀取其設定檔,並重新打開任何日誌檔。然後它產生一組新的子程序並繼續服務點擊。

mod_status 的使用者會注意到,當發送 HUP 時,伺服器統計資訊會設定為零。

與優雅重新啟動一樣,在嘗試重新啟動之前會執行語法檢查。如果您的設定檔中有錯誤,則不會嘗試重新啟動,並且您將收到有關語法錯誤的通知。
top

優雅地停止

信號:WINCH
apachectl -k graceful-stop

WINCHgraceful-stop 信號會導致父程序 建議 子程序在其當前請求之後退出(或者如果它們沒有提供任何服務則立即退出)。然後,父程序將刪除其 PidFile 並停止偵聽所有連接埠。父程序將繼續運行,並監視正在處理請求的子程序。一旦所有子程序都已完成並退出或已達到 GracefulShutdownTimeout 指定的超時,父程序也將退出。如果達到超時,將向任何剩餘的子程序發送 TERM 信號以強制它們退出。

當處於“優雅”狀態時,TERM 信號將立即終止父程序和所有子程序。但是,由於 PidFile 已被刪除,因此您將無法使用 apachectlhttpd 發送此信號。

graceful-stop 信號允許您同時運行多個配置相同的 httpd 實例。這是在執行 httpd 的優雅升級時的一項強大功能,但是它也可能導致某些配置出現死結和競爭條件。

已採取措施確保磁碟上的檔案(例如鎖定檔案 (Mutex) 和 Unix 通訊端檔案 (ScriptSock))包含伺服器 PID,並且應該可以毫無問題地共存。但是,如果配置指令、第三方模組或持久性 CGI 使用任何其他磁碟鎖定或狀態檔案,則應注意確保 httpd 的多個正在運行的實例不會相互覆蓋檔案。

您還應警惕其他潛在的競爭條件,例如使用 rotatelogs 樣式的管道日誌記錄。多個 rotatelogs 實例嘗試同時輪換相同的日誌檔可能會破壞彼此的日誌檔。

可用語言: de  |  en  |  es  |  fr  |  ja  |  ko  |  tr 

top

意見

注意
這不是問答區。此處放置的意見應針對改進文件或伺服器的建議,如果我們的版主認為這些意見已實施或無效/離題,則可以將其刪除。有關如何管理 Apache HTTP 伺服器的問題應直接提交到我們在 Libera.chat 上的 IRC 頻道 #httpd,或發送到我們的 郵件列表