欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Nginx的配置函數(shù)對(duì)于請(qǐng)求體的讀取

 更新時(shí)間:2015年12月30日 11:35:30   作者:fengmo_q  
這篇文章主要介紹了Nginx的配置函數(shù)對(duì)于請(qǐng)求體的讀取,深入Nginx的內(nèi)核配置中進(jìn)行講解,需要的朋友可以參考下

nginx核心本身不會(huì)主動(dòng)讀取請(qǐng)求體,這個(gè)工作是交給請(qǐng)求處理階段的模塊來(lái)做,但是nginx核心提供了ngx_http_read_client_request_body()接口來(lái)讀取請(qǐng)求體,另外還提供了一個(gè)丟棄請(qǐng)求體的接口-ngx_http_discard_request_body(),在請(qǐng)求執(zhí)行的各個(gè)階段中,任何一個(gè)階段的模塊如果對(duì)請(qǐng)求體感興趣或者希望丟掉客戶端發(fā)過(guò)來(lái)的請(qǐng)求體,可以分別調(diào)用這兩個(gè)接口來(lái)完成。這兩個(gè)接口是nginx核心提供的處理請(qǐng)求體的標(biāo)準(zhǔn)接口,如果希望配置文件中一些請(qǐng)求體相關(guān)的指令(比如client_body_in_file_only,client_body_buffer_size等)能夠預(yù)期工作,以及能夠正常使用nginx內(nèi)置的一些和請(qǐng)求體相關(guān)的變量(比如$request_body和$request_body_file),一般來(lái)說(shuō)所有模塊都必須調(diào)用這些接口來(lái)完成相應(yīng)操作,如果需要自定義接口來(lái)處理請(qǐng)求體,也應(yīng)盡量兼容nginx默認(rèn)的行為。

1,讀取請(qǐng)求體

請(qǐng)求體的讀取一般發(fā)生在nginx的content handler中,一些nginx內(nèi)置的模塊,比如proxy模塊,fastcgi模塊,uwsgi模塊等,這些模塊的行為必須將客戶端過(guò)來(lái)的請(qǐng)求體(如果有的話)以相應(yīng)協(xié)議完整的轉(zhuǎn)發(fā)到后端服務(wù)進(jìn)程,所有的這些模塊都是調(diào)用了ngx_http_read_client_request_body()接口來(lái)完成請(qǐng)求體讀取。值得注意的是這些模塊會(huì)把客戶端的請(qǐng)求體完整的讀取后才開(kāi)始往后端轉(zhuǎn)發(fā)數(shù)據(jù)。

由于內(nèi)存的限制,ngx_http_read_client_request_body()接口讀取的請(qǐng)求體會(huì)部分或者全部寫入一個(gè)臨時(shí)文件中,根據(jù)請(qǐng)求體的大小以及相關(guān)的指令配置,請(qǐng)求體可能完整放置在一塊連續(xù)內(nèi)存中,也可能分別放置在兩塊不同內(nèi)存中,還可能全部存在一個(gè)臨時(shí)文件中,最后還可能一部分在內(nèi)存,剩余部分在臨時(shí)文件中。下面先介紹一下和這些不同存儲(chǔ)行為相關(guān)的指令:

client_body_buffer_size:設(shè)置緩存請(qǐng)求體的buffer大小,默認(rèn)為系統(tǒng)頁(yè)大小的2倍,當(dāng)請(qǐng)求體的大小超過(guò)此大小時(shí),nginx會(huì)把請(qǐng)求體寫入到臨時(shí)文件中??梢愿鶕?jù)業(yè)務(wù)需求設(shè)置合適的大小,盡量避免磁盤io操作;

client_body_in_single_buffer:指示是否將請(qǐng)求體完整的存儲(chǔ)在一塊連續(xù)的內(nèi)存中,默認(rèn)為off,如果此指令被設(shè)置為on,則nginx會(huì)保證請(qǐng)求體在不大于client_body_buffer_size設(shè)置的值時(shí),被存放在一塊連續(xù)的內(nèi)存中,但超過(guò)大小時(shí)會(huì)被整個(gè)寫入一個(gè)臨時(shí)文件;

client_body_in_file_only:設(shè)置是否總是將請(qǐng)求體保存在臨時(shí)文件中,默認(rèn)為off,當(dāng)此指定被設(shè)置為on時(shí),即使客戶端顯示指示了請(qǐng)求體長(zhǎng)度為0時(shí),nginx還是會(huì)為請(qǐng)求創(chuàng)建一個(gè)臨時(shí)文件。

