nginx 的请求处理、请求的处理流程
nginx的請求處理
前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
nginx使用一個多進程模型來對外提供服務,其中一個master進程,多個worker進程。master進程負責管理nginx本身和其他worker進程。
所有實際上的業務處理邏輯都在worker進程。worker進程中有一個函數,執行無限循環,不斷處理收到的來自客戶端的請求,并進行處理,直到整個nginx服務被停止。
worker進程中,ngx_worker_process_cycle()函數就是這個無限循環的處理函數。在這個函數中,一個請求的簡單處理流程如下:
請求的處理流程
為了讓大家更好的了解nginx中請求處理過程,我們以HTTP Request為例,來做一下詳細地說明。
從nginx的內部來看,一個HTTP Request的處理過程涉及到以下幾個階段。
在這里,我們需要了解一下phase handler這個概念。phase字面的意思,就是階段。所以phase handlers也就好理解了,就是包含若干個處理階段的一些handler。
在每一個階段,包含有若干個handler,再處理到某個階段的時候,依次調用該階段的handler對HTTP Request進行處理。
通常情況下,一個phase handler對這個request進行處理,并產生一些輸出。通常phase handler是與定義在配置文件中的某個location相關聯的。
一個phase handler通常執行以下幾項任務:
當nginx讀取到一個HTTP Request的header的時候,nginx首先查找與這個請求關聯的虛擬主機的配置。如果找到了這個虛擬主機的配置,那么通常情況下,這個HTTP Request將會經過以下幾個階段的處理(phase handlers):
| ? | 讀取請求內容階段 |
| ? | Server請求地址重寫階段 |
| ? | 配置查找階段: |
| ? | Location請求地址重寫階段 |
| ? | 請求地址重寫提交階段 |
| ? | 訪問權限檢查準備階段 |
| ? | 訪問權限檢查階段 |
| ? | 訪問權限檢查提交階段 |
| ? | 配置項try_files處理階段 |
| ? | 內容產生階段 |
| ? | 日志模塊處理階段 |
在內容產生階段,為了給一個request產生正確的響應,nginx必須把這個request交給一個合適的content handler去處理。如果這個request對應的location在配置文件中被明確指定了一個content handler,那么nginx就可以通過對location的匹配,直接找到這個對應的handler,并把這個request交給這個content handler去處理。這樣的配置指令包括像,perl,flv,proxy_pass,mp4等。
如果一個request對應的location并沒有直接有配置的content handler,那么nginx依次嘗試:
內容產生階段完成以后,生成的輸出會被傳遞到filter模塊去進行處理。filter模塊也是與location相關的。所有的fiter模塊都被組織成一條鏈。輸出會依次穿越所有的filter,直到有一個filter模塊的返回值表明已經處理完成。
這里列舉幾個常見的filter模塊,例如:
在所有的filter中,有幾個filter模塊需要關注一下。按照調用的順序依次說明如下:
| 寫輸出到客戶端,實際上是寫到連接對應的socket上。 |
| 這個filter是負責subrequest的,也就是子請求的。 |
| 將一些需要復制的buf(文件或者內存)重新復制一份然后交給剩余的body filter處理。 |
轉自:http://tengine.taobao.org/book/chapter_02.html#id13?
總結
以上是生活随笔為你收集整理的nginx 的请求处理、请求的处理流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cookie / Session 的机制
- 下一篇: QT-qevent 事件的accept(