摘要:可以通過等方式按照協(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 FastCGInginx發(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