像 Apache、Nginx 這些網頁伺服器的工作流程是怎樣的?

怎樣處理瀏覽器的請求,以及怎樣解析 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)內存池等技巧


推薦閱讀:

1秒1000並發 高並發需要什麼樣的伺服器?
我想建個小站,如何選擇雲伺服器配置?

TAG:Nginx | Apache | 伺服器配置 |