《深入理解Nginx》筆記之ngx_event_pipe_s結構體

ngx_event_pipe_s


typedef struct ngx_event_pipe_s  ngx_event_pipe_t;

// 處理接收自上游的包體的回調函數原型
typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,
                                                    ngx_buf_t *buf);

// 向下遊發送響應的回調函數原型
typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data,
                                                     ngx_chain_t *chain);



struct ngx_event_pipe_s {
     // Nginx與上游服務器之間的連接
    ngx_connection_t  *upstream;

    // Nginx與下游客戶端之間的連接
    ngx_connection_t  *downstream;

     /* 直接接收自上游服務器的緩衝區鏈表,保存的是未經任何處理的數據。這個鏈表是逆序的,後接受的響應插在鏈表頭處 */
    ngx_chain_t       *free_raw_bufs;

    // 表示接收到的上游響應緩衝區,其數據是經過input_filter處理的
    ngx_chain_t       *in;

    // 指向剛收到的一個緩衝區
    ngx_chain_t      **last_in;

     // 保存着將要發給客戶端的緩衝區鏈表。在寫入臨時文件成功時,會把in中的緩衝區添加到out中
    ngx_chain_t       *out;

    // 等待釋放的緩衝區
    ngx_chain_t       *free;

    // 表示上次調用ngx_http_output_filter函數發送響應時沒有發送完的緩衝區鏈表
    ngx_chain_t       *busy;

    /*
     * the input filter i.e. that moves HTTP/1.1 chunks
     * from the raw bufs to an incoming chain
     */

     // 處理接收到的、來自上游服務器的數據
    ngx_event_pipe_input_filter_pt    input_filter;

    // 用於input_filter的的參數,一般是ngx_http_request_t的地址
    void                             *input_ctx;

     // 向下遊發送響應的函數
    ngx_event_pipe_output_filter_pt   output_filter;

    // output_filter的參數,指向ngx_http_request_t
    void                             *output_ctx;

     // 1:表示當前已讀取到上游的響應
    unsigned           read:1;

    // 1:啓用文件緩存
    unsigned           cacheable:1;

    // 1:表示接收上游響應時,一次只能接收一個ngx_buf_t緩衝區
    unsigned           single_buf:1;

    // 1:一旦不再接收上游包體,將儘可能地釋放緩衝區
    unsigned           free_bufs:1;

    // 1:表示Nginx與上游交互已經結束
    unsigned           upstream_done:1;

    // 1:Nginx與上游服務器的連接出現錯誤
    unsigned           upstream_error:1;

    // 1:表示與上游服務器的連接已關閉
    unsigned           upstream_eof:1;

    /* 1:表示暫時阻塞讀取上游響應的的流程。此時會先調用ngx_event_pipe_write_to_downstream
    函數發送緩衝區中的數據給下游,從而騰出緩衝區空間,再調用ngx_event_pipe_read_upstream
    函數讀取上游信息 */
    unsigned           upstream_blocked:1;

    // 1:與下游的交互已結束
    unsigned           downstream_done:1;

    // 1:與下游的連接出現錯誤
    unsigned           downstream_error:1;

    // 1:複用臨時文件。它是由ngx_http_upstream_conf_t中的同名成員賦值的
    unsigned           cyclic_temp_file:1;

     // 已分配的緩衝區數據
    ngx_int_t          allocated;

    // 記錄了接收上游響應的內存緩衝區大小,bufs.size表示每個內存緩衝區大小,bufs.num表示最多可以有num個緩衝區
    ngx_bufs_t         bufs;

    // 用於設置、比較緩衝區鏈表中的ngx_buf_t結構體的tag標誌位
    ngx_buf_tag_t      tag;

     /* busy緩衝區中待發送響應長度的最大值,當到達busy_size時,必須等待busy緩衝區發送了足夠的數據,
     才能繼續發送out和in中的內容 */
    ssize_t            busy_size;

     // 已經接收到來自上游響應包體的長度
    off_t              read_length;
    off_t              length;

     // 表示臨時文件的最大長度
    off_t              max_temp_file_size;

    // 表示一次寫入文件時數據的最大長度
    ssize_t            temp_file_write_size;

     // 讀取上游響應的超時時間
    ngx_msec_t         read_timeout;

    // 向下遊發送響應的超時時間
    ngx_msec_t         send_timeout;

    // 向下遊發送響應時,TCP連接中設置的send_lowat“水位”
    ssize_t            send_lowat;

     // 連接池
    ngx_pool_t        *pool;

    // 日誌
    ngx_log_t         *log;

     // 表示在接收上游服務器響應頭部階段,已經讀取到響應包體
    ngx_chain_t       *preread_bufs;

    // 表示在接收上游服務器響應頭部階段,已經讀取到響應包體長度
    size_t             preread_size;

    // 用於緩存文件
    ngx_buf_t         *buf_to_file;
    size_t             limit_rate;
    time_t             start_sec;

     // 存放上游響應的臨時文件
    ngx_temp_file_t   *temp_file;

     // 已使用的ngx_buf_t緩衝區數目
    /* STUB */ int     num;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章