成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊Nginx的Keepalive_time參數,你學會了嗎?

開發 前端
nginx的1.19.10版本新增了keepalive_time參數(默認1h),用于限制一個keep-alive連接處理請求的最長時間(即指定connection的最大存活時間),當達到這個時間后,連接會在后續請求處理完成后關閉。

序 本文主要研究一下nginx的keepalive_time參數

keepalive_time Syntax: keepalive_time time; Default: keepalive_time 1h; Context: http, server, location This directive appeared in version 1.19.10. nginx的1.19.10版本新增了keepalive_time參數,用于限制一個keep-alive連接處理請求的最長時間。當達到這個時間后,連接會在后續請求處理完成后關閉。

ngx_http_core_module nginx/src/http/ngx_http_core_module.c

void ngx_http_update_location_config(ngx_http_request_t *r) { ngx_http_core_loc_conf_t *clcf;

//......

if (r->keepalive) {
    if (clcf->keepalive_timeout == 0) {
        r->keepalive = 0;

    } else if (r->connection->requests >= clcf->keepalive_requests) {
        r->keepalive = 0;

    } else if (ngx_current_msec - r->connection->start_time
               > clcf->keepalive_time)
    {
        r->keepalive = 0;

    } else if (r->headers_in.msie6
               && r->method == NGX_HTTP_POST
               && (clcf->keepalive_disable
                   & NGX_HTTP_KEEPALIVE_DISABLE_MSIE6))
    {
        /*
         * MSIE may wait for some time if an response for
         * a POST request was sent over a keepalive connection
         */
        r->keepalive = 0;

    } else if (r->headers_in.safari
               && (clcf->keepalive_disable
                   & NGX_HTTP_KEEPALIVE_DISABLE_SAFARI))
    {
        /*
         * Safari may send a POST request to a closed keepalive
         * connection and may stall for some time, see
         *     https://bugs.webkit.org/show_bug.cgi?id=5760
         */
        r->keepalive = 0;
    }
}

//......

} ngx_http_core_module的ngx_http_update_location_config方法在開啟keepalive時會判斷connection的存活時間,若大于keepalive_time則關閉keepalive(ngx_current_msec - r->connection->start_time > clcf->keepalive_time)

ngx_http_core_keepalive nginx/src/http/ngx_http_core_module.c

static char * ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_core_loc_conf_t *clcf = conf;

ngx_str_t  *value;

if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {
    return "is duplicate";
}

value = cf->args->elts;

clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);

if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {
    return "invalid value";
}

if (cf->args->nelts == 2) {
    return NGX_CONF_OK;
}

clcf->keepalive_header = ngx_parse_time(&value[2], 1);

if (clcf->keepalive_header == (time_t) NGX_ERROR) {
    return "invalid value";
}

return NGX_CONF_OK;

} ngx_http_core_module的ngx_http_core_keepalive方法會解析nginx配置文件的keepalive_timeout配置,第一個參數為keepalive_timeout參數,第二參數為header_timeout

ngx_http_header_filter_module nginx/src/http/ngx_http_header_filter_module.c

static ngx_int_t ngx_http_header_filter(ngx_http_request_t *r) { u_char *p; size_t len; ngx_str_t host, *status_line; ngx_buf_t *b; ngx_uint_t status, i, port; ngx_chain_t out; ngx_list_part_t *part; ngx_table_elt_t *header; ngx_connection_t *c; ngx_http_core_loc_conf_t *clcf; ngx_http_core_srv_conf_t *cscf; u_char addr[NGX_SOCKADDR_STRLEN];

if (r->header_sent) {
    return NGX_OK;
}

//......

if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {
    b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,
                         sizeof("Connection: upgrade" CRLF) - 1);

} else if (r->keepalive) {
    b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,
                         sizeof("Connection: keep-alive" CRLF) - 1);

    if (clcf->keepalive_header) {
        b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,
                              clcf->keepalive_header);
    }

} else {
    b->last = ngx_cpymem(b->last, "Connection: close" CRLF,
                         sizeof("Connection: close" CRLF) - 1);
}

