기본적으로 http1.1 프로토콜의 요청 헤더는 그림과 같이 기본적으로 Keepalive를 활성화하는 것입니다.
그럼 Keepalive란 무엇인가요? 기능은 무엇입니까?
keepalive는 끊어진 연결을 감지할 수 있는 TCP의 메커니즘입니다. 해당 기능은 긴 소켓 연결이 끊어지지 않도록 하는 것입니다. 이는 TCP 계층의 기능이며 애플리케이션 계층에 속하지 않습니다.
tcp 계층은 어떻게 긴 연결을 유지하나요?
먼저 Keepalive의 사용법을 살펴보겠습니다. 세 가지 매개변수가 있으며 애플리케이션 계층에 열려 있습니다.
sk->keepalive_probes:探测次数,重试次数 sk->keepalive_time 探测的心跳间隔,tcp链接在多少秒之后没有数据报文传输启动探测报文 sk->keepalive_intvl 探测间隔,未收到回复时,重试的时间间隔
기본 구성 보기:
[***@*** ~]$ 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秒内没有任何数据往来,则进行探测 int keepinterval = 5; // 探测时发包的时间间隔为5 秒 int keepcount = 3; // 探测尝试的次数。如果第1次探测包就收到响应了,则后2次的不再发。并且清零该计数 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 ));
애플리케이션 계층을 이렇게 설정한 후 기본 구성을 덮어쓰고 수동으로 설정합니다.
TCP 연결이 설정된 경우. keepalive_time 내에 두 당사자 간에 데이터 패킷 전송이 없으면 keepalive 기능을 켜는 쪽에서는 keepalive 데이터 하트비트 패킷을 전송합니다. 응답이 없으면 keepalive_intvl 시간 및 keepalive_probes 횟수마다 데이터 패킷을 다시 보냅니다. . 응답이 수신되지 않으면 연결을 종료하기 위해 첫 번째 패킷이 전송됩니다. 응답을 받으면 타이머가 지워집니다.
패킷을 캡처하여 tcp 하트비트 패킷의 내용을 확인하세요
패킷 캡처를 기반으로 keepalive에서 보내고 응답한 하트비트 패킷의 내용을 계속 분석합니다.
TCP 헤더의 소스 코드 구조는 다음과 같습니다.
typedef struct _tcp_header { short m_ssourport; // 源端口号16bit short m_sdestport; // 目的端口号16bit unsigned int m_uisequnum; // req字段 序列号32bit unsigned int m_uiacknowledgenum; //ack字段 确认号32bit short m_sheaderlenandflag; // 前4位:tcp头长度;中6位:保留;后6位:标志位 short m_swindowsize; //win字段 窗口大小16bit short m_schecksum; // 检验和16bit short m_surgentpointer; // 紧急数据偏移量16bit }__attribute__((packed))tcp_header, *ptcp_header;
보내진 하트비트 패킷의 내용을 살펴보세요:
0000 d4 6d 50 f5 02 7f f4 5c 89 cb 35 29 08 00 //mac头 14字节: 45 00 // ip头 20字节 : 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字节 0030 10 00 3f 00 00 00 //分析tcp头部内容 e4 4a //源端口号16bit 10进制为:58442 1f 7c //目的端口号16bit 10进制为 : 8060 32 7e 7a cb // req字段 序列号32bit 10进制为 : 4c bc 55 08 // ack字段 确认号32bit 5 // 前4位:tcp头长度 5*4 =20 字节 没问题 0 10 /// 中6位:保留;后6位:标志位 10 代表倒数第5位为1, 标识改tcp包为 ack 确认包 0030 10 00 3f 00 00 00
계속해서 응답 하트비트 패킷의 내용을 살펴보세요.
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 // 前面数据不解读 1f 7c e4 4a 4c bc 55 08 32 7e 7a cc 8// tcp头长度为8 * 4 = 32 除了头部 还有 选项数据 12字节 0 10 // 中6位:保留;后6位:标志位 10 代表倒数第5位为1, 标识该tcp包为 ack 确认包 0030 01 3f //win字段 窗口大小16bit 4e 0d // 检验和16bit 00 00 // 紧急数据偏移量16bit 01 01 08 0a 00 59 be 1c 39 13 0040 cf 12 // 选项数据 12字节
위에서 볼 수 있듯이 TCP의 하트비트 패킷은 긴 연결은 브라우저가 먼저 서버에 ack 패킷을 보낸 다음 서버가 ack 패킷으로 응답한다는 것입니다. 그리고
옵션 데이터가 사용 가능한 경우 nginx는 어떻게 keepalive 요청을 처리합니까?
首先做的是版本判断 :http协议版本低于1.1时,该链接的keepalive置为0 if (r->http_version < ngx_http_version_11) { r->keepalive = 0; } ngx_http_process_connection 函数中 ngx_http_request_t 中带有keep-alive则把改链接标识起来 if (ngx_strcasestrn(h->value.data, "keep-alive", 10 - 1)) { r->headers_in.connection_type = ngx_http_connection_keep_alive; } ngx_http_handler函数中对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函数中,当keepalive为1时,对该连接开启keepalive,之后tcp底层就会对该连接fd做检测死连接的机制,保持长连接,不断开。 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의 오랜 연결은 언제 끊어지나요?
nginx가 setockopt(ls[i].fd, sol_socket, so_keepalive,(const void *) &value, sizeof(int))를 통해 keepalive를 켠 후에는 항상 클라이언트와의 긴 연결을 유지하므로 매우 심각한 문제 문제는 각 작업자가 유지할 수 있는 연결 수가 제한되어 있다는 것입니다(ep = epoll_create(cycle->connection_n/2); Cycle->connection_n/2는 epoll이 관리할 수 있는 fd의 상한입니다) 이런 식으로 연결 데이터가 빨리 소모됩니다. nginx는 이를 어떻게 처리해야 할까요?
이 답을 찾기 위해 keeoalive
keepalive_timeout
keepalive_timeout timeout [header_timeout];
에 대한 nginx의 두 가지 구성 매개변수를 살펴보겠습니다. 첫 번째 매개변수: 연결 유지 클라이언트 연결에 대한 시간 제한 값을 서버 측에서 열려 있도록 설정합니다(기본값) 75s); 값 0으로 설정하면 연결 유지 클라이언트 연결이 비활성화됩니다.
두 번째 매개변수: 선택 사항, 응답의 헤더 필드에 "keep-alive: timeout=time" 값을 설정합니다.
참고: keepalive_timeout 기본 75초
keepalive_requests
keepalive_requests 지시어는 연결 유지 연결에서 처리할 수 있는 최대 요청 수를 설정하는 데 사용됩니다. 최대 요청 수에 도달하면 연결이 닫힙니다. 0 값은 연결 유지 클라이언트 연결도 비활성화합니다. 기본값은 100입니다.
대답은 명확합니다. 긴 연결을 관리하려면 keepalive_timeout keepalive_requests를 사용하세요.
tcp 연결이 keepalive_timeout을 초과하면 nginx의 특정 구현이 타이머를 통해 완료됩니다. 연결 수가 keepalive_requests를 초과하면 이 두 가지 메커니즘은 각 작업자의 연결 수가 epoll이 관리할 수 있는 수를 초과하지 않도록 하는 데 사용됩니다.
위 내용은 nginx 킵얼라이브를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

