웹사이트 검색

Apache 웹 서버 성능을 향상시키는 5가지 팁


Netcraft(웹 브라우저 사용 통계 등 다양한 서비스를 제공하는 유명한 인터넷 회사)의 최근 보고서에 따르면 Apache는 사이트와 인터넷 연결 컴퓨터 중에서 가장 널리 사용되는 웹 서버로 계속해서 사용되고 있습니다.

또한 Apache는 상위 웹 서버 중 가장 큰 성장세를 보이고 있으며 NginxIIS가 그 뒤를 따릅니다. 따라서 Apache 설치 관리를 담당하는 시스템 관리자라면 웹 서버가 귀하(또는 클라이언트)의 요구 사항에 따라 최상의 성능을 발휘하는지 확인하는 방법을 알아야 합니다.

이 기사에서는 Apache가 원활하게 실행되고 원격 클라이언트에서 예상하는 요청 수를 처리할 수 있는지 확인하는 데 도움이 되는 몇 가지 팁에 대해 설명합니다.

그러나 Apache는 벤치마크 기록을 수립하려는 목적으로 설계되지 않았다는 점을 명심하십시오. 그럼에도 불구하고 생각할 수 있는 거의 모든 사용 사례에서 여전히 높은 성능을 제공할 수 있습니다.

팁 #1: Apache를 항상 최신 버전으로 업데이트하세요.

최신 버전의 Apache를 설치하는 것은 아마도 가장 먼저 고려해야 할 사항 중 하나일 것입니다. 2015년 11월 19일 현재, CentOS 7 저장소에서 사용할 수 있는 최신 Apache 버전은 2.4.6인 반면, Debian 저장소에서는 >2.4.10.

그러나 새로 출시된 안정 버전에 최근 개선 사항이나 버그 수정 사항이 추가되어 소스에서 다운로드하고 설치할 수 있게 되었습니다. 컴파일 및 설치 지침도 여기에 제공됩니다. 이 업데이트 방법을 선택하는 경우 예방 조치로 현재 구성 파일/사이트/가상 호스트를 백업할 수 있다는 점을 기억하세요.

어떤 경우에도 다음과 같이 현재 설치된 버전을 확인할 수 있습니다.

httpd -v               [On RedHat/CentOS based systems]
apache2 –v             [On Debian/Ubuntu based systems] 

경험상 선택한 배포판의 패키지 관리자가 제공하는 업데이트 방법(CentOS 또는 Debian의 경우 yum update httpd 또는 aptitude safe-upgrade apache2)을 따르세요. 각각) 다른 방법이 없는 한. Apache HTTP 서버 프로젝트 웹 사이트의 Apache 설명서 섹션에서 최신 릴리스 정보를 읽을 수 있습니다.

팁 #2: 2.4보다 오래된 커널을 사용하고 있다면 지금 업그레이드하는 것을 고려해 보세요.

왜? 커널 버전 2.4 이상에서는 기본적으로 sendfile 커널 시스템 호출이 활성화되어 있습니다. 이는 결과적으로 고성능 네트워크 파일 전송(웹 서버-클라이언트 통신에 필요한)을 촉진하고 Apache가 읽기 및 보내기 작업을 동시에 수행하여 CPU 사용률을 낮추고 더 빠르게 정적 콘텐츠를 전달할 수 있게 해줍니다.

다음을 사용하여 현재 설치된 커널을 볼 수 있습니다.

uname -r

그리고 이를 www.kernel.org(이 글을 쓰는 시점의 4.3)에 있는 최신 안정 커널과 비교해 보세요.

비록 초보자를 위한 프로세스는 아니지만 커널을 업그레이드하는 것은 Linux 내부에 대해 더 많이 배울 수 있는 흥미로운 연습입니다.

팁 #3: 귀하의 사례에 가장 적합한 다중 처리 모듈(MPM)을 선택하세요

실제로 MPM은 시스템의 네트워크 포트에 바인딩하고 클라이언트의 요청을 수락하고 하위 프로세스(및 스레드, 또는) 그러한 요청을 처리합니다.