//......

} ngx_http_header_filter_module的ngx_http_header_filter方法在開啟keepalive的時候會寫入Connection: keep-alive,若keepalive_header的值大于0則寫入Keep-Alive: timeout=%T,可以看到這個值是固定的

ngx_http_set_keepalive nginx/src/http/ngx_http_request.c

static void ngx_http_set_keepalive(ngx_http_request_t *r) { int tcp_nodelay; ngx_buf_t *b, *f; ngx_chain_t *cl, *ln; ngx_event_t *rev, *wev; ngx_connection_t *c; ngx_http_connection_t *hc; ngx_http_core_loc_conf_t *clcf;

//......

wev = c->write;
wev->handler = ngx_http_empty_handler;

if (b->pos < b->last) {

    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");

    c->log->action = "reading client pipelined request line";

    r = ngx_http_create_request(c);
    if (r == NULL) {
        ngx_http_close_connection(c);
        return;
    }

    r->pipeline = 1;

    c->data = r;

    c->sent = 0;
    c->destroyed = 0;
    c->pipeline = 1;

    if (rev->timer_set) {
        ngx_del_timer(rev);
    }

    rev->handler = ngx_http_process_request_line;
    ngx_post_event(rev, &ngx_posted_events);
    return;
}

//......

rev->handler = ngx_http_keepalive_handler;

//......

c->idle = 1;
ngx_reusable_connection(c, 1);

ngx_add_timer(rev, clcf->keepalive_timeout);

if (rev->ready) {
    ngx_post_event(rev, &ngx_posted_events);
}

} ngx_http_request的ngx_http_set_keepalive方法,在b->pos < b->last會嘗試讀取request line然后執行ngx_http_create_request,若能讀到數據則判斷是否有timer,有則執行ngx_del_timer(rev)刪除timer,然后返回;若進入keepalive邏輯,則會通過ngx_add_timer添加一個定時事件,在keepalive_timeout之后觸發

ngx_http_keepalive_handler nginx/src/http/ngx_http_request.c

static void ngx_http_keepalive_handler(ngx_event_t *rev) { size_t size; ssize_t n; ngx_buf_t *b; ngx_connection_t *c;

c = rev->data;

ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");

if (rev->timedout || c->close) {
    ngx_http_close_connection(c);
    return;
}

#if (NGX_HAVE_KQUEUE)

if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
    if (rev->pending_eof) {
        c->log->handler = NULL;
        ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,
                      "kevent() reported that client %V closed "
                      "keepalive connection", &c->addr_text);

#if (NGX_HTTP_SSL) if (c->ssl) { c->ssl->no_send_shutdown = 1; } #endif ngx_http_close_connection(c); return; } }

#endif

b = c->buffer;
size = b->end - b->start;

if (b->pos == NULL) {

    /*
     * The c->buffer's memory was freed by ngx_http_set_keepalive().
     * However, the c->buffer->start and c->buffer->end were not changed
     * to keep the buffer size.
     */

    b->pos = ngx_palloc(c->pool, size);
    if (b->pos == NULL) {
        ngx_http_close_connection(c);
        return;
    }

    b->start = b->pos;
    b->last = b->pos;
    b->end = b->pos + size;
}

/*
 * MSIE closes a keepalive connection with RST flag
 * so we ignore ECONNRESET here.
 */

c->log_error = NGX_ERROR_IGNORE_ECONNRESET;
ngx_set_socket_errno(0);

n = c->recv(c, b->last, size);
c->log_error = NGX_ERROR_INFO;

if (n == NGX_AGAIN) {
    if (ngx_handle_read_event(rev, 0) != NGX_OK) {
        ngx_http_close_connection(c);
        return;
    }

    /*
     * Like ngx_http_set_keepalive() we are trying to not hold
     * c->buffer's memory for a keepalive connection.
     */

    if (ngx_pfree(c->pool, b->start) == NGX_OK) {

        /*
         * the special note that c->buffer's memory was freed
         */

        b->pos = NULL;
    }

    return;
}

if (n == NGX_ERROR) {
    ngx_http_close_connection(c);
    return;
}

c->log->handler = NULL;

if (n == 0) {
    ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,
                  "client %V closed keepalive connection", &c->addr_text);
    ngx_http_close_connection(c);
    return;
}

