摘要:請求頭部基本上是作為鍵值對傳輸,例如。他們者直接由將協(xié)議轉(zhuǎn)換為協(xié)議傳輸給進(jìn)行處理。而作為保留位,主要也是為了協(xié)議頭部能與字節(jié)對齊。
前言
閑來無事,決定整理一下最近看的一些東西,于是先寫寫fastcgi協(xié)議,此協(xié)議是cgi協(xié)議的升級(jí)版,其實(shí)就是當(dāng)年cgi太弱,導(dǎo)致動(dòng)態(tài)頁面太耗性能,所以開發(fā)了例如fastcgi協(xié)議等升級(jí)版,下面我們就來聊聊這個(gè)協(xié)議的相關(guān)內(nèi)容。
CGI協(xié)議以及Fastcgi協(xié)議的介紹 CGI協(xié)議的介紹CGI協(xié)議的誕生是為了解決HTTP協(xié)議與編程語言之間的連接問題,從而減低動(dòng)態(tài)頁面的開發(fā)難度。這個(gè)協(xié)議避免所有的編程語言開發(fā)動(dòng)態(tài)頁面時(shí)還需要開發(fā)一套HTTP的解析庫。
那么,關(guān)于HTTP協(xié)議本身,其實(shí)就是2個(gè)部分:請求頭部和請求體。請求頭部基本上是作為鍵值對傳輸,例如Date: Sat, 03 Feb 2018 00:14:03 GMT。請求體則是純數(shù)據(jù)流,用于傳輸文件等數(shù)據(jù)。所以,CGI本身也相應(yīng)提供了2中數(shù)據(jù)格式的輸入:鍵值對輸入和數(shù)據(jù)流輸入。
那最初的CGI程序的輸入方式及其簡單,鍵值對數(shù)據(jù)的輸入直接利用環(huán)境變量進(jìn)行傳輸,而數(shù)據(jù)流輸入則是利用標(biāo)準(zhǔn)輸入流(stdin)進(jìn)行傳輸。
CGI程序的返回也包含了2種:正常數(shù)據(jù)輸出和錯(cuò)誤數(shù)據(jù)輸出,正常數(shù)據(jù)輸出是用于輸出處理后的數(shù)據(jù)信息,主要是HTTP的響應(yīng)報(bào)文,而錯(cuò)誤數(shù)據(jù)輸出則是用于在程序解析錯(cuò)誤時(shí)返回給web服務(wù)器的錯(cuò)誤信息,以便于web服務(wù)器做響應(yīng)的處理和日志記錄功能。正常數(shù)據(jù)輸出和錯(cuò)誤數(shù)據(jù)輸出在當(dāng)時(shí)的CGI程序中也理所應(yīng)當(dāng)?shù)氖褂昧藰?biāo)準(zhǔn)輸出流stdout和標(biāo)準(zhǔn)錯(cuò)誤流stderr??芍^是十分簡約。
下面是一個(gè)簡單的CGI程序的小栗子:
#!/bin/sh echo "Content-Type:text/html " echo "" echo "" echo "hello! This is the PATH var:" echo $PATH
這個(gè)CGI程序主要功能就是輸出了PATH環(huán)境變量,其中會(huì)包含請求頭部的相關(guān)信息(之后補(bǔ)充結(jié)果)。
Fastcgi協(xié)議的介紹但是CGI程序的弊端十分顯而易見:需要新的進(jìn)程進(jìn)行數(shù)據(jù)處理,數(shù)據(jù)傳輸方式無法分布式部署,使用進(jìn)程導(dǎo)致容易影響系統(tǒng)運(yùn)行,每次請求都重新加載數(shù)據(jù)耗費(fèi)性能。于是乎,Fastcgi程序就是為了解決相關(guān)問題而出現(xiàn)。
Fastcgi程序?qū)?b>CGI程序的規(guī)范都進(jìn)行了保留,并將其升級(jí),主要是將輸入和輸出的方式從標(biāo)準(zhǔn)流遷移到了socket傳輸,同時(shí),fastcgi協(xié)議也支持將cgi程序進(jìn)行守護(hù)進(jìn)程化,這樣可以提高請求的處理速度,同時(shí)提高了穩(wěn)定性。
那么,Fastcgi協(xié)議、php-fpm、Nginx三者本身是什么關(guān)系?其實(shí)就是,Nginx是web服務(wù)器,只提供HTTP協(xié)議的輸入和輸出。php-fpm是Fastcgi服務(wù)器,只支持Fastcgi協(xié)議的輸入和輸出。他們2者直接由Nginx將HTTP協(xié)議轉(zhuǎn)換為Fastcgi協(xié)議傳輸給php-fpm進(jìn)行處理。
Fastcgi協(xié)議的詳解 協(xié)議的組成Fastcgi協(xié)議是由一段一段的數(shù)據(jù)段組成,可以想象成一個(gè)車隊(duì),每輛車裝了不同的數(shù)據(jù),但是車隊(duì)的順序是固定的。輸入時(shí)順序為:請求開始描述、請求鍵值對、請求輸入數(shù)據(jù)流。輸出時(shí)順序為:錯(cuò)誤輸出數(shù)據(jù)流、正常輸出數(shù)據(jù)流、請求結(jié)束描述。
其中鍵值對、輸入流、輸出流,錯(cuò)誤流的數(shù)據(jù)和CGI程序是一樣的,只不過是換了種傳輸方式而已。
再回到車隊(duì)的描述,每輛車的結(jié)構(gòu)也是統(tǒng)一的,在前面都有一個(gè)引擎,引擎決定了你的車是什么樣的。所以,每個(gè)數(shù)據(jù)塊都包含一個(gè)頭部信息,結(jié)構(gòu)如下:
typedef struct { ????unsigned?char?version;??// 版本號(hào) ????unsigned?char?type;?????// 記錄類型 ????unsigned?char?requestIdB1;??// 記錄id高8位 ????unsigned?char?requestIdB0;??// 記錄id低8位 ????unsigned?char?contentLengthB1;??// 記錄內(nèi)容長度高8位 ????unsigned?char?contentLengthB0;??// 記錄內(nèi)容長度低8位 ????unsigned?char?paddingLength;????// 補(bǔ)齊位長度 ????unsigned?char?reserved;?// 真·記錄頭部補(bǔ)齊位 } FCGI_Header;
注釋都描述的很清楚:
version為版本號(hào),當(dāng)前只有第一版本。
type作為關(guān)鍵的描述,用于描述數(shù)據(jù)的類型,例如是鍵值對類型還是數(shù)據(jù)流類型,或者是請求開始和請求結(jié)束,都是通過type進(jìn)行描述。
requestId是記錄ID,(B1代表高位,B0代表低位,下文同理),記錄ID主要避免同一個(gè)socket通道時(shí)候傳輸?shù)臄?shù)據(jù)的正確性,同時(shí)也提高了傳輸?shù)男省?/p>
ContentLength為數(shù)據(jù)內(nèi)容的長度。
paddingLength是用于數(shù)據(jù)能進(jìn)行8字節(jié)對齊,這樣對解析以及底層的IO操作性能有提示,所以paddingLength只是數(shù)據(jù)對8取余,固然不會(huì)超過7。
而reserved作為保留位,主要也是為了協(xié)議頭部能與8字節(jié)對齊。
關(guān)于type的取值范圍:
#define FCGI_BEGIN_REQUEST 1 #define FCGI_ABORT_REQUEST 2 #define FCGI_END_REQUEST 3 #define FCGI_PARAMS 4 #define FCGI_STDIN 5 #define FCGI_STDOUT 6 #define FCGI_STDERR 7 #define FCGI_DATA 8 #define FCGI_GET_VALUES 9 #define FCGI_GET_VALUES_RESULT 10 #define FCGI_UNKNOWN_TYPE 11 #define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)
我們大致按照其中的順序進(jìn)行介紹。
FCGI_BEGIN_REQUEST請求輸入的時(shí)候,會(huì)帶有該類型的數(shù)據(jù),這樣是為了描述當(dāng)前需要Fastcgi服務(wù)器充當(dāng)?shù)慕巧约跋嚓P(guān)的設(shè)定。其中的數(shù)據(jù)結(jié)構(gòu)為:
typedef struct { ????unsigned?char?roleB1;???// 角色類型高8位 ????unsigned?char?roleB0;???// 角色類型低8位 ????unsigned?char?flags;????// 小紅旗 ????unsigned?char?reserved[5];??// 補(bǔ)齊位 } FCGI_BeginRequestBody;
官方在升級(jí)CGI的時(shí)候,同時(shí)加入了多種角色給Fastcgi協(xié)議,其中定義為:
#define FCGI_RESPONDER 1 #define FCGI_AUTHORIZER 2 #define FCGI_FILTER 3
其中FCGI_RESPONDER是我們最常見的動(dòng)態(tài)語言腳本處理角色,叫做響應(yīng)器。FCGI_AUTHORIZER是用于判斷請求是否擁有訪問權(quán)限,類似于HTTP請求中的認(rèn)證功能,叫做授權(quán)器。FCGI_FILTER是用于對一些特殊的數(shù)據(jù)進(jìn)行處理并返回,包括添加數(shù)據(jù)頭部與尾部等功能,叫做過濾器(官方對其沒有過多的介紹,所以無法詳細(xì)描述)。
大多數(shù)請求我們都是使用FCGI_RESPONDER角色進(jìn)行請求傳輸,因?yàn)閯?dòng)態(tài)語言可以完全的替代其他2中角色的功能,所以授權(quán)器和過濾器的功能被大家給遺忘了。不過這不代表角色的設(shè)定是錯(cuò)誤的,角色的設(shè)定很大一部分程度上給Fastcgi協(xié)議提供了快捷擴(kuò)展的功能,保證了協(xié)議的可擴(kuò)展性。
flags則是用于設(shè)置使用傳輸時(shí)復(fù)用通道,避免每次傳輸都需要新開一個(gè)socket通道來浪費(fèi)時(shí)間和性能。
該類型主要是給web服務(wù)器提供主動(dòng)結(jié)束通道的功能,場景為當(dāng)web服務(wù)器需要盡快結(jié)束并關(guān)閉通道,則會(huì)發(fā)送該請求給Fastcgi服務(wù)器,這樣Fastcgi服務(wù)會(huì)盡快的將數(shù)據(jù)處理完并返回關(guān)閉通道。
FCGI_END_REQUEST該類型是當(dāng)響應(yīng)數(shù)據(jù)輸出完畢后,用于描述該請求的響應(yīng)結(jié)果,類似于HTTP的響應(yīng)報(bào)文的狀態(tài)碼,數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct { ????unsigned?char?appStatusB3; ????unsigned?char?appStatusB2; ????unsigned?char?appStatusB1; ????unsigned?char?appStatusB0; ????unsigned?char?protocolStatus; ????unsigned?char?reserved[3]; } FCGI_EndRequestBody;
其中appStatus類似于HTTP請求的狀態(tài)碼,主要用于描述數(shù)據(jù)處理的情況,而protocolStatus主要用于對于此次請求通道的描述,是請求正常完成還是拒絕完成等,其中的賦值范圍如下:
#define FCGI_REQUEST_COMPLETE 0 #define FCGI_CANT_MPX_CONN 1 #define FCGI_OVERLOADED 2 #define FCGI_UNKNOWN_ROLE 3
區(qū)別如下:
FCGI_REQUEST_COMPLETE:請求的正常結(jié)束。
FCGI_CANT_MPX_CONN:拒絕新請求。這發(fā)生在Web服務(wù)器通過一條線路向應(yīng)用發(fā)送并發(fā)的請求時(shí),后者被設(shè)計(jì)為每條線路每次處理一個(gè)請求。
FCGI_OVERLOADED:拒絕新請求。這發(fā)生在應(yīng)用用完某些資源時(shí),例如數(shù)據(jù)庫連接。
FCGI_UNKNOWN_ROLE:拒絕新請求。這發(fā)生在Web服務(wù)器指定了一個(gè)應(yīng)用不能識(shí)別的角色時(shí)。
但是,一般情況下,大家都只返回appStatus為0以及protocolStatus為0的數(shù)據(jù)。這其實(shí)也是由于官方對相關(guān)的描述并不充分的原因。
FCGI_PARAMS該結(jié)果主要用于傳輸鍵值對類型數(shù)據(jù),畢竟英文翻譯叫參數(shù)。其中該類型為了節(jié)約空間提供了4類結(jié)構(gòu)體:
typedef struct { ????unsigned?char?nameLengthB0;??/* nameLengthB0? >> 7 == 0 */ ????unsigned?char?valueLengthB0;?/* valueLengthB0 >> 7 == 0 */ ????unsigned?char?nameData[nameLength]; ????unsigned?char?valueData[valueLength]; } FCGI_NameValuePair11; ? typedef struct { ????unsigned?char?nameLengthB0;??/* nameLengthB0? >> 7 == 0 */ ????unsigned?char?valueLengthB3;?/* valueLengthB3 >> 7 == 1 */ ????unsigned?char?valueLengthB2; ????unsigned?char?valueLengthB1; ????unsigned?char?valueLengthB0; ????unsigned?char?nameData[nameLength]; ????unsigned?char?valueData[valueLength]; } FCGI_NameValuePair14; typedef struct { ????unsigned?char?nameLengthB3;??/* nameLengthB3? >> 7 == 1 */ ????unsigned?char?nameLengthB2; ????unsigned?char?nameLengthB1; ????unsigned?char?nameLengthB0; ????unsigned?char?valueLengthB0;?/* valueLengthB0 >> 7 == 0 */ ????unsigned?char?nameData[nameLength]; ????unsigned?char?valueData[valueLength]; } FCGI_NameValuePair41; ? typedef struct { ????unsigned?char?nameLengthB3;??/* nameLengthB3? >> 7 == 1 */ ????unsigned?char?nameLengthB2; ????unsigned?char?nameLengthB1; ????unsigned?char?nameLengthB0; ????unsigned?char?valueLengthB3;?/* valueLengthB3 >> 7 == 1 */ ????unsigned?char?valueLengthB2; ????unsigned?char?valueLengthB1; ????unsigned?char?valueLengthB0; ????unsigned?char?nameData[nameLength]; ????unsigned?char?valueData[valueLength]; } FCGI_NameValuePair44;
相對晦澀的話,我們再來看看圖片描述:
如圖所示,該類似分為4個(gè)部分:nameLength、valueLength、nameData和valueData,其中nameLength和valueLength用于描述長度,有1字節(jié)和4字節(jié)的2種方案,也就構(gòu)成了上面的4種不同的結(jié)構(gòu)體。其中只需要判斷第一個(gè)字節(jié)的最高位是否為1,若為1則是用4字節(jié)描述的長度,若為0則用1字節(jié)。
其中,1字節(jié)是char型的大小,4字節(jié)是int型大小,所以十分方便解析。
類型中的FCGI_STDIN、FCGI_STDOUT、FCGI_STDERR和FCGI_DATA都是數(shù)據(jù)流傳輸,不存在什么結(jié)構(gòu)體,內(nèi)容中只有數(shù)據(jù)信息。十分暴力,如圖所示:
FCGI_GET_VALUES該類型主要用于查詢fastcgi服務(wù)器的相關(guān)性能參數(shù),結(jié)構(gòu)體復(fù)用了FCGI_PARAMS類型的結(jié)構(gòu)體,其中name設(shè)置為相應(yīng)的值,而value為空即可。之后由fastcgi服務(wù)返回FCGI_GET_VALUES_RESULT類型的數(shù)據(jù)并填充value即可。其中name取值類型包括:
FCGI_MAX_CONNS:此應(yīng)用程序?qū)⒔邮艿淖畲蟛l(fā)傳輸連接數(shù), e.g.?"1"?or?"10".
FCGI_MAX_REQS:此應(yīng)用程序?qū)⒔邮艿淖畲蟛l(fā)請求數(shù), e.g.?"1"?or?"50".
FCGI_MPXS_CONNS:此應(yīng)用程序?qū)⒔邮艿淖畲髲?fù)用傳輸連接數(shù).
Fastcgi協(xié)議實(shí)例0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. 0x0010: 03dc 535f 4000 4006 e5ba 7f00 0001 7f00 ..S_@.@......... 0x0020: 0001 ee2e 2328 3093 101a 95fd 1652 8018 ....#(0......R.. 0x0030: 0156 01d1 0000 0101 080a 0004 4344 0004 .V..........CD.. 0x0040: 4344 0101 0001 0008 0000 0001 0000 0000 CD.............. 0x0050: 0000 0104 0001 037f 0100 0f1f 5343 5249 ............SCRI 0x0060: 5054 5f46 494c 454e 414d 452f 686f 6d65 PT_FILENAME/home 0x0070: 2f6d 6f62 792f 6e67 696e 782f 6874 6d6c /moby/nginx/html 0x0080: 2f69 6e64 6578 2e70 6870 0c00 5155 4552 /index.php..QUER ... ... 0x03c0: 4745 7a68 2d43 4e2c 7a68 3b71 3d30 2e39 GEzh-CN,zh;q=0.9 0x03d0: 2c65 6e3b 713d 302e 3800 0104 0001 0000 ,en;q=0.8....... 0x03e0: 0000 0105 0001 0000 0000 ..........
首先,0800之前是mac報(bào)文頭部的數(shù)據(jù),ee2e是ip報(bào)文頭部的數(shù)據(jù),4344之前是tcp報(bào)文的頭部,所以,0101以后,便是我們的fastcgi的數(shù)據(jù)包信息。
0101 0001 0008 0000,我們可以一一對應(yīng):version:1,type:1,requestId:1,contentLength:8,padding:0,之后就是FCGI_BEGIN_REQUEST的數(shù)據(jù)包:role:1,flags:0,說明使用的是響應(yīng)器功能。
之后再解析一下請求頭:version:1,type:4,requestId:1,contentLength:037f,padding:1,所以下面的結(jié)構(gòu)體為FCGI_PARAMS,繼續(xù)解析:nameLength:15,valueLength:31,nameData:SCRIPT_FILENAME,valueData:/home/moby/nginx/html/index.php,以此類推。
POST請求報(bào)文
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. 0x0010: 0374 0e6d 4000 4006 2b15 7f00 0001 7f00 .t.m@.@.+....... 0x0020: 0001 d5a4 2328 3da1 e47f 4aa2 48a3 8018 ....#(=...J.H... 0x0030: 0156 0169 0000 0101 080a ffff ea15 ffff .V.i............ 0x0040: ea15 0101 0001 0008 0000 0001 0000 0000 ................ 0x0050: 0000 0104 0001 02fd 0300 0f1f 5343 5249 ............SCRI 0x0060: 5054 5f46 494c 454e 414d 452f 686f 6d65 PT_FILENAME/home 0x0070: 2f6d 6f62 792f 6e67 696e 782f 6874 6d6c /moby/nginx/html ... ... 0x0340: 5450 5f43 4f4e 4e45 4354 494f 4e6b 6565 TP_CONNECTIONkee 0x0350: 702d 616c 6976 6500 0000 0104 0001 0000 p-alive......... 0x0360: 0000 0105 0001 000c 0400 6469 6469 3d63 ..........didi=c 0x0370: 6875 7869 6e67 0000 0000 0105 0001 0000 huxing.......... 0x0380: 0000 ..
響應(yīng)報(bào)文:
0x0000: 0000 0000 0000 0000 0000 0000 0800 4500 ..............E. 0x0010: 05b4 30a7 4000 4006 069b 7f00 0001 7f00 ..0.@.@......... 0x0020: 0001 2328 ee28 d52b 8b2b 96bd f7d9 8018 ..#(.(.+.+...... 0x0030: 0164 03a9 0000 0101 080a 0000 bb8d 0000 .d.............. 0x0040: bb8d 0106 0001 0564 0400 436f 6e74 656e .......d..Conten 0x0050: 742d 7479 7065 3a20 7465 7874 2f68 746d t-type:.text/htm 0x0060: 6c3b 2063 6861 7273 6574 3d55 5446 2d38 l;.charset=UTF-8 0x0070: 0d0a 0d0a 4172 7261 790a 280a 2020 2020 ....Array.(..... 0x0080: 5b55 5345 525d 203d 3e20 7777 772d 6461 [USER].=>.www-da 0x0090: 7461 0a20 2020 205b 484f 4d45 5d20 3d3e ta.....[HOME].=> ... ... 0x0580: 3734 3430 322e 3335 3135 0a20 2020 205b 74402.3515.....[ 0x0590: 5245 5155 4553 545f 5449 4d45 5d20 3d3e REQUEST_TIME].=> 0x05a0: 2031 3531 3638 3734 3430 320a 290a 0000 .1516874402.)... 0x05b0: 0000 0103 0001 0008 0000 0000 0000 0000 ................ 0x05c0: 0000 ..
等,實(shí)例可以自行利用tcpdump工具抓取。
總結(jié)Fastcgi協(xié)議本身完成了對CGI協(xié)議的升級(jí),同時(shí)自身擁有一個(gè)很好的可擴(kuò)展性,但本身功能的限制導(dǎo)致了市面上很好有協(xié)議功能的所有實(shí)現(xiàn)實(shí)例。但對其進(jìn)行了解有利于對網(wǎng)絡(luò)數(shù)據(jù)的傳輸?shù)氖煜ひ约凹由钣∠蟆?/p> 小廣告
若對php/c++等方向感興趣且對滴滴出行有意向的小伙伴,可以將簡歷投送一波[email protected],福利多多。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28214.html
摘要:通過,腳本層無需過多考慮執(zhí)行的具體環(huán)境,而本身則可以讓針對自己的特點(diǎn)給出特有實(shí)現(xiàn)。模式下,也只執(zhí)行一次。這幾個(gè)概念的關(guān)系如下網(wǎng)關(guān)協(xié)議,與語言無關(guān),所以與關(guān)系也不大。總結(jié)本文簡要回顧了程序的架構(gòu)和執(zhí)行流程,并對幾個(gè)容易混淆概念做了介紹。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie we...
摘要:請求頭部基本上是作為鍵值對傳輸,例如。他們者直接由將協(xié)議轉(zhuǎn)換為協(xié)議傳輸給進(jìn)行處理。而作為保留位,主要也是為了協(xié)議頭部能與字節(jié)對齊。 前言 閑來無事,決定整理一下最近看的一些東西,于是先寫寫fastcgi協(xié)議,此協(xié)議是cgi協(xié)議的升級(jí)版,其實(shí)就是當(dāng)年cgi太弱,導(dǎo)致動(dòng)態(tài)頁面太耗性能,所以開發(fā)了例如fastcgi協(xié)議等升級(jí)版,下面我們就來聊聊這個(gè)協(xié)議的相關(guān)內(nèi)容。 CGI協(xié)議以及Fastc...
摘要:與傳統(tǒng)模式的區(qū)別之一則是服務(wù)器不是直接執(zhí)行程序了,而是通過與響應(yīng)器進(jìn)程管理器進(jìn)行交互,服務(wù)器需要將接口數(shù)據(jù)封裝在遵循協(xié)議包中發(fā)送給響應(yīng)器程序。正是由于進(jìn)程管理器是基于通信的,所以也是分布式的,服務(wù)器和響應(yīng)器服務(wù)器分開部署。 廣告 很多工程師在工作1~3年的時(shí)候最容易遇到瓶頸,不知道自己應(yīng)該學(xué)習(xí)什么,面試總是吃閉門羹。那么 PHP 后面應(yīng)該怎么學(xué)呢?安利一波我的系列直播 《PHP 進(jìn)階之...
摘要:業(yè)務(wù)和架構(gòu)不分家,架構(gòu)是建立在對業(yè)務(wù)的理解之上的。主鍵最好保持順序遞增,隨機(jī)主鍵會(huì)導(dǎo)致聚簇索引樹頻繁分裂,隨機(jī)增多,數(shù)據(jù)離散,性能下降。沒有索引的更新,可能會(huì)導(dǎo)致全表數(shù)據(jù)都被鎖住。 本博客并非全部原創(chuàng),其實(shí)是一個(gè)知識(shí)的歸納和匯總,里面我引用了很多網(wǎng)上、書上的內(nèi)容。也給出了相關(guān)的鏈接。 本文涉及的知識(shí)點(diǎn)比較多,大家可以根據(jù)關(guān)鍵字去搜索相關(guān)的內(nèi)容和購買相應(yīng)的書籍進(jìn)行系統(tǒng)的學(xué)習(xí)。不對的地方...
摘要:要說與是如何協(xié)同工作的,首先得說和這兩個(gè)協(xié)議。之于標(biāo)準(zhǔn)的,也提供了一些增強(qiáng)功能,具體可以參考官方文檔。為了能夠使理解協(xié)議,提供了模塊來將請求映射為對應(yīng)的請求。 網(wǎng)絡(luò)上有很多關(guān)于如何配置 Nginx + FPM 的文章,但它們更多從操作的角度出發(fā),告訴我們怎么做,但卻沒有告訴我們?yōu)槭裁匆@么做,本文從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx...
閱讀 2918·2023-04-26 02:14
閱讀 3770·2019-08-30 15:55
閱讀 1851·2019-08-29 16:42
閱讀 2766·2019-08-26 11:55
閱讀 2853·2019-08-23 13:38
閱讀 494·2019-08-23 12:10
閱讀 1319·2019-08-23 11:44
閱讀 2821·2019-08-23 11:43