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

資訊專欄INFORMATION COLUMN

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

Taste / 1166人閱讀

摘要:可以通過等方式按照協(xié)議通信。上述都需要發(fā)送結(jié)束包。函數(shù)所需的變量在進(jìn)入該函數(shù)之前認(rèn)為已經(jīng)初始化完成。和都有自己的,且互不干涉,后續(xù)發(fā)送的序列號(hào)以此為基準(zhǔn)。

運(yùn)營研發(fā)團(tuán)隊(duì) 施洪寶

一. FastCGI協(xié)議簡介 1.1 簡介

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

圖 1.1 FastCGI簡介

1.2 數(shù)據(jù)包格式

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

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

圖 1.2 FastCGI協(xié)議數(shù)據(jù)包頭部字段說明

type的取值

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

圖 1.3 Params數(shù)據(jù)包

說明:

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

key或者val長度大于127時(shí),會(huì)用4個(gè)字節(jié)存儲(chǔ)長度,否則用一個(gè)字節(jié)

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

圖 1.4 數(shù)據(jù)流類型數(shù)據(jù)包

1.3 通信流程示例

圖 1.5 FastCGI簡單通信流程

說明:

begin request 代表請(qǐng)求開始, end request 代表請(qǐng)求結(jié)束。

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

1.4 參考

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

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

二. Nginx FastCGI

nginx發(fā)送的緩沖區(qū)數(shù)據(jù)格式如下:

圖 2.1 FastCGI數(shù)據(jù)包總體結(jié)構(gòu)圖

說明:

本部分主要依據(jù)ngx_http_fastcgi_create_request函數(shù), 該函數(shù)會(huì)構(gòu)造緩存區(qū),并向其中寫入上圖所示內(nèi)容,在該函數(shù)執(zhí)行完后,會(huì)根據(jù)實(shí)際情況選擇是否繼續(xù)向緩沖區(qū)寫入數(shù)據(jù),后續(xù)情況在此不做討論。

ngx_http_fastcgi_create_request 函數(shù)所需的變量, 在進(jìn)入該函數(shù)之前認(rèn)為已經(jīng)初始化完成。

2.1 示例 2.1.1 upstream 發(fā)送緩沖區(qū)
//r.upstream.request_bufs.buf.pos
//begin request header