Apache2에서 keepAlive를 활성화해야합니까?


25

기본 설치에서 Apache 2는 keepAlive가 해제 된 상태로 제공되지만 다른 서버를 보면 keepAlive 모듈이 켜져 있습니다.

keepAlive가 나에게 적합한 지 어떻게 알 수 있습니까? 이것을 구성하는 좋은 예를 어디에서 찾을 수 있습니까?

답변:


31

이미 2 가지 좋은 답변이 있지만 아마도 가장 중요한 실제 문제 는 아직 언급되지 않았습니다.

먼저 OP는 2 개의 이전 답변 과이 작은 블로그 게시물 을 읽고 Keepalives가 무엇인지 이해할 수 있습니다. (저자는 TCPI / IP가 연결이 더 길어질수록 "빠르게"되는 부분에 대해 자세히 설명하지 않습니다. 사실, 오래 지속되는 연결은 IP 창 크기 조정의 이점이 있지만 파일이 없으면 그 효과는 중요하지 않습니다. 또는 지연 지연 제품이 비정상적으로 큰 경우)

Apache를 사용할 때 HTTP Keepalive에 대한 큰 주장 은 Apache 프로세스를 차단한다는 것입니다. 즉, keepalives를 사용하는 클라이언트는 클라이언트가 연결을 닫거나 시간 초과에 도달 할 때까지 'his'Apache 프로세스가 다른 클라이언트를 처리하지 못하게합니다. 같은 기간 동안이 Apache 인스턴스는 다른 많은 연결을 제공 할 수있었습니다.

이제 매우 일반적인 Apache 구성은 Prefork MPM 과 PHP / Perl / Python 인터프리터 및 언급 된 언어의 애플리케이션 코드입니다. 이 경우 각 Apache 프로세스는 수 메가 바이트의 RAM (인터프리터 및 애플리케이션 코드와 연결된 Apache)을 차지한다는 의미에서 "무거운"것입니다. 이것은 각 keepalive'd Apache 인스턴스의 차단과 함께 비효율적입니다.

일반적인 해결 방법 은 서로 다른 구성으로 2 개의 Apache 서버 (동일한 물리적 서버 또는 2 개의 서버)를 사용하는 것입니다.

  • 동적 콘텐츠에 대해 mod_php (또는 프로그래밍 언어가 사용되는)가있는 "무거운"하나는 keepalives가 꺼져 있습니다.
  • 정적 콘텐츠 (이미지, css, js 등)를 제공하기 위해 최소한의 모듈 세트가있는 하나의 "경량", keepalives가 켜져 있습니다.

그런 다음 필요에 따라 이러한 동적 및 정적 컨텐츠 분리를 확장 할 수 있습니다 ( 예 :

  • 같은 정적 콘텐츠에 대한 이벤트 기반의 서버를 사용 Nginx에 .
  • 정적 컨텐츠에 CDN 사용 (모든 정적 컨텐츠를 처리 할 수 ​​있음)
  • 정적 및 / 또는 동적 컨텐츠의 캐싱 구현

Apache 차단을 피하는 또 다른 방법Perlbal 과 같은보다 스마트 한 연결 처리 기능을 갖춘로드 밸런서를 사용하는 것 입니다.

.. 그리고 훨씬 더. :-)


2
이 답변은 8 년 후에도 여전히 관련이 있습니까?
TheStoryCoder

예, 프리 포크 MPM을 사용하는 경우에도 여전히 관련이 있습니다. Apache httpd 2.4 (예 : RHEL7)는 기본적으로 KeepAlive On을 사용하지만 구성에 (적어도 RHEL7에 명시 적으로 나열하지는 않음) 유의하십시오.
Cameron Kerr

5

Keepalives는 어떤 경우에는 좋을 수 있으며 다른 경우에는 매우 나쁠 수 있습니다. 새 연결을 설정하는 데 드는 시간과 노력이 줄어들지 만 연결 유지 시간이 초과되는 동안 서버 리소스가 연결됩니다. 예 :

  • 작은 개체가 많은 페이지, 전화 접속 클라이언트-연결 유지가 켜져 있어야합니다.
  • 큰 객체가 몇 개있는 페이지-keepalive는 유리하지 않습니다.
  • 고유 방문자 수가 매우 많은 서버-keepalive를 해제해야합니다 (그렇지 않으면 소켓과 스레드가 keepalive 시간 종료를 기다리는 동안 새 클라이언트를 제공하지 않음).

보다시피 KeepAliveTimeout은 서버 성능을 최적화하는 데 큰 역할을합니다.

사용 패턴을보고 스스로 결정하십시오.


0

KeepAlive On을 반드시 사용해야합니다.

만나다:

http://httpd.apache.org/docs/2.0/mod/core.html#keepalive

이렇게하면 브라우저에서 단일 TCP 연결을 다시 사용하여 여러 쿼리를 보냅니다. 일반적으로 웹 사이트에는 많은 구성 요소 (HTML 페이지, 자바 스크립트 코드, 이미지)가 있습니다. 이러한 리소스가 동일한 도메인에 있으므로 동일한 서버에서 서비스를 제공 할 수있는 경우 브라우저가 새로운 TCP 연결을 설정할 필요가 없으므로 KeepAlive 연결은 성능을 크게 향상시킵니다.

브라우저는 일반적으로 도메인에 약 3 개의 병렬 연결을 엽니 다. 사이트에 18 개의 개체가 있다고 가정 해 봅시다. 브라우저는 3 개의 연결을 열고 KeepAlive 모드를 사용하여 각 연결에서 6 개의 개체를 다운로드합니다. KeepAlive가 없으면 18 개의 TCP 연결을 열어야하는데 이는 매우 느립니다.

대부분 또는 모든 최신 브라우저는 HTTP / 1.1과 호환되므로 작동해야합니다.

Squid와 같은 특정 HTTP 프록시는 HTTP / 1.1과 호환되지 않지만 어쨌든 KeepAlive 연결 사용을 요청합니다.


이것은 클라이언트 측에서만 고려한 것이며 서버 측 리소스 사용도 중요하다고 생각합니다.
Morgan Cheng

서버 측 리소스 사용량이 사용자 인식 대기 시간보다 더 중요합니까?
Yves Junqueira

1
또한 KeepAlive를 켜는 것을 믿지만 Apache의 기본 시간 제한 인 15 초는 프로세스를 너무 오랫동안 차단하기 때문에 너무 관대합니다. 일반적으로 시간 초과를 약 2 초로 설정하면 약 한 페이지로드 동안 KeepAlive가 사용됩니다.
Martijn Heemels
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.