接著介紹ngx_http_read_client_request_body()接口的實(shí)現(xiàn),它的定義如下:

ngx_int_t 
ngx_http_read_client_request_body(ngx_http_request_t *r, 
 ngx_http_client_body_handler_pt post_handler) 

該接口有2個(gè)參數(shù),第1個(gè)為指向請(qǐng)求結(jié)構(gòu)的指針,第2個(gè)為一個(gè)函數(shù)指針,當(dāng)請(qǐng)求體讀完時(shí),它會(huì)被調(diào)用。之前也說(shuō)到根據(jù)nginx現(xiàn)有行為,模塊邏輯會(huì)在請(qǐng)求體讀完后執(zhí)行,這個(gè)回調(diào)函數(shù)一般就是模塊的邏輯處理函數(shù)。ngx_http_read_client_request_body()函數(shù)首先將參數(shù)r對(duì)應(yīng)的主請(qǐng)求的引用加1,這樣做的目的和該接口被調(diào)用的上下文有關(guān),一般而言,模塊是在content handler中調(diào)用此接口,一個(gè)典型的調(diào)用如下:

static ngx_int_t 
ngx_http_proxy_handler(ngx_http_request_t *r) 
{ 
 ... 
 rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init); 
 
 
 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { 
 return rc; 
 } 
 
 return NGX_DONE; 
}

上面的代碼是在porxy模塊的content handler,ngx_http_proxy_handler()中調(diào)用了ngx_http_read_client_request_body()函數(shù),其中ngx_http_upstream_init()被作為回調(diào)函數(shù)傳入進(jìn)接口中,另外nginx中模塊的content handler調(diào)用的上下文如下:

ngx_int_t 
ngx_http_core_content_phase(ngx_http_request_t *r, 
 ngx_http_phase_handler_t *ph) 
{ 
 ... 
 if (r->content_handler) { 
 r->write_event_handler = ngx_http_request_empty_handler; 
 ngx_http_finalize_request(r, r->content_handler(r)); 
 return NGX_OK; 
 } 
 ... 
} 

上面的代碼中,content handler調(diào)用之后,它的返回值作為參數(shù)調(diào)用了ngx_http_finalize_request()函數(shù),在請(qǐng)求體沒(méi)有被接收完全時(shí),ngx_http_read_client_request_body()函數(shù)返回值為NGX_AGAIN,此時(shí)content handler,比如ngx_http_proxy_handler()會(huì)返回NGX_DONE,而NGX_DONE作為參數(shù)傳給ngx_http_finalize_request()函數(shù)會(huì)導(dǎo)致主請(qǐng)求的引用計(jì)數(shù)減1,所以正好抵消了ngx_http_read_client_request_body()函數(shù)開(kāi)頭對(duì)主請(qǐng)求計(jì)數(shù)的加1。

接下來(lái)回到ngx_http_read_client_request_body()函數(shù),它會(huì)檢查該請(qǐng)求的請(qǐng)求體是否已經(jīng)被讀取或者被丟棄了,如果是的話,則直接調(diào)用回調(diào)函數(shù)并返回NGX_OK,這里實(shí)際上是為子請(qǐng)求檢查,子請(qǐng)求是nginx中的一個(gè)概念,nginx中可以在當(dāng)前請(qǐng)求中發(fā)起另外一個(gè)或多個(gè)全新的子請(qǐng)求來(lái)訪問(wèn)其他的location,關(guān)于子請(qǐng)求的具體介紹會(huì)在后面的章節(jié)作詳細(xì)分析,一般而言子請(qǐng)求不需要自己去讀取請(qǐng)求體。

函數(shù)接著調(diào)用ngx_http_test_expect()檢查客戶端是否發(fā)送了Expect: 100-continue頭,是的話則給客戶端回復(fù)"HTTP/1.1 100 Continue",根據(jù)http 1.1協(xié)議,客戶端可以發(fā)送一個(gè)Expect頭來(lái)向服務(wù)器表明期望發(fā)送請(qǐng)求體,服務(wù)器如果允許客戶端發(fā)送請(qǐng)求體,則會(huì)回復(fù)"HTTP/1.1 100 Continue",客戶端收到時(shí),才會(huì)開(kāi)始發(fā)送請(qǐng)求體。

