apache之httpd啓動、終止、重啓小結

  How apache starts
如果配置文件中的Listen directive設置了默認端口爲80(或者是其它的值,但要小於1024),接下來apache httpd就需要root權限來啓動apache,這是因爲在將應用進程綁定在(1-1024)這個保留端口範圍內的時候,需要root權限。當 server一旦啓動並且執行了些許初步動作,比如打開log日誌文件,接下來server會裝載執行指定數目的child processes, 這些process是用來複雜監聽端口,處理來自client的請求並且返回響應。而主httpd process仍然以root權限繼續運行,但是這些child processes會以較低的權限運行,而這些行爲都可以通過選擇Multi-processing Module來進行控制。
啓動httpd main process的推薦方式是使用apachectl 控制腳本。這個腳本用來幫助你自動設置environment set,這些是httpd main process運行時所需要的;然後apachectl纔會繼續執行httpd的ke執行的binary code。apachectl可以接受命令行參數, 所以任何httpd的命令行參數對apachectl一樣生效(從這一點,可以把apachectl看成httpd的殼, apachectl無非是轉發相應的命令行參數給httpd)。你也同樣可以修改apachectl腳本,在apachectl腳本中,HTTPD 變量用來指定httpd executable 的有效路徑。

httpd開始運行後的第一件事是讀取httpd.conf文件。httpd.conf是編譯時候確定的,也可以通過-f命令行option來進行指定。如:
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf

如 果startup一切正常,則server將會脫離terminal(其stdin,stdout,stderr不再和terminal的0,1,2相關 聯);這就說明apache httpd啓動成功。然後你可以使用browser來驗證DocumentRoot下的文件證實httpd server是否啓動成功。

apache啓動時侯出錯:
如果apache在啓動的時候出現fatal error, 則它會將出錯提示信息發送個console或者ErrorLog directive 指定的日誌文件。最一般出現的問題是:Unable to bind to Port ...,它可能是已經啓動了一個httpd process, 或者不是root權限。

更進步的trouble-shooting,參加 Apache FAQ.


在boot-time 啓動apache server:

在os重新啓動後自動重啓apache server, 可以在 /etc/rc.N 或者/etc/rc.local中添加對apachectl腳本的調用

apachectl 腳本被設計成類似於標準的sysv init script, 它可以接受start,restart和stop命令行參數,並且把它們轉換成適當的signals以傳遞給httpd。所以可以將apachectl連 接到/etc/init.d目錄下。 如

link -s /usr/local/apache2/bin/apachectl /etc/init.d/apachectl


apache的啓動和重啓命令:

爲 了restart或者stop Apache server, 你必須給運行的httpd processes發送信號。有兩種方法可以發送信號給httpd processes。首先,你可以使用kill command來直接發送信號給httpd process。你會發現有許多httpd進程處於運行狀態,但是除了parent httpd process, 你不能將signals發送給其它的httpd進程,他的pid是由PidFile來定義的(PidFile標識的文件內保存了parent process的pid, 默認是/usr/local/apache2/logs/httpd.pid).有四個signals可以發送給parent httpd process:TERM, USR1, HUP和WINCH。

命令如下: kill -TERM `cat /usr/local/apache2/logs/httpd.pid`


第二種方法是使用-k 命令行選項: stop,restart, graceful 和 graceful-stop.
使用命令: ./apachectl -k stop|restart|graceful|graceful-stop


當你發送signals給httpd來結束httpd運行, 通過查看/usr/local/apache2/logs/error_logs 來檢查執行的結果

 

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


stop:

Signal: TERM
apachectl -k stop

立即發送TERM或者stop signals給httpd parent processes ,來結束httpd parent process和它的子process。這個過程會持續幾秒種。


優雅的restart(graceful restart)

USR1 或者graceful signals發送給parent process,來建議parent的子進程結束運行或者在它們處理完當前正在處理的請求後結束運行(如果child沒有做任何事情這馬上停止運行)。然 後parent會重新讀取apache的配置文件、重新打開它的log文件。當每個child結束執行,parent將會用根據配置而新產生的 process來替換每個child,這些新的child來繼續服務http requests。

apache的httpd被設計成尊重MPM的process control directive的配置,所以通過重新啓動,可用的服務於client請求的process和threads的數量會被保證在一個適當的數值。此外,對應服務器的StartServers directive 配置,httpd會有如下動作:在一秒鐘以後,如果新生成的children process的數量少有StartServers指定的值,則httpd parent會創建足夠的children來一同完成服務client的任務。因此,httpd試圖在維護足夠數量的children來滿足server 的負載的同時,同時尊重StartServers參數的設置的值。

使用apache mod_status的用戶會注意到服務器統計的數值沒有被設置爲0當USR1被髮送的時候。httpd的代碼的編寫爲了保證Server由於重啓而導致 無法對client的requests進行處理時間的最小化(這些由於重啓而無法處理的請求會被os發到os維護的隊列當中去, 所以沒有event會被丟失),同時滿足你調優Servers的目的(更改配置,重新啓動apache httpd server)。 爲了達到這個目的,在children重新生成的過程中,應該保持用於跟蹤children的scoreboard。

這個mod_status module,使用G來標記這些children任然在服務在graceful restart請求被髮出前還沒有處理完成的client的請求。


命令:apachectl -k graceful


restart now

Signal: HUP
apachectl -k restart

發送HUP或restart 信號給parent httpd process,所有子進程會被殺死,而parent process不會exit。apache httpd會重新讀取配置文件,然後重新打開log file。 然後parent httpd會spawns(fork and exec)一組新的children process集合用來服務client請求。


WINCH and graceful-stop

 Signal : WINCH

apachectl -k graceful-stop


WINCH或者graceful-stop信號會使得parent process試圖建議children在處理完當前請求(或者立即結束如果它們已經不再處理任何請求)結束運行狀態。parent process然後將會刪除它的PidFile文件,終止監聽對所有它曾經關注過的端口。 然後,parent process會繼續運行,監聽所有仍然有請求任務的子進程。當所有的children進程都執行結束並且exit,或者已經過了由 GracefulShutdownTimeout指定的timeout時間,parent將會結束運行並且exit。如果timeout時間到了,則每個 子進程都會收到TERM signal,然後會強制它們exit。 如果process和它的children處於graceful狀態,則TERM signal會使得它們馬上結束運行。然而,由於PidFile被刪除,所以導致你不能通過apachectl和httpd來放鬆信號(kill 可以)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章