這兩個函數是負載均衡模塊最底層的函數,負責實際獲取一個連接和回收一個連接的預備操作。之所以說是預備操作,是因為在這兩個函數中,并不實際進行建立連接或者釋放連接的動作,而只是執行獲取連接的地址或維護連接狀態的操作。需要理解的清楚一點,在peer.get函數中獲取連接的地址信息,并不代表這時連接一定沒有被建立,相反的,通過get函數的返回值,nginx可以了解是否存在可用連接,連接是否已經建立。這些返回值總結如下:
| 返回值 | 說明 | nginx后續動作 |
|-----|-----|-----|
| NGX_DONE | 得到了連接地址信息,并且連接已經建立。 | 直接使用連接,發送數據。 |
| NGX_OK | 得到了連接地址信息,但連接并未建立。 | 建立連接,如連接不能立即建立,設置事件, 暫停執行本請求,執行別的請求。 |
| NGX_BUSY | 所有連接均不可用。 | 返回502錯誤至客戶端。 |
各位讀者看到上面這張表,可能會有幾個問題浮現出來:
| Q: | 什么時候連接是已經建立的? |
|-----|-----|
| A: | 使用后端keepalive連接的時候,連接在使用完以后并不關閉,而是存放在一個隊列中,新的請求只需要從隊列中取出連接,這些連接都是已經準備好的。 |
| Q: | 什么叫所有連接均不可用? |
| A: | 初始化請求的過程中,建立了一張表,get函數負責每次從這張表中不重復的取出一個連接,當無法從表中取得一個新的連接時,即所有連接均不可用。 |
| Q: | 對于一個請求,peer.get函數可能被調用多次么? |
| A: | 正式如此。當某次peer.get函數得到的連接地址連接不上,或者請求對應的服務器得到異常響應,nginx會執行ngx_http_upstream_next,然后可能再次調用peer.get函數嘗試別的連接。upstream整體流程如下: |

- 上篇:nginx模塊開發篇
- nginx平臺初探
- 初探nginx架構
- nginx基礎概念
- connection
- request
- keepalive
- pipe
- lingering_close
- 基本數據結構
- ngx_str_t
- ngx_pool_t
- ngx_array_t
- ngx_hash_t
- ngx_hash_wildcard_t
- ngx_hash_combined_t
- ngx_hash_keys_arrays_t
- ngx_chain_t
- ngx_buf_t
- ngx_list_t
- ngx_queue_t
- nginx的配置系統
- 指令參數
- 指令上下文
- nginx的模塊化體系結構
- 模塊的分類
- nginx的請求處理
- handler模塊
- handler模塊簡介
- 模塊的基本結構
- 模塊配置結構
- 模塊配置指令
- 模塊上下文結構
- 模塊的定義
- handler模塊的基本結構
- handler模塊的掛載
- handler的編寫步驟
- 示例: hello handler 模塊
- handler模塊的編譯和使用
- 更多handler模塊示例分析
- http access module
- http static module
- http log module
- 過濾模塊
- 過濾模塊簡介
- 過濾模塊的分析
- upstream模塊
- upstream模塊
- upstream模塊接口
- memcached模塊分析
- 本節回顧
- 負載均衡模塊
- 配置
- 指令
- 鉤子
- 初始化配置
- 初始化請求
- peer.get和peer.free回調函數
- 本節回顧
- 其他模塊
- core模塊
- event模塊
- 模塊開發高級篇
- 變量
- 下篇:nginx原理解析篇
- nginx架構詳解
- nginx的源碼目錄結構
- nginx的configure原理
- 模塊編譯順序
- nginx基礎設施
- 內存池
- nginx的啟動階段
- 概述
- 共有流程
- 配置解析
- nginx的請求處理階段
- 接收請求流程
- http請求格式簡介
- 請求頭讀取
- 解析請求行
- 解析請求頭
- 請求體讀取
- 讀取請求體
- 丟棄請求體
- 多階段處理請求
- 多階段執行鏈
- POST_READ階段
- SERVER_REWRITE階段
- FIND_CONFIG階段
- REWRITE階段
- POST_REWRITE階段
- PREACCESS階段
- ACCESS階段
- POST_ACCESS階段
- TRY_FILES階段
- CONTENT階段
- LOG階段
- Nginx filter
- header filter分析
- body filter分析
- ngx_http_copy_filter_module分析
- ngx_http_write_filter_module分析
- subrequest原理解析
- https請求處理解析
- 附錄A 編碼風格
- 附錄B 常用API
- 附錄C 模塊編譯,調試與測試