接著繼續(xù)為接收請(qǐng)求體做準(zhǔn)備工作,分配一個(gè)ngx_http_request_body_t結(jié)構(gòu),并保存在r->request_body,這個(gè)結(jié)構(gòu)用來(lái)保存請(qǐng)求體讀取過(guò)程用到的緩存引用,臨時(shí)文件引用,剩余請(qǐng)求體大小等信息,它的定義如下。

<span style="font-family:SimSun;font-size:18px;">typedef struct { 
 ngx_temp_file_t   *temp_file; 
 ngx_chain_t   *bufs; 
 ngx_buf_t   *buf; 
 off_t    rest; 
 ngx_chain_t   *to_write; 
 ngx_http_client_body_handler_pt post_handler; 
} ngx_http_request_body_t;</span> 
 
  • temp_file: 指向儲(chǔ)存請(qǐng)求體的臨時(shí)文件的指針;
  • bufs: 指向保存請(qǐng)求體的鏈表頭;
  • buf: 指向當(dāng)前用于保存請(qǐng)求體的內(nèi)存緩存;
  • rest: 當(dāng)前剩余的請(qǐng)求體大?。?/li>
  • post_handler:保存?zhèn)鹘ongx_http_read_client_request_body()函數(shù)的回調(diào)函數(shù)。

做好準(zhǔn)備工作之后,函數(shù)開(kāi)始檢查請(qǐng)求是否帶有content_length頭,如果沒(méi)有該頭或者客戶端發(fā)送了一個(gè)值為0的content_length頭,表明沒(méi)有請(qǐng)求體,這時(shí)直接調(diào)用回調(diào)函數(shù)并返回NGX_OK即可。當(dāng)然如果client_body_in_file_only指令被設(shè)置為on,且content_length為0時(shí),該函數(shù)在調(diào)用回調(diào)函數(shù)之前,會(huì)創(chuàng)建一個(gè)空的臨時(shí)文件。

進(jìn)入到函數(shù)下半部分,表明客戶端請(qǐng)求確實(shí)表明了要發(fā)送請(qǐng)求體,該函數(shù)會(huì)先檢查是否在讀取請(qǐng)求頭時(shí)預(yù)讀了請(qǐng)求體,這里的檢查是通過(guò)判斷保存請(qǐng)求頭的緩存(r->header_in)中是否還有未處理的數(shù)據(jù)。如果有預(yù)讀數(shù)據(jù),則分配一個(gè)ngx_buf_t結(jié)構(gòu),并將r->header_in中的預(yù)讀數(shù)據(jù)保存在其中,并且如果r->header_in中還有剩余空間,并且能夠容下剩余未讀取的請(qǐng)求體,這些空間將被繼續(xù)使用,而不用分配新的緩存,當(dāng)然甚至如果請(qǐng)求體已經(jīng)被整個(gè)預(yù)讀了,則不需要繼續(xù)處理了,此時(shí)調(diào)用回調(diào)函數(shù)后返回。

如果沒(méi)有預(yù)讀數(shù)據(jù)或者預(yù)讀不完整,該函數(shù)會(huì)分配一塊新的內(nèi)存(除非r->header_in還有足夠的剩余空間),另外如果request_body_in_single_buf指令被設(shè)置為no,則預(yù)讀的數(shù)據(jù)會(huì)被拷貝進(jìn)新開(kāi)辟的內(nèi)存塊中,真正讀取請(qǐng)求體的操作是在ngx_http_do_read_client_request_body()函數(shù),該函數(shù)循環(huán)的讀取請(qǐng)求體并保存在緩存中,如果緩存被寫滿了,其中的數(shù)據(jù)會(huì)被清空并寫回到臨時(shí)文件中。當(dāng)然這里有可能不能一次將數(shù)據(jù)讀到,該函數(shù)會(huì)掛載讀事件并設(shè)置讀事件handler為ngx_http_read_client_request_body_handler,另外nginx核心對(duì)兩次請(qǐng)求體的讀事件之間也做了超時(shí)設(shè)置,client_body_timeout指令可以設(shè)置這個(gè)超時(shí)時(shí)間,默認(rèn)為60s,如果下次讀事件超時(shí)了,nginx會(huì)返回408給客戶端。

