亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

nginx keepalive的具體使用

 更新時(shí)間:2018年10月11日 11:28:03   作者:huangtao  
這篇文章主要介紹了nginx keepalive的具體使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

默認(rèn)http1.1協(xié)議的請求頭是默認(rèn)開啟keepalive,如圖:

那什么是keepalive?作用是什么?

keepalive是在TCP中一個(gè)可以檢測死連接的機(jī)制,作用是保持socket長連接不被斷開,屬于tcp層的功能,并不屬于應(yīng)用層。

TCP層怎么做到保持長連接的呢?

先看keepalive的用法:有三個(gè)參數(shù),開放給應(yīng)用層使用

sk->keepalive_probes:探測次數(shù),重試次數(shù)
sk->keepalive_time 探測的心跳間隔,TCP鏈接在多少秒之后沒有數(shù)據(jù)報(bào)文傳輸啟動(dòng)探測報(bào)文
sk->keepalive_intvl 探測間隔,未收到回復(fù)時(shí),重試的時(shí)間間隔

默認(rèn)配置查看:

[***@*** ~]$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
[***@*** ~]$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
[***@*** ~]$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

使用方法:

int keepalive = 1; // 開啟keepalive屬性
int keepidle = 60; // 如該連接在60秒內(nèi)沒有任何數(shù)據(jù)往來,則進(jìn)行探測
int keepinterval = 5; // 探測時(shí)發(fā)包的時(shí)間間隔為5 秒
int keepcount = 3; // 探測嘗試的次數(shù)。如果第1次探測包就收到響應(yīng)了,則后2次的不再發(fā)。并且清零該計(jì)數(shù)
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle ));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval ));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount ));

應(yīng)用層這么設(shè)置后,會(huì)把默認(rèn)配置覆蓋,走手動(dòng)設(shè)置的配置。

對于一個(gè)已經(jīng)建立的tcp連接。如果在keepalive_time時(shí)間內(nèi)雙方?jīng)]有任何的數(shù)據(jù)包傳輸,則開啟keepalive功能的一端將發(fā)送 keepalive數(shù)據(jù)心跳包,若沒有收到應(yīng)答,則每隔keepalive_intvl時(shí)間再發(fā)送該數(shù)據(jù)包,發(fā)送keepalive_probes次。一直沒有 收到應(yīng)答,則發(fā)送rst包關(guān)閉連接。若收到應(yīng)答,則將計(jì)時(shí)器清零。

抓包驗(yàn)證tcp心跳包內(nèi)容

根據(jù)抓包繼續(xù)分析keepalive發(fā)送及回復(fù)的心跳包內(nèi)容:

tcp頭部結(jié)構(gòu)體源碼為:

typedef struct _TCP_HEADER
{
 short m_sSourPort;          // 源端口號16bit
 short m_sDestPort;           // 目的端口號16bit
 unsigned int m_uiSequNum;      // req字段 序列號32bit
 unsigned int m_uiAcknowledgeNum; //ack字段 確認(rèn)號32bit
 short m_sHeaderLenAndFlag;     // 前4位:TCP頭長度;中6位:保留;后6位:標(biāo)志位
 short m_sWindowSize;         //win字段 窗口大小16bit
 short m_sCheckSum;          // 檢驗(yàn)和16bit
 short m_surgentPointer;        // 緊急數(shù)據(jù)偏移量16bit
}__attribute__((packed))TCP_HEADER, *PTCP_HEADER;

看發(fā)送的心跳包內(nèi)容:

0000 d4 6d 50 f5 02 7f f4 5c  89 cb 35 29 08 00    //mac頭 14字節(jié):
                         45 00 // ip頭 20字節(jié) :
0010 00 28 10 f4 00 00 40 06  5b dd ac 19 42 76 0a b3
0020 14 bd
      e4 4a 1f 7c 32 7e  7a cb 4c bc 55 08 50 10  // tcp頭 20字節(jié) 
