国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Nginx源碼研究】Nginx中FastCGI淺析

Taste / 1155人閱讀

摘要:可以通過等方式按照協議通信。上述都需要發送結束包。函數所需的變量在進入該函數之前認為已經初始化完成。和都有自己的,且互不干涉,后續發送的序列號以此為基準。

運營研發團隊 施洪寶

一. FastCGI協議簡介 1.1 簡介

FastCGI(Fast Common Gateway Interface, 快速通用網關接口)是一種通信協議。可以通過Unix Domain Socket, Named Pipe, TCP等方式按照FastCGI協議通信。

圖 1.1 FastCGI簡介

1.2 數據包格式

FastCGI數據包兩部分, 頭部(header), 包體(body), 每個數據包都必須包含header, body可以沒有。header為8個字節, body必須為8的整數倍, 不是的話需要填充。

1.2.1 頭部
typedef struct {
    unsigned char version;            // 版本號
    unsigned char type;               // 數據包類型
    unsigned char requestIdB1;        // 記錄id高8位
    unsigned char requestIdB0;        // 記錄id低8位
    unsigned char contentLengthB1;    // 記錄內容長度高8位(body長度高8位)
    unsigned char contentLengthB0;    // 記錄內容長度低8位(body長度低8位)
    unsigned char paddingLength;      // 補齊位長度(body補齊長度)
    unsigned char reserved;           // 補齊位
}Header;

圖 1.2 FastCGI協議數據包頭部字段說明

type的取值

#define FCGI_BEGIN_REQUEST       1                     //(web->fastcgi)請求開始數據包
#define FCGI_ABORT_REQUEST       2                     //(web->fastcgi)終止請求
#define FCGI_END_REQUEST         3                     //(fastcgi->web)請求結束
#define FCGI_PARAMS              4                     //(web->fastcgi)傳遞參數
#define FCGI_STDIN               5                     //(web->fastcgi)數據流傳輸數據
#define FCGI_STDOUT              6                     //(fastcgi->web)數據流傳輸數據
#define FCGI_STDERR              7                     //(fastcgi->web)數據流傳輸
#define FCGI_DATA                8                     //(web->fastcgi)數據流傳輸
#define FCGI_GET_VALUES          9                     //(web->fastcgi)查詢fastcgi服務器性能參數
#define FCGI_GET_VALUES_RESULT  10                     //(fastcgi->web)fastcgi性能參數查詢返回
#define FCGI_UNKNOWN_TYPE       11
#define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)
1.2.2 params類型數據包

圖 1.3 Params數據包

說明:

params數據包以key, value格式發送, 具體格式為(keyLen, valLen, key, val)

key或者val長度大于127時,會用4個字節存儲長度,否則用一個字節

1.2.3 數據流類型數據包(stdin, stdout, stderr, data)

圖 1.4 數據流類型數據包

1.3 通信流程示例

圖 1.5 FastCGI簡單通信流程

說明:

begin request 代表請求開始, end request 代表請求結束。

除begin request, end request類型數據包外, 其他類型數據包在發送完成后,需要發送一個只有頭部,包體長度為0, 也就是沒有包體的數據包,代表這種類型的數據包發送結束。上述params, stdin, stdout, stderr 都需要發送結束包。

1.4 參考

https://segmentfault.com/a/11...

https://blog.csdn.net/hepangd...

二. Nginx FastCGI

nginx發送的緩沖區數據格式如下:

圖 2.1 FastCGI數據包總體結構圖

說明:

本部分主要依據ngx_http_fastcgi_create_request函數, 該函數會構造緩存區,并向其中寫入上圖所示內容,在該函數執行完后,會根據實際情況選擇是否繼續向緩沖區寫入數據,后續情況在此不做討論。

ngx_http_fastcgi_create_request 函數所需的變量, 在進入該函數之前認為已經初始化完成。

2.1 示例 2.1.1 upstream 發送緩沖區
//r.upstream.request_bufs.buf.pos
//begin request header