버전 2.4부터 Apache는 필요에 따라 선택할 수 있는 세 가지 MPM을 제공합니다.

  1. prefork MPM은 스레딩 없이 여러 하위 프로세스를 사용합니다. 각 프로세스는 각각에 대해 별도의 스레드를 생성하지 않고 한 번에 하나의 연결을 처리합니다. 너무 자세히 설명하지 않고, mod_php와 같은 스레드로부터 안전하지 않은 모듈을 사용하는 애플리케이션을 디버깅하거나 애플리케이션이 처리해야 하는 경우에만 이 MPM을 사용하고 싶다고 말할 수 있습니다.
  2. worker MPM은 하위 프로세스당 여러 스레드를 사용하며, 각 스레드는 한 번에 하나의 연결을 처리합니다. 이는 이전 경우보다 더 적은 RAM으로 더 많은 동시 연결을 처리할 수 있으므로 트래픽이 많은 서버에 적합한 선택입니다.
  3. 마지막으로 event MPM은 버전 2.4 이상에 대한 대부분의 Apache 설치에서 기본 MPM입니다. 이는 하위 프로세스당 여러 스레드를 생성한다는 점에서 작업자 MPM과 유사하지만 장점이 있습니다. KeepAlive 또는 idle 연결을 발생시킵니다(해당 상태를 유지하는 동안). 단일 스레드에 의해 처리되므로 다른 스레드에 할당할 수 있는 메모리가 확보됩니다. 이 MPM은 mod_php와 같은 스레드로부터 안전하지 않은 모듈과 함께 사용하기에 적합하지 않으며 대신 PHP-FPM과 같은 대체 모듈을 사용해야 합니다.

Apache 설치에 사용된 MPM을 확인하려면 다음을 수행하세요.

httpd -V

아래 이미지는 이 특정 웹 서버가 prefork MPM을 사용하고 있음을 보여줍니다.

이를 변경하려면 다음을 편집해야 합니다.

/etc/httpd/conf.modules.d/00-mpm.conf          [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load   [On Debian/Ubuntu based systems]

여기서 mpm_event, mpm_worker 또는 mpm_prefork일 수 있습니다.

다음과 같이 원하는 모듈을 로드하는 줄의 주석 처리를 제거합니다.

LoadModule mpm_event_module modules/mod_mpm_event.so

참고: Debian에서 이벤트 MPM이 작동하도록 하려면 무료가 아닌 패키지에서 libapache2-mod-fastcgi 패키지를 설치해야 할 수도 있습니다. 저장소.

또한 CentOS의 경우 php-fpm(fcgimod_fcgid과 함께)이 필요하지만 Debian에서는 php5-fpm<이라고 합니다. (apache2-mpm-event와 함께).

마지막으로 웹 서버와 새로 설치된 php-fpm(또는 php5-fpm) 서비스를 다시 시작하세요.

RedHat/CentOS에서

systemctl restart httpd php-fpm && systemctl enable httpd php-fpm

데비안/우분투에서

systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm

특정 MPM을 사용하도록 Apache를 설정할 수 있지만 해당 구성은 앞에서 설명한 것과 동일한 방식으로 가상 호스트별로 재정의될 수 있습니다.

각 가상 호스트의 구성 파일에 해당 태그를 추가하기만 하면 준비가 완료됩니다. 단, 가상 호스트당 하나의 MPM만 사용하고 있는지 확인하세요.

마지막으로, 선택한 배포판에 관계없이 php-fpmFastCGI 구현에 의존한다는 점에 유의하세요. 이것이 제가 앞서 추가 패키지 설치를 권장한 이유입니다.

php-fpm에 대한 자세한 내용과 예, 그리고 이벤트 MPM과 함께 Apache의 성능을 향상시키는 방법에 대해서는 공식 문서를 참조하세요.

이전 이미지에 표시된 동일한 상자에서 기본 MPM을 프리포크에서 이벤트로 변경한 후 표시되는 내용은 다음과 같습니다.

CentOS 7에서는 httphttps 서비스가 방화벽을 통해 활성화되고 네트워크 인터페이스가 활성화되어 있는지 확인해야 합니다. )이 기본 영역에 올바르게 추가되었습니다.

예를 들어:

firewall-cmd --zone=internal --add-interface=tun6to4 
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent 
firewall-cmd --set-default-zone=internal 
firewall-cmd --add-service=http 
firewall-cmd --add-service=https 
firewall-cmd --add-service=http --permanent 
firewall-cmd --add-service=https --permanent 
firewall-cmd --reload

제가 이 문제를 언급하는 이유는 최근 클라우드 VPS의 기본 방화벽 구성 설정으로 인해 php-fpm 및 Apache가 PHP 파일을 처리하지 못하는 문제를 경험했기 때문입니다.

기본적인 테스트(더 복잡하거나 스트레스가 많은 테스트를 생각할 수 있을 것입니다)로 두 CentOS의 동일한 디렉토리에 test.php라는 다른 파일이 있는지 확인하는 php 파일을 생성하겠습니다. 하드웨어 특성과 로드는 동일하지만 MPM이 다른 7개의 서버. 그 중 하나는 이벤트를 사용하고 다른 하나는 프리포크를 사용합니다.

이것은 checkiffileexists.php라는 파일에 저장한 PHP 코드입니다.

<?php
$filename = 'test.php';

if (file_exists($filename)) {
    echo "The file $filename exists";
} else {
    echo "The file $filename does not exist";
}
?>