0030 10 00 3f 00 00 00
//分析tcp頭部內(nèi)容
e4 4a //源端口號16bit 10進(jìn)制為:58442 
1f 7c //目的端口號16bit 10進(jìn)制為 : 8060 
32 7e 7a cb // req字段 序列號32bit 10進(jìn)制為 : 
4c bc 55 08 // ack字段 確認(rèn)號32bit 
5 // 前4位:TCP頭長度 5*4 =20 字節(jié) 沒問題 
0 10 /// 中6位:保留;后6位:標(biāo)志位 10 代表倒數(shù)第5位為1, 標(biāo)識改tcp包為 ACK 確認(rèn)包 
0030 10 00 3f 00 00 00 

繼續(xù)看回復(fù)的心跳包內(nèi)容 :

0000 f4 5c 89 cb 35 29 d4 6d 50 f5 02 7f 08 00 45 00 
0010 00 34 47 28 40 00 36 06 ef 9c 0a b3 14 bd ac 19 
0020 42 76 // 前面數(shù)據(jù)不解讀 
1f 7c
e4 4a
4c bc 55 08
32 7e 7a cc
8// TCP頭長度為8 * 4 = 32 除了頭部 還有 選項(xiàng)數(shù)據(jù) 12字節(jié) 
0 10  // 中6位:保留;后6位:標(biāo)志位 10 代表倒數(shù)第5位為1, 標(biāo)識該tcp包為 ACK 確認(rèn)包 
0030 01 3f //win字段 窗口大小16bit
4e 0d // 檢驗(yàn)和16bit
00 00 // 緊急數(shù)據(jù)偏移量16bit
01 01 08 0a 00 59 be 1c 39 13 
0040 cf 12 // 選項(xiàng)數(shù)據(jù) 12字節(jié) 

由上可以看出,tcp維持長連接的心跳包是由瀏覽器向服務(wù)器先出發(fā)送一個(gè)ACK包,然后服務(wù)器再回復(fù)一個(gè)ACK包,且?guī)Я诉x項(xiàng)數(shù)據(jù)

nginx會(huì)怎么處理keepalive請求,都會(huì)做哪些事情?

首先做的是版本判斷 :http協(xié)議版本低于1.1時(shí),該鏈接的keepalive置為0
if (r->http_version < NGX_HTTP_VERSION_11) {
  r->keepalive = 0;
} 
ngx_http_process_connection 函數(shù)中 ngx_http_request_t 中帶有keep-alive則把改鏈接標(biāo)識起來 
if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) {
  r->headers_in.connection_type = NGX_HTTP_CONNECTION_KEEP_ALIVE;
}
ngx_http_handler函數(shù)中對r->headers_in.connection_type 判斷,給r->keepalive賦值為1
  switch (r->headers_in.connection_type) {
  case NGX_HTTP_CONNECTION_KEEP_ALIVE:
    r->keepalive = 1;
    break;
  }
ngx_configure_listening_sockets函數(shù)中,當(dāng)keepalive為1時(shí),對該連接開啟KEEPALIVE,之后tcp底層就會(huì)對該連接fd做檢測死連接的機(jī)制,保持長連接,不斷開。
if (ls[i].keepalive) {
  value = (ls[i].keepalive == 1) ? 1 : 0;

  if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,//開啟keepalive功能
          (const void *) &value, sizeof(int))
    == -1)
  
}

nginx什么時(shí)候長連接會(huì)斷開呢?

在nginx通過 setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,(const void *) &value, sizeof(int))開啟keepalive后,會(huì)始終和客戶端保持長連接,如此會(huì)出現(xiàn)一個(gè)很嚴(yán)峻的問題,每個(gè)woker的能保持的連接數(shù)是有限的(ep = epoll_create(cycle->connection_n / 2); cycle->connection_n / 2 為epoll能管理的fd上限),如此一來,連接數(shù)很快就被耗盡,這時(shí)候nginx應(yīng)該怎么處理 ?

為了找到這個(gè)答案,我們來看nginx關(guān)于keeoalive的兩個(gè)配置參數(shù)

keepalive_timeout

keepalive_timeout timeout [header_timeout];

第一個(gè)參數(shù):設(shè)置keep-alive客戶端連接在服務(wù)器端保持開啟的超時(shí)值(默認(rèn)75s);值為0會(huì)禁用keep-alive客戶端連接;

第二個(gè)參數(shù):可選、在響應(yīng)的header域中設(shè)置一個(gè)值“Keep-Alive: timeout=time”;通??梢圆挥迷O(shè)置;

注:keepalive_timeout默認(rèn)75s

