NO IMAGE

 

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 可以)。