그런 다음 2000개의 요청이 완료될 때까지 200개의 동시 요청으로 Apache 벤치마크 도구(ab)를 실행합니다.

ab -k -c 100 -n 2000 localhost/checkiffileexists.php

테스트를 실행하고 결과를 비교해 보겠습니다. 성능 통계에 주의하세요.

보시다시피 이벤트가 있는 서버의 성능은 이 테스트의 모든 측면에서 프리포크 서버보다 훨씬 뛰어납니다.

팁 #4: Apache에 RAM을 현명하게 할당하세요

아마도 고려해야 할 가장 중요한 하드웨어 항목은 각 Apache 프로세스에 할당된 RAM의 양일 것입니다. 이를 직접 제어할 수는 없지만 MaxRequestWorkers 지시문(이전 Apache 2.2에서는 MaxClients로 알려짐)을 통해 하위 프로세스 수를 제한할 수 있습니다. Apache의 RAM 사용량이 제한됩니다. 다시 말하지만, 호스트별 또는 가상 호스트별로 이 값을 설정할 수 있습니다.

이렇게 하려면 Apache에서 사용하는 평균 RAM 양을 기록한 다음 여기에 MaxRequestWorkers 수를 곱해야 합니다. 이것이 Apache 프로세스에 할당될 메모리 양입니다. 웹 서버에서 절대 원하지 않는 일 중 하나는 스왑을 사용하는 것입니다. 스왑을 사용하면 성능이 크게 저하됩니다. 따라서 항상 Apache의 RAM 사용량을 감당할 수 있는 한도 내에서 유지해야 하며 절대로 스왑에 의존해서는 안 됩니다.

예를 들어 다음 블록은 동시 클라이언트 수를 30으로 제한합니다. 더 많은 클라이언트가 호스트에 도달하면 브라우저를 새로 고치면 쉽게 해결할 수 있는 지연이나 일시적인 오류가 발생할 수 있습니다. 이는 바람직하지 않은 것으로 간주될 수 있지만 서버에는 더 건강하고 장기적으로는 사이트에도 가장 좋습니다.

CentOS를 사용하는지, Debian을 사용하는지에 따라 이 블록을 /etc/httpd/conf/httpd.conf 또는 /etc/apache2/apache2.conf 안에 배치할 수 있습니다.

모든 MPM에는 동일한 원칙이 적용됩니다. 여기서는 이전 팁에 설명된 개념을 계속하기 위해 이벤트를 사용하고 있습니다.

<IfModule mpm_event_module>
    StartServers 3
    MinSpareThreads          25
    MaxSpareThreads          75
    ThreadLimit                      64
    ThreadsPerChild          25
    MaxRequestWorkers    30
    MaxConnectionsPerChild    1000
</IfModule>

어떤 경우든 선택한 MPM에 어떤 지시문이 허용되는지 확인하려면 Apache 2.4 문서를 참조하는 것이 좋습니다.

팁 #5: 애플리케이션을 파악하세요

경험상, 애플리케이션이 작동하는 데 반드시 필요하지 않은 Apache 모듈은 로드하면 안 됩니다. 이를 위해서는 서버에서 실행되는 애플리케이션에 대한 최소한의 전반적인 지식이 필요합니다. 특히 귀하가 시스템 관리자이고 개발을 담당하는 다른 팀이 있는 경우에는 더욱 그렇습니다.

다음을 사용하여 현재 로드된 모듈을 나열할 수 있습니다.

httpd -M          [On RedHat/CentOS based systems]
apache2ctl -M     [On Debian/Ubuntu based systems]

CentOS에서 모듈을 언로드/비활성화하려면 LoadModule로 시작하는 줄을 주석 처리해야 합니다(기본 구성 파일 또는 내부의 보조 파일에서). /etc/httpd/conf.modules.d.

반면 Debian은 모듈을 비활성화하는 a2dismod라는 도구를 제공하며 다음과 같이 사용됩니다.

a2dismod module_name

다시 활성화하려면:

a2enmod module_name

두 경우 모두 변경 사항을 적용하려면 Apache를 다시 시작해야 합니다.

요약

이 문서에서는 Apache 웹 서버를 조정하고 성능을 높이는 데 도움이 되는 5가지 팁을 검토했습니다. 또한 보안이 없는 최적화와 성능은 무의미하다는 점을 기억해야 합니다. 따라서 웹 서버 성능을 향상시키기 위한 mod_pagespeed 설치와 linux-console.net의 Apache 강화 팁 기사도 참조하는 것이 좋습니다.

이 글에서는 이 주제의 모든 측면을 적절하게 다룰 수 없기 때문에 아마도 커뮤니티의 다른 사람들과 공유하고 싶은 다른 아이디어를 생각하게 될 것입니다. 그렇다면 아래의 의견 양식을 사용하여 알려주십시오.