萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> Linux下重啟apache的方法

Linux下重啟apache的方法

  Linux系統為Ubuntu

  一、Start Apache 2 Server /啟動apache服務

  # /etc/init.d/apache2 start

  or

  $ sudo /etc/init.d/apache2 start

  二、 Restart Apache 2 Server /重啟apache服務

  # /etc/init.d/apache2 restart

  or

  $ sudo /etc/init.d/apache2 restart

  三、Stop Apache 2 Server /停止apache服務

  # /etc/init.d/apache2 stop

  or

  $ sudo /etc/init.d/apache2 stop

  linux下的apache 重啟和停止

  本文檔敘述了在類Unix系統上如何停止和重啟Apache 。 Windows NT/2000/XP/2003的用戶請參見以服務方式運行Apache ,Windows 9x/ME用戶則參見在控制台中運行Apache 。

  簡介

  為了停止或者重新啟動Apache ,你必須向正在運行的httpd進程發送信號。有兩種發送信號的方法。第一種方法是直接使用UNIX的kill命令向運行中的進程發送信號。你也許你會注意到你的系統裡運行著很多httpd進程。但你不應該直接對它們中的任何一個發送信號,而只要對已經在PidFile中記載下了自身PID的父進程發送信號。也就是說,你不必對父進程以外的任何進程發送信號。你可以向父進程發送三種信號:TERM、HUP、USR1 ,我們過一會兒再進行詳細的說明。

  你可以用下面這樣的命令來向父進程發送信號:

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

  第二種方法是使用下面將要描述的httpd二進制可執行文件的 -k 命令行選項:stop、restart、graceful、graceful-stop 。不過我們推薦你使用apachectl控制腳本來向httpd二進制可執行文件傳遞這些選項。

  當你向httpd發送信號後,你可以這樣來讀取它的進行過程:

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

  你可以修改這些示例以適應你的ServerRoot和PidFile設置。

  立即停止

  信號:TERM

  apachectl -k stop

  發送TERM或stop信號到父進程可以使它立刻殺死所有子進程。這將花費一些時間來殺死所有子進程。然後父進程自己也退出。所有進行中的請求將被強行中止,而且不再接受其它請求。

  優雅重啟

  信號:USR1

  apachectl -k graceful

  USR1或graceful信號使得父進程建議子進程在完成它們現在的請求後退出(如果他們沒有進行服務,將會立刻退出)。父進程重新讀入配置文件並重新打開日志文件。每當一個子進程死掉,父進程立刻用新的配置文件產生一個新的子進程並立刻開始伺服新的請求。

  重啟代碼的設計能夠確保MPM進程控制指令的正常運作,也就是在重啟過程中確保有適當數量的進程和線程以響應客戶端的請求。它是這樣StartServers的:如果在一秒鐘以後還沒有新創建StartServers個子進程,則創建出足夠完成現在任務的子進程個數。因此,代碼除了保有能夠維持服務器的現有負載數量的子進程外,也確保StartServers按你的意願運作。

  使用mod_status的用戶會注意到在USR1信號發出後,服務器的統計信息沒有被清零。代碼被寫成既能將你服務器無法伺服新請求的時間降至最少(這些請求將被操作系統放到隊列裡,使得它們不會丟失),又能遵從你的參數優化。為了做到這一點,它將在重新生成子進程的過程中,在scoreboard上保存所有子進程的狀態。

  mod_status還會將那些在優雅重啟前就已經開始而沒有結束伺服請求的子進程用一個"G"來標志。

  目前,日志滾動腳本還無法使用USR1來確定所有寫入預重啟日志的子進程都已結束。我們建議你在發出了USR1信號後等待一個適當的時間,然後再對舊的日志做處理。比如說如果對於一個窄帶用戶來說,大部分的點擊處理將在10分鐘之內完成,那麼你應該在處理舊的日志前等待15分鐘。

  如 果Apache重啟時發現配置文件有誤,那麼父進程將不會重啟,而是報錯並退出。在優雅重啟的情況下,它將在處理中的子進程存在的情況下維持它的存在(就 是那些被要求在處理完它們的請求後"優雅退出"的子進程)。如果你要重啟服務器,這將導致一些問題:它將不能綁定到它的監聽端口。在執行重啟之前,你可以 用 -t 命令行參數來檢查配置文件語法的正確性(參見httpd)。但這仍然不能保證服務器一定可以正確的重啟。為了從語法和語義兩方面檢查配置文件,你可以用一個非root用戶來啟動httpd。如果沒有錯誤,它將嘗試去打開套接字和日志文件,繼而因沒有root權限而失敗(或是因為現在運行的httpd已經綁定了這些端口)。如果是因為其他原因那麼就可能是一個配置文件產生的錯誤,你就應當在進行優雅重啟之前改正這個錯誤。立即重啟

  信號:HUP

  apachectl -k restart

  向父進程發送HUP或restart信號會使它象收到TERM信號一樣殺掉所有的子進程,不同之處在於父進程本身並不退出。它重新讀入配置文件、重新打開日志文件。然後產生一系列新的子進程來繼續服務。

  使用mod_status的用戶會注意到在HUP信號發出後,服務器統計信息會被清零。

  如果你重啟時配置文件有誤,那麼父進程將不會重啟,而是報錯並退出。參見上文中避免的方法。優雅停止

  信號:WINCH

  apachectl -k graceful-stop

  WINCH或graceful-stop信號使得父進程建議子進程在完成它們現在的請求後退出(如果他們沒有進行服務,將會立刻退出)。然後父進程刪除PidFile並停止在所有端口上的監聽。父進程仍然繼續運行並監視正在處理請求的子進程,一旦所有子進程完成任務並退出或者超過由GracefulShutdownTimeout指令規定的時間,父進程將會退出。在超時的情況下,所有子進程都將接收到TERM信號並被強制退出。

  在"優雅"狀態下,TERM信號將會立即中止父進程和所有子進程。由於PidFile已經被刪除,你將無法使用apachectl或httpd發送該信號。

  graceful-stop允許你同時運行多個相同配置的httpd實例。這在對Apache進行平滑升級的時候是一個非常有用的特性。不過它在某些配置的情況下同樣可能會導致死鎖和競爭條件。

  必須注意確保諸如Lockfile和ScriptSock之類的磁盤文件包含服務器的PID ,並且能夠安全的共存。然而如果一個配置指令、第三方模塊或持久CGI使用任何磁盤鎖或狀態文件,必須注意確保多個httpd運行實例之間不會爭搶文件。

  你還必須防止潛在的競爭條件,比如使用rotatelogs風格的管道日志。運行中的多個rotatelogs實例企圖同時滾動同一個日志文件可能會導致互相破壞對方的日志文件。

  附錄:信號和競爭條件

  在Apache 1.2b9 之前,有很多關於重啟和死亡信號的競爭條件。關 於競爭條件的一個簡單描述是:一個時間敏感的問題,如果一些事情在不適當的時間或以不恰當的順序發生,它將作出你不期望的反應;如果同樣的事情在恰當的時 間發生,則不會出現異常。憑借那些擁有"正確"特性設置的體系結構,我們盡量避免了它們的出現。但值得注意的是,仍然有一些競爭條件存在於這樣的體系結構 中。

  使用物理磁盤的ScoreBoardFile就有損壞ScoreBoard的潛在危險。這將發生在"bind: Address already in use"(HUP之後)或"long lost child came home!"(USR1之後)時。前者是一個致命錯誤,而後者則會使服務器丟失ScoreBoard的一個記錄。所以我們建議多使用優雅重啟,偶爾使用硬重啟。這些問題很難解決,但幸運的是大多數結構並不需要ScoreBoard文件。而如果你需要這樣的結構,你可以參考ScoreBoardFile文檔。

 

  當 每個子進程在一個HTTP的持續連接(KeepAlive)中涉及到第二個並發的請求時,所有的結構都會或多或少存在競爭狀態的問題。它將在讀取了請求而 沒有讀取任何請求頭之後立刻退出。這個修復對於1.2來說來得太晚了。但因為持續連接的客戶端已經考慮到網絡延時和服務器超時會造成類似的情況,所以理論 上說,這不是一個太大的問題。而實際上似乎也沒有任何影響:在一個測試案例中服務器在一秒之內被重啟了20次,而客戶端卻成功的浏覽了網站,而且沒有任何 破損的圖片或空文檔。

copyright © 萬盛學電腦網 all rights reserved