最終讀完請(qǐng)求體后,ngx_http_do_read_client_request_body()會(huì)根據(jù)配置,將請(qǐng)求體調(diào)整到預(yù)期的位置(內(nèi)存或者文件),所有情況下請(qǐng)求體都可以從r->request_body的bufs鏈表得到,該鏈表最多可能有2個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)為一個(gè)buffer,但是這個(gè)buffer的內(nèi)容可能是保存在內(nèi)存中,也可能是保存在磁盤文件中。另外$request_body變量只在當(dāng)請(qǐng)求體已經(jīng)被讀取并且是全部保存在內(nèi)存中,才能取得相應(yīng)的數(shù)據(jù)。

2,丟棄請(qǐng)求體

一個(gè)模塊想要主動(dòng)的丟棄客戶端發(fā)過(guò)的請(qǐng)求體,可以調(diào)用nginx核心提供的ngx_http_discard_request_body()接口,主動(dòng)丟棄的原因可能有很多種,如模塊的業(yè)務(wù)邏輯壓根不需要請(qǐng)求體 ,客戶端發(fā)送了過(guò)大的請(qǐng)求體,另外為了兼容http1.1協(xié)議的pipeline請(qǐng)求,模塊有義務(wù)主動(dòng)丟棄不需要的請(qǐng)求體??傊疄榱吮3至己玫目蛻舳思嫒菪?,nginx必須主動(dòng)丟棄無(wú)用的請(qǐng)求體。下面開(kāi)始分析ngx_http_discard_request_body()函數(shù):

ngx_int_t 
ngx_http_discard_request_body(ngx_http_request_t *r) 
{ 
 ssize_t size; 
 ngx_event_t *rev; 
 
 if (r != r->main || r->discard_body) { 
 return NGX_OK; 
 } 
 
 if (ngx_http_test_expect(r) != NGX_OK) { 
 return NGX_HTTP_INTERNAL_SERVER_ERROR; 
 } 
 
 rev = r->connection->read; 
 
 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0, "http set discard body"); 
 
 if (rev->timer_set) { 
 ngx_del_timer(rev); 
 } 
 
 if (r->headers_in.content_length_n <= 0 || r->request_body) { 
 return NGX_OK; 
 } 
 
 size = r->header_in->last - r->header_in->pos; 
 
 if (size) { 
 if (r->headers_in.content_length_n > size) { 
  r->header_in->pos += size; 
  r->headers_in.content_length_n -= size; 
 
 } else { 
  r->header_in->pos += (size_t) r->headers_in.content_length_n; 
  r->headers_in.content_length_n = 0; 
  return NGX_OK; 
 } 
 } 
 
 r->read_event_handler = ngx_http_discarded_request_body_handler; 
 
 if (ngx_handle_read_event(rev, 0) != NGX_OK) { 
 return NGX_HTTP_INTERNAL_SERVER_ERROR; 
 } 
 
 if (ngx_http_read_discarded_request_body(r) == NGX_OK) { 
 r->lingering_close = 0; 
 
 } else { 
 r->count++; 
 r->discard_body = 1; 
 } 
 
 return NGX_OK; 
} 

由于函數(shù)不長(zhǎng),這里把它完整的列出來(lái)了,函數(shù)的開(kāi)始同樣先判斷了不需要再做處理的情況:子請(qǐng)求不需要處理,已經(jīng)調(diào)用過(guò)此函數(shù)的也不需要再處理。接著調(diào)用ngx_http_test_expect() 處理http1.1 expect的情況,根據(jù)http1.1的expect機(jī)制,如果客戶端發(fā)送了expect頭,而服務(wù)端不希望接收請(qǐng)求體時(shí),必須返回417(Expectation Failed)錯(cuò)誤。nginx并沒(méi)有這樣做,它只是簡(jiǎn)單的讓客戶端把請(qǐng)求體發(fā)送過(guò)來(lái),然后丟棄掉。接下來(lái),函數(shù)刪掉了讀事件上的定時(shí)器,因?yàn)檫@時(shí)本身就不需要請(qǐng)求體,所以也無(wú)所謂客戶端發(fā)送的快還是慢了,當(dāng)然后面還會(huì)將到,當(dāng)nginx已經(jīng)處理完該請(qǐng)求但客戶端還沒(méi)有發(fā)送完無(wú)用的請(qǐng)求體時(shí),nginx會(huì)在讀事件上再掛上定時(shí)器。
函數(shù)同樣還會(huì)檢查請(qǐng)求頭中的content-length頭,客戶端如果打算發(fā)送請(qǐng)求體,就必須發(fā)送content-length頭,同時(shí)還會(huì)查看其他地方是不是已經(jīng)讀取了請(qǐng)求體。如果確實(shí)有待處理的請(qǐng)求體,函數(shù)接著檢查請(qǐng)求頭buffer中預(yù)讀的數(shù)據(jù),預(yù)讀的數(shù)據(jù)會(huì)直接被丟掉,當(dāng)然如果請(qǐng)求體已經(jīng)被全部預(yù)讀,函數(shù)就直接返回了。

