国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - Nginx - nginx中一個請求的count計數跟蹤淺析

nginx中一個請求的count計數跟蹤淺析

2022-01-18 19:33wwyyxx26 Nginx

這篇文章主要給大家介紹了關于nginx中一個請求的count計數跟蹤的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

首先說明一下應用方式,有兩個nginx的模塊,一個名為jtxy,另一個名為jtcmd。一個http請求來了,會進入jtxy的模塊處理,jtxy會創建出一個子請求發送給jtcmd,jtcmd里處理呢又會創建出一個upstream流到我們的上游非http服務A來處理,A處理完成后得到結果,會把結果返回給jtcmd的子請求,jtcmd的子請求把結果返回給jtxy。就是這樣一個流程,我們來跟蹤一下一個請的count計數。

1、請求到來,創建一個請求,ngx_http_alloc_request里count被初始化為1

此時,count為1。

?
1
2
r->main = r;
r->count = 1;

2、jtxy模塊里處理請求時,調用了ngx_http_subrequest來創建一個子請求,在ngx_http_subrequest里計數被加1。

此時,count為2

?
1
r->main->count++;

3、從一個模塊出去(這里就是jtxy模塊),會調用ngx_http_finalize_request,在ngx_http_finalize_request里會計數減一。

此時,count為1。

?
1
2
3
4
5
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;
}

4、然后進入了我們的子請求jtcmd模塊,,在這個模塊里,如果發現自己是個子請求((r!=r->main)),那么就應該把主請求計數加一。這里標紅強調這點是因為如果不加1,那么主請求計數就會有問題,一會兒我們繼續跟蹤count的減1就會發現這個問題。

這里是jtxy發起的一個jtcmd子請求這里的r和r->main并不相同的,r是jtcmd,r->main就是jtxy。

此時,count為2。

同時因為我們子請求jtcmd模塊里使用了upstream,那么count是還需要在加1,但是我們使用時是ngx_http_read_client_request_body(r, ngx_http_upstream_init),ngx_http_read_client_request_body里就已經加1了,所以,我們這里就不必自己來做這個加1了。

此時count為3。

大家可以看看《深入理解nginx》的5.1.5節的內容。對upstream流需要加1有講解。

所以呢,這里的count是加了2次的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
r->upstream->resolved->sockaddr =  (struct sockaddr*)&backendSockAddr;
r->upstream->resolved->socklen =  sizeof(struct sockaddr_in);
r->upstream->resolved->naddrs = 1;
 
r->upstream->create_request = jtcmd_upstream_create_request;
r->upstream->process_header = jtcmd_upstream_process_header;
r->upstream->finalize_request = jtcmd_upstream_finalize_request;
r->upstream->abort_request = jtcmd_upstream_abort_request;
 
r->upstream->input_filter_init = ngx_http_jtcmd_filter_init;
r->upstream->input_filter = ngx_http_jtcmd_filter;
r->upstream->input_filter_ctx = jtcmdctx;
 
//r->subrequest_in_memory = 1;
 
if(r!=r->main)
{
    r->main->count++;
}
 
ngx_int_t rc = ngx_http_read_client_request_body(r, ngx_http_upstream_init);
if (rc == NGX_ERROR || rc > NGX_OK) {
    return rc;
}

這里的r是子請求,r->main是主請求。同時還注意到,子請求的count始終是0。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
ngx_int_t
ngx_http_read_client_request_body(ngx_http_request_t *r,
    ngx_http_client_body_handler_pt post_handler)
{
    size_t                     preread;
    ssize_t                    size;
    ngx_int_t                  rc;
    ngx_buf_t                 *b;
    ngx_chain_t                out;
    ngx_http_request_body_t   *rb;
    ngx_http_core_loc_conf_t  *clcf;
 
    r->main->count++;

5、同第3一樣,請求的處理完后會調用ngx_http_finalize_request把計數減一,但是這里不同的是我們這里是一個子請求,他這里有一步r = r->main;所以實際減時就減到了主請求上去了,這個也是我們在4里紅字說明的要加1的原因了。

此時,count為2

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void
ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)
{
    ngx_connection_t  *c;
 
    r = r->main;
    c = r->connection;
 
    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, c->log, 0,
                   "http request count:%d blk:%d", r->count, r->blocked);
 
    if (r->count == 0) {
        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "http request count is zero");
    }
 
    r->count--;

6、然后呢,因為子請求使用了upstream,因為這個原因count加了一次1,那么當upstream結束,就要減一次1。

此時count為1。

nginx中一個請求的count計數跟蹤淺析

 7、子請求完成后,父請求的回調方法接著處理,接下來就回到了主請求模塊jtxy里,這里在處理結束后就會調用ngx_http_finalize_request來結束掉這個請求了,此時count為1,請求就會被釋放掉了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
ngx_http_free_request(ngx_http_request_t *r, ngx_int_t rc)
{
    ngx_log_t                 *log;
    ngx_pool_t                *pool;
    struct linger              linger;
    ngx_http_cleanup_t        *cln;
    ngx_http_log_ctx_t        *ctx;
    ngx_http_core_loc_conf_t  *clcf;
 
    log = r->connection->log;
 
    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, log, 0, "http close request");
 
    if (r->pool == NULL) {
        ngx_log_error(NGX_LOG_ALERT, log, 0, "http request already closed");
        return;
    }

總結

到此這篇關于nginx中一個請求的count計數跟蹤的文章就介紹到這了,更多相關nginx請求的count計數跟蹤內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/wwyyxx26/article/details/122211554

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久福利 | 超碰在线91| 情一色一乱一欲一区二区 | 久久99er6热线精品首页蜜臀 | 亚洲综合av在线播放 | 精品黑人一区二区三区久久 | 国产毛片av | 一区二区影视 | 水卜樱一区二区av | 日韩a在线 | 91高清视频在线观看 | 欧美成人精品在线 | 一级爱 | 欧美午夜精品 | 欧美日韩一区二区在线观看 | 欧美精品一区二区三区蜜桃视频 | 久久精品小视频 | 91视频导航| 亚洲国产中文字幕 | 91日韩精品一区二区三区 | 国产精品永久免费自在线观看 | 日本一区二区三区免费观看 | 国产精品一区二区三区在线播放 | 日韩视频免费看 | 三区在线 | 国产视频www | 国产精品亚洲第一区在线暖暖韩国 | 国产成人在线一区二区 | 欧美视频一区二区 | 欧美亚洲国产一区二区三区 | 欧美黄色一级片免费看 | 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩成人在线视频 | 三级黄色视频毛片 | 欧美日韩免费 | 国产色 | 午夜视频在线观看网站 | 亚洲综合二区 | 蜜桃国精产品二三三区视频 | 国产精品乱码人人做人人爱 | 成人a在线视频免费观看 |