b->last += n;

c->log->handler = ngx_http_log_error;
c->log->action = "reading client request line";

c->idle = 0;
ngx_reusable_connection(c, 0);

c->data = ngx_http_create_request(c);
if (c->data == NULL) {
    ngx_http_close_connection(c);
    return;
}

c->sent = 0;
c->destroyed = 0;

ngx_del_timer(rev);

rev->handler = ngx_http_process_request_line;
ngx_http_process_request_line(rev);

} ngx_http_request的ngx_http_keepalive_handler會在rev->timedout || c->close的時候執行ngx_http_close_connection然后返回,若還能讀到請求數據則執行ngx_del_timer(rev)刪除定時任務

小結

nginx的1.19.10版本新增了keepalive_time參數(默認1h),用于限制一個keep-alive連接處理請求的最長時間(即指定connection的最大存活時間),當達到這個時間后,連接會在后續請求處理完成后關閉。而keepalive_timeout參數(默認75s)則是用于指定connection最大的空閑時間,nginx內部有會給該連接設定一個timer,在keepalive_timeout之后觸發,若連接還是空閑則關閉連接。

責任編輯:武曉燕 來源: 碼匠的流水賬
相關推薦

2024-10-17 10:00:59

2024-06-12 08:36:25

2024-03-05 10:09:16

restfulHTTPAPI

2022-12-26 07:48:04

敏捷項目

2024-08-19 10:24:14

2023-01-29 08:08:34

并發庫conc通用庫

2023-07-10 08:36:21

工具pptword

2022-09-26 08:49:11

Java架構CPU

2022-04-13 09:01:45

SASSCSS處理器

2022-12-08 10:49:43

2022-07-11 09:00:37

依賴配置文件Mybati

2024-03-04 07:41:18

SpringAOPOOP?

2022-12-27 08:45:00

繪制菜單符號

2023-06-05 08:36:04

SQL函數RANK()

2022-03-05 23:29:18

LibuvwatchdogNode.js

2022-12-14 08:31:43

#error編譯命令

2023-03-07 07:50:15

Transactio事務代碼

2024-11-08 08:56:01

2022-10-11 08:48:08

HTTP狀態碼瀏覽器

2023-12-07 12:29:49

Nginx負載均衡策略
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91 在线 | 国产精品视频导航 | 一区二区在线不卡 | 久久久久久国产精品 | 色婷婷综合久久久久中文一区二区 | 久久久激情视频 | 伊人热久久 | 成人精品国产免费网站 | 国产免费一区二区三区 | 亚洲视频免费 | 欧美日韩a| 欧美成人高清 | 九九99精品 | 午夜一区二区三区视频 | 久国产精品 | 亚洲在线观看视频 | 久久99久久久久 | 亚洲毛片一区二区 | 视频一区二区三区中文字幕 | 青青久久久 | 日韩一区二区三区av | 亚洲男人天堂av | 国产99视频精品免费视频7 | 成人在线精品视频 | 久久久久久久国产精品视频 | 日本精品一区二区三区视频 | 日韩中文字幕在线播放 | 亚洲精品一区二三区不卡 | 91精品国产综合久久婷婷香蕉 | 国产成年人小视频 | 一区二区亚洲 | 亚洲国产精品一区 | 日韩av在线一区 | 欧美亚洲免费 | 国产亚洲精品久久久久动 | 国产精品不卡一区 | 日韩欧美专区 | 久久88 | 视频一区在线 | 日本午夜一区二区三区 | 国产精品美女久久久久aⅴ国产馆 |