NginXunit은 여러 프로그래밍 언어를 지원하고 동적 구성, 제로 다운 타임 업데이트 및 내장로드 밸런싱과 같은 기능을 제공하는 오픈 소스 응용 프로그램 서버입니다. 1. 동적 구성 : 다시 시작하지 않고 구성을 수정할 수 있습니다. 2. 다국어 지원 : Python, Go, Java, PHP 등과 호환됩니다. 3. 제로 다운 타임 업데이트 : 서비스를 중단하지 않는 응용 프로그램 업데이트를 지원합니다. 4. 내장로드 밸런싱 : 요청을 여러 응용 프로그램 인스턴스에 배포 할 수 있습니다.

NginxUnit은 다국어 프로젝트 및 동적 구성 요구 사항에 적합한 Apachetomcat, Gunicorn 및 Node.js 내장 HTTP 서버보다 낫습니다. 1) 여러 프로그래밍 언어를 지원하고, 2) 동적 구성 재 장전을 제공합니다. 3) 확장 성과 신뢰성이 높은 프로젝트에 적합한 내장로드 밸런싱 기능.

NginxUnit은 모듈 식 아키텍처 및 동적 재구성 기능으로 응용 프로그램 성능 및 관리 가능성을 향상시킵니다. 1) 모듈 식 설계에는 마스터 프로세스, 라우터 및 응용 프로그램 프로세스가 포함되어 효율적인 관리 및 확장을 지원합니다. 2) 동적 재구성을 통해 CI/CD 환경에 적합한 런타임시 구성을 완벽하게 업데이트 할 수 있습니다. 3) 다국어 지원은 언어 런타임의 동적로드를 통해 구현되어 개발 유연성을 향상시킵니다. 4) 고성능은 이벤트 중심 모델과 비동기 I/O를 통해 달성되며 높은 동시성에서도 효율적으로 유지됩니다. 5) 응용 프로그램 프로세스를 분리하고 응용 프로그램 간의 상호 영향을 줄임으로써 보안이 향상됩니다.