keepalive_requests

keepalive_requests指令用于設(shè)置一個(gè)keep-alive連接上可以服務(wù)的請求的最大數(shù)量,當(dāng)最大請求數(shù)量達(dá)到時(shí),連接被關(guān)閉,值為0會(huì)也禁用keep-alive客戶端連接;。默認(rèn)是100。
答案顯而易見,通過 keepalive_timeout keepalive_requests 來管理長連接,

  • 當(dāng)一個(gè)tcp連接存活時(shí)間超過 keepalive_timeout 時(shí)則會(huì)被close掉,nginx的具體實(shí)現(xiàn),是通過定時(shí)器來做的
  • 當(dāng)一個(gè)tcp連接最大情書數(shù)超過 keepalive_requests 時(shí)則也會(huì)被close掉

通過這兩個(gè)機(jī)制來保證每個(gè)worker的連接數(shù)不會(huì)超過epoll所能管理的數(shù)目。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Nginx服務(wù)器限制訪問速度的配置方法

    Nginx服務(wù)器限制訪問速度的配置方法

    這篇文章主要介紹了Nginx服務(wù)器限制訪問速度的配置方法,尤其是當(dāng)服務(wù)器中存在ftp下載等服務(wù)時(shí)尤為有用,需要的朋友可以參考下
    2015-07-07
  • 一篇文章快速掌握Nginx部署前端項(xiàng)目(Nginx安裝配置及部署都非常詳細(xì)!)

    一篇文章快速掌握Nginx部署前端項(xiàng)目(Nginx安裝配置及部署都非常詳細(xì)!)

    這篇文章主要給大家介紹了關(guān)于如何通過一篇文章快速掌握Nginx部署前端項(xiàng)目的相關(guān)資料,文中從Nginx安裝配置及部署都非常詳細(xì)哦,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Nginx配置文件解析

    Nginx配置文件解析

    Nginx 是一款常用的 Web 服務(wù)器軟件,其配置文件用于指定服務(wù)器的行為和功能,本文將給大家詳細(xì)的解析Nginx配置文件,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-09-09
  • Nginx禁止ip訪問或非法域名訪問

    Nginx禁止ip訪問或非法域名訪問

    這篇文章主要介紹了Nginx禁止ip訪問或非法域名訪問,需要的朋友可以參考下
    2022-04-04
  • Nginx+Tomcat負(fù)載均衡及動(dòng)靜分離群集的實(shí)現(xiàn)

    Nginx+Tomcat負(fù)載均衡及動(dòng)靜分離群集的實(shí)現(xiàn)

    本文主要介紹了Nginx+Tomcat負(fù)載均衡及動(dòng)靜分離群集的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • nginx代理服務(wù)器配置雙向證書驗(yàn)證的方法

    nginx代理服務(wù)器配置雙向證書驗(yàn)證的方法

    今天小編就為大家分享一篇關(guān)于nginx代理服務(wù)器配置雙向證書驗(yàn)證的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Nginx打包RPM過程(FPM工具)

    Nginx打包RPM過程(FPM工具)

    文章介紹了在Linux系統(tǒng)中安裝Nginx、Ruby2.6及FPM工具的完整流程,包括源碼編譯、依賴安裝、RPM打包配置及錯(cuò)誤處理方法,重點(diǎn)解決rpmbuild缺失問題
    2025-07-07
  • Windows設(shè)置nginx開機(jī)自啟動(dòng)的方法

    Windows設(shè)置nginx開機(jī)自啟動(dòng)的方法

    這篇文章主要介紹了Windows設(shè)置nginx開機(jī)自啟動(dòng)的方法,通過兩種方式實(shí)現(xiàn)nginx的開機(jī)自啟動(dòng):winws和window計(jì)劃程序,每種方式給大家介紹的非常詳細(xì)需要的朋友可以參考下
    2022-11-11
  • 如何在centos7中安裝nginx

    如何在centos7中安裝nginx

    近期做項(xiàng)目用到了nginx,所以自己動(dòng)手來在Centos7上安裝nginx,以下是安裝步驟。
    2018-09-09
  • Nginx配置代理gRPC的方法

    Nginx配置代理gRPC的方法

    本篇文章主要介紹了Nginx配置代理gRPC的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論