接下來(lái),如果還有剩余的請(qǐng)求體未處理,該函數(shù)調(diào)用ngx_handle_read_event()在事件處理機(jī)制中掛載好讀事件,并把讀事件的處理函數(shù)設(shè)置為ngx_http_discarded_request_body_handler。做好這些準(zhǔn)備之后,該函數(shù)最后調(diào)用ngx_http_read_discarded_request_body()接口讀取客戶端過(guò)來(lái)的請(qǐng)求體并丟棄。如果客戶端并沒(méi)有一次將請(qǐng)求體發(fā)過(guò)來(lái),函數(shù)會(huì)返回,剩余的數(shù)據(jù)等到下一次讀事件過(guò)來(lái)時(shí),交給ngx_http_discarded_request_body_handler()來(lái)處理,這時(shí),請(qǐng)求的discard_body將被設(shè)置為1用來(lái)標(biāo)識(shí)這種情況。另外請(qǐng)求的引用數(shù)(count)也被加1,這樣做的目的是客戶端可能在nginx處理完請(qǐng)求之后仍未完整發(fā)送待發(fā)送的請(qǐng)求體,增加引用是防止nginx核心在處理完請(qǐng)求后直接釋放了請(qǐng)求的相關(guān)資源。

ngx_http_read_discarded_request_body()函數(shù)非常簡(jiǎn)單,它循環(huán)的從鏈接中讀取數(shù)據(jù)并丟棄,直到讀完接收緩沖區(qū)的所有數(shù)據(jù),如果請(qǐng)求體已經(jīng)被讀完了,該函數(shù)會(huì)設(shè)置讀事件的處理函數(shù)為ngx_http_block_reading,這個(gè)函數(shù)僅僅刪除水平觸發(fā)的讀事件,防止同一事件不斷被觸發(fā)。
再來(lái)看一下讀事件的處理函數(shù)ngx_http_discarded_request_body_handler,這個(gè)函數(shù)每次讀事件來(lái)時(shí)會(huì)被調(diào)用,先看一下它的源碼:

void 
ngx_http_discarded_request_body_handler(ngx_http_request_t *r) 
{ 
 ... 
 
 c = r->connection; 
 rev = c->read; 
 
 if (rev->timedout) { 
 c->timedout = 1; 
 c->error = 1; 
 ngx_http_finalize_request(r, NGX_ERROR); 
 return; 
 } 
 
 if (r->lingering_time) { 
 timer = (ngx_msec_t) (r->lingering_time - ngx_time()); 
 
 if (timer <= 0) { 
  r->discard_body = 0; 
  r->lingering_close = 0; 
  ngx_http_finalize_request(r, NGX_ERROR); 
  return; 
 } 
 
 } else { 
 timer = 0; 
 } 
 
 rc = ngx_http_read_discarded_request_body(r); 
 
 if (rc == NGX_OK) { 
 r->discard_body = 0; 
 r->lingering_close = 0; 
 ngx_http_finalize_request(r, NGX_DONE); 
 return; 
 } 
 
 /* rc == NGX_AGAIN */ 
 
 if (ngx_handle_read_event(rev, 0) != NGX_OK) { 
 c->error = 1; 
 ngx_http_finalize_request(r, NGX_ERROR); 
 return; 
 } 
 
 if (timer) { 
 
 clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); 
 
 timer *= 1000; 
 
 if (timer > clcf->lingering_timeout) { 
  timer = clcf->lingering_timeout; 
 } 
 
 ngx_add_timer(rev, timer); 
 } 
} 
函數(shù)一開(kāi)始就處理了讀事件超時(shí)的情況,之前說(shuō)到在ngx_http_discard_request_body()函數(shù)中已經(jīng)刪除了讀事件的定時(shí)器,那么什么時(shí)候會(huì)設(shè)置定時(shí)器呢?答案就是在nginx已經(jīng)處理完該請(qǐng)求,但是又沒(méi)有完全將該請(qǐng)求的請(qǐng)求體丟棄的時(shí)候(客戶端可能還沒(méi)有發(fā)送過(guò)來(lái)),在ngx_http_finalize_connection()函數(shù)中,如果檢查到還有未丟棄的請(qǐng)求體時(shí),nginx會(huì)添加一個(gè)讀事件定時(shí)器,它的時(shí)長(zhǎng)為lingering_timeout指令所指定,默認(rèn)為5秒,不過(guò)這個(gè)時(shí)間僅僅兩次讀事件之間的超時(shí)時(shí)間,等待請(qǐng)求體的總時(shí)長(zhǎng)為lingering_time指令所指定,默認(rèn)為30秒。這種情況中,該函數(shù)如果檢測(cè)到超時(shí)事件則直接返回并斷開(kāi)連接。同樣,還需要控制整個(gè)丟棄請(qǐng)求體的時(shí)長(zhǎng)不能超過(guò)lingering_time設(shè)置的時(shí)間,如果超過(guò)了最大時(shí)長(zhǎng),也會(huì)直接返回并斷開(kāi)連接。
如果讀事件發(fā)生在請(qǐng)求處理完之前,則不用處理超時(shí)事件,也不用設(shè)置定時(shí)器,函數(shù)只是簡(jiǎn)單的調(diào)用ngx_http_read_discarded_request_body()來(lái)讀取并丟棄數(shù)據(jù)。

相關(guān)文章

  • 詳解Linux環(huán)境下使Nginx服務(wù)器支持中文url的配置流程

    詳解Linux環(huán)境下使Nginx服務(wù)器支持中文url的配置流程

    這篇文章主要介紹了Linux環(huán)境下使Nginx服務(wù)器支持中文url的配置流程,文中還介紹了一個(gè)在Linux下將非UTF-8的文件名轉(zhuǎn)換為UTF-8編碼,的方法,需要的朋友可以參考下
    2016-04-04
  • 使用Nginx讓網(wǎng)站快速置灰的方法

    使用Nginx讓網(wǎng)站快速置灰的方法

    這篇文章主要介紹了使用Nginx讓網(wǎng)站快速置灰的方法,首先是查看當(dāng)前編譯的版本是否支持http_sub_module模塊,如果不支持需要重新編譯增加此模塊,具體配置方法參考下本文
    2023-11-11
  • 前端異常502?bad?gateway的原因和解決辦法

    前端異常502?bad?gateway的原因和解決辦法

    本文詳細(xì)講解了前端異常502?bad?gateway的原因和解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2021-12-12
  • Nginx負(fù)載均衡的4種方案配置實(shí)例

    Nginx負(fù)載均衡的4種方案配置實(shí)例

    這篇文章主要介紹了Nginx負(fù)載均衡的4種方案配置實(shí)例,本文講解了輪詢、最少連接、IP地址哈希、基于權(quán)重的負(fù)載均衡等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 詳解Nginx服務(wù)器和iOS的HTTPS安全通信

    詳解Nginx服務(wù)器和iOS的HTTPS安全通信

    這篇文章主要介紹了詳解Nginx服務(wù)器和iOS的HTTPS安全通信的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • nginx地址重定向的方法

    nginx地址重定向的方法

    這篇文章主要介紹了nginx地址重定向的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 分布式架構(gòu)中關(guān)于正向代理反向代理面試提問(wèn)

    分布式架構(gòu)中關(guān)于正向代理反向代理面試提問(wèn)

    這篇文章主要為大家介紹了分布式架構(gòu)中關(guān)于正向代理反向代理的面試提問(wèn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Nginx+SSL實(shí)現(xiàn)雙向認(rèn)證的示例代碼

    Nginx+SSL實(shí)現(xiàn)雙向認(rèn)證的示例代碼

    這篇文章主要介紹了Nginx+SSL實(shí)現(xiàn)雙向認(rèn)證的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Nginx?502?bad?gateway錯(cuò)誤解決的九種方案及原因

    Nginx?502?bad?gateway錯(cuò)誤解決的九種方案及原因

    一般在訪問(wèn)某些網(wǎng)站或者我們?cè)谧霰镜販y(cè)試的時(shí)候,服務(wù)器突然返回502?Bad?Gateway?Nginx,這種問(wèn)題相信大家也遇到不少了,下面這篇文章主要給大家介紹了關(guān)于Nginx?502?bad?gateway錯(cuò)誤解決的九種方案及原因,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Nginx添加lua模塊的實(shí)現(xiàn)方法

    Nginx添加lua模塊的實(shí)現(xiàn)方法

    這篇文章主要介紹了Nginx添加lua模塊的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論