像 Apache、Nginx 這些網頁伺服器的工作流程是怎樣的?
01-13
怎樣處理瀏覽器的請求,以及怎樣解析 PHP、Python、Ruby 這些代碼的?
經常用 Apache、Nginx 搭建網頁伺服器,但一直不大明白內部是怎麼工作的。而且不知道這個問題中關於解析的說法是否正確。
這種問題不是隨便一個回答就能講清楚的,建議去閱讀源碼。前淘寶工程師 章亦春 (agentzh) 寫過詳細的 nginx 教程(計劃是寫成一本書),非常值得配合源碼閱讀 http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html
用戶與Apache建立socket連接,發送HTTP請求的內容。比如: 我要index.html文件,我要logo.png 文件 ,然後apache會根據你請求的內容不同調用相應的處理模塊處理該文件。一般的文件比如.gif .txt會用apache自身的模塊處理。但是像PHP ruby這些代碼就要調用它們相應的解析模塊。 比如 你請求index.php文件。apache會讀取index.php ,調用php解釋模塊解釋後返回內容給apache,apache再通過socket連接將結果發送給用戶的瀏覽器,這樣就完成了一次HTTP請求。返回的內容當然大部分時間是字元串 也有位元組碼,比如一些圖片啥的。
建議先從CGI學習一下, 動態語言的腳本處理更加複雜,但是基本思想和處理流程是一致的米文書 說的也正確
perfork
當進程收到用戶的請求時,由主進程生成一個子進程,以子進程去處理用戶的請求對其進行響應prefork 基於select模型,其最大並發連接支持1024個,當並發連接到達1024個的時候,則不再處理其請求,
woker
當進程收到用戶發來的請求時,首先會將其生成線程,通過其每個線程來處理用戶的請求當第一個用戶的請求到達主機的時候,進程會通知內核將請求的文件(數據)給進程當第二個用戶的請求到達主機的時候,對於第二個線程來說,文件已存在,都存放在同一內核空間,所以速度上非常快其缺點:會導致資源爭用的情況,所以說一個進程不能生成太多的線程,但可以啟動多個進程並將每個進程生成多個線程
event當進程收到用戶發來的請求,進程對內核發起回調函數,並且記錄由哪個進程發來的請求,一旦請求被處理完成則直接反饋給用戶如果沒有被處理則進程一直處於等待狀態,直到請求被處理其掃描是全局的,只是哪個響應完成通知哪個
可以參考發下兩個網站學習:Nginx開發從入門到精通Nginx文檔
apache不熟。nginx: 1) master/worker+多路IO復用2) 前後端全非同步(強調是事件驅動,不是AIO,不規範的術語,你懂的)3)狀態機4)內存池等技巧
推薦閱讀: