摘要:可以通過等方式按照協議通信。上述都需要發送結束包。函數所需的變量在進入該函數之前認為已經初始化完成。和都有自己的,且互不干涉,后續發送的序列號以此為基準。
運營研發團隊 施洪寶
一. 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 FastCGInginx發送的緩沖區數據格式如下:
圖 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