NginxUnit을 사용하여 여러 언어로 응용 프로그램을 배포하고 관리 할 수 있습니다. 1) nginxunit을 설치하십시오. 2) Python 및 PHP와 같은 다른 유형의 응용 프로그램을 실행하도록 구성하십시오. 3) 응용 프로그램 관리에 동적 구성 기능을 사용하십시오. 이러한 단계를 통해 응용 프로그램을 효율적으로 배포하고 관리하고 프로젝트 효율성을 향상시킬 수 있습니다.

Nginx는 높은 동시 연결을 처리하는 데 더 적합한 반면 Apache는 복잡한 구성 및 모듈 확장이 필요한 시나리오에 더 적합합니다. 1.NGINX는 고성능 및 낮은 자원 소비로 유명하며 높은 동시성에 적합합니다. 2. Aapache는 안정성과 풍부한 모듈 확장으로 유명하며 복잡한 구성 요구에 적합합니다.

NginxUnit은 동적 구성 및 고성능 아키텍처로 응용 프로그램 유연성 및 성능을 향상시킵니다. 1. 동적 구성을 사용하면 서버를 다시 시작하지 않고 응용 프로그램 구성을 조정할 수 있습니다. 2. 고성능은 이벤트 중심 및 비 블로킹 아키텍처 및 다중 프로세스 모델에 반영되며 동시 연결을 효율적으로 처리하고 멀티 코어 CPU를 활용할 수 있습니다.

Nginx와 Apache는 성능, 확장 성 및 효율성 측면에서 고유 한 장점과 단점을 가진 강력한 웹 서버입니다. 1) NGINX는 정적 컨텐츠를 처리하고 역전 프록시를 처리 할 때 잘 수행되며 동시 동시성 시나리오에 적합합니다. 2) Apache는 동적 컨텐츠를 처리 할 때 더 나은 성능을 발휘하며 풍부한 모듈 지원이 필요한 프로젝트에 적합합니다. 서버 선택은 프로젝트 요구 사항 및 시나리오에 따라 결정해야합니다.

Nginx는 높은 동시 요청을 처리하는 데 적합한 반면 Apache는 복잡한 구성 및 기능 확장이 필요한 시나리오에 적합합니다. 1.NGINX는 이벤트 중심의 비 블로킹 아키텍처를 채택하며, 대결 환경에 적합합니다. 2. Apache는 프로세스 또는 스레드 모델을 채택하여 복잡한 구성 요구에 적합한 풍부한 모듈 생태계를 제공합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版
시각적 웹 개발 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

드림위버 CS6
시각적 웹 개발 도구
