upstream 即上游的意思,是一個想對到概念,從客戶端到中間的網絡鏈路到服務器到鏈路中,可以將越接近客戶到設備越理解成下游,相反到為上游,所以如果只有一個upstream,可以將其為理解成轉發客戶到請求到服務器,然后響應服務器轉發到客戶端到過程,源碼主要流程如下:
配置解析:
ngx_http_upstream_commands
ngx_http_upstream_init_round_robin 中peer構造
1、創建upstream
ngx_http_upstream_init
刪除超時定時器
創建到上游到請求
掛接一些處理函數,包含第6步中要用到的請求結束后upstream到清理函數
2、建立與上游的連接
ngx_http_upstream_connect
創建socket、connetion,發起tcp建連請求,使用epoll發送請求,掛接upstream的handler,包括第4、5步中處理上游應答的處理函數
3、發送到上游的請求
ngx_http_upstream_send_request
4、處理上游的響應頭
process_header 解析請求頭
ngx_http_upstream_process_headers處理請求頭
5、處理上游的響應體
ngx_http_upstream_process_body_in_memory
如果需要轉發相應體,可以自己實現input_filter,若不自己實現則使用默認的ngx_http_upstream_non_buffered_filter
(1)upstream與上游之間網速很快時,使用大內存甚至文件,緩存上游大請求
(2)upstream與下游之間網速很快時,使用固定大小內存,不需要過多緩存請求
ngx_http_upstream_send_response中通過判斷
buffering決定走上述的那個流程
6、結束upstream 請求
ngx_http_upstream_cleanup
主要釋放一些upstream使用的資源
傳統方法中常用的鈎子:
uscf->peer.init_upstream. 初始化 upstream配置,
在upstream配置初始化過程中用鈎子us->peer.init初始化請求,
在初始化請求中往往創建請求和upstream的關系,然后用鈎子peer.get定義獲取后端服務器方法等,peer.free與peer.get匹配。