웹사이트 검색

Apache 웹 서버 성능을 최적화하는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 Ubuntu 버전에 대해 설명합니다. 현재 Ubuntu 12.04를 실행하는 서버를 운영 중인 경우 지원되는 Ubuntu 버전으로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

  • Ubuntu 14.04로 업그레이드합니다.
  • Ubuntu 14.04에서 Ubuntu 16.04로 업그레이드
  • 서버 데이터를 지원되는 버전으로 마이그레이션

이유:

대신 참조:

소개

Apache는 놀랍도록 강력하고 유능한 웹 서버입니다. 초기 설정을 가능한 한 쉽게 하기 위해 수많은 모듈이 미리 설치되어 제공됩니다. 따라서 신속하게 생산성을 높여야 하는 경우 새 프로젝트에 적합합니다. 그러나 사이트가 커짐에 따라 성능 문제에 부딪히기 시작할 수 있습니다.

저를 DigitalOcean에 처음 매료시킨 것은 저렴한 시작 비용이었습니다. 가장 작고 가장 저렴한 드롭릿에는 512MB의 RAM이 있는데, 이는 오늘날의 대형 프레임워크 세계에서는 그리 많지 않은 것 같습니다. 그러나 설정을 조정하는 데 약간의 시간이 걸리면 이와 같은 작은 서버로 무엇을 할 수 있는지 놀라게 될 것입니다.

더 작은 크기의 드롭릿 중 하나에서 Apache를 실행 중이거나 더 큰 드롭릿에서 성능을 최대화하려는 경우 다음 몇 가지 작업을 수행해야 합니다. 예제에서는 Ubuntu 12.04를 사용하지만 시연하려는 원칙은 다른 버전의 Linux에도 적용할 수 있습니다.

불필요한 모듈 언로드

Ubuntu 및 Debian 기반 시스템에서는 /etc/apache2/mods-enabled라는 폴더와 /etc/apache2/mods-available/라는 폴더가 표시됩니다. mods-available 폴더는 특정 서버에 설치된 모든 모듈의 목록이고 mods-enabled는 현재 활성화된 모듈입니다.

내 VPS에는 기본적으로 17개의 모듈이 활성화되어 있습니다. 이것은 너무 많고 내 응용 프로그램에 대부분 필요하지 않습니다. 안타깝게도 일부 모듈은 다른 모듈의 종속성이므로 필요한 모듈이 명확하지 않을 수 있습니다.

내가 제안하는 것은 현재 활성화된 모든 모듈의 목록을 만들고 다시 되돌려야 할 경우를 대비하여 나중에 참조할 수 있도록 저장하는 것입니다. 그런 다음 모듈을 하나씩 비활성화하고 각 변경 후 Apache를 다시 시작하여 오류가 발생하는지 확인하십시오.

Ubuntu 및 Debian에서는 다음 명령을 사용하여 모듈을 비활성화합니다(예: autoindex 사용).

sudo a2dismod autoindex

특히 리소스가 부족하여 필요하지 않은 경우 비활성화해야 하는 일부 모듈은 다음과 같습니다.

  • PHP
  • SSL
  • 재작성
  • 파이썬
  • 랙/루비/패신저

이러한 모듈 중 일부는 기본적으로 활성화되어 있지 않으므로 활성화하지 않았을 수 있으며 경우에 따라 실제로 필요하기 때문에 활성화됩니다.

"재작성\에 대한 간단한 참고 사항: 종종 이 모듈은 "alias\ 모듈이 실제로 똑같이 잘 작동할 때 활성화됩니다. 별칭으로 얻을 수 있으면 다시 쓰기를 비활성화하십시오. Rewrite는 더 부담스러운 모듈 중 하나이지만 Apache에 몇 가지 놀라운 기능을 부여하기도 합니다.

"재작성\에서 "별칭\으로 전환하는 것은 고급 주제입니다(일부 유용한 문서 포함). 그러나 재작성을 완전히 끌 수는 없지만 일부 재작성 규칙을 별칭으로 변환할 수는 이점을 얻게 됩니다.

모듈을 비활성화하고 Apache 구성을 다시 로드한 후 Apache 오류 로그에서 메시지를 확인할 수 있습니다. Ubuntu 및 Debian에서는 /var/log/apache2/error.log를 확인합니다.

다음과 같은 오류가 발생합니다.

Syntax error on line 6 of /etc/apache2/sites-enabled/site1:
Invalid command 'DAVLockDB', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.

즉, 방금 비활성화한 모듈이 필요했습니다. 이 경우 모듈은 dav_fs이므로 다음과 같이 다시 활성화합니다.

sudo a2enmod dav_fs

그런 다음 Apache를 다시 시작하고 다음 오류를 찾았습니다. 최소 목록을 정리하려면 여러 번 시도해야 할 수 있습니다. 인내심을 가지십시오. 그만한 가치가 있습니다.

Apache에서 코드 이동

PHP 사이트를 운영하고 있다면 유명한 mod_php를 사용하고 있을 가능성이 높습니다. 루비 사이트를 운영하고 있다면 쉬운 해결책은 mod_rails 또는 mod_rack으로 알려진 Passenger Phusion입니다.

이것의 문제는 해당 언어의 인터프리터에 대한 C 코드가 Apache에 내장되어 있어 모든 페이지 보기에서 더 많은 메모리를 사용한다는 것입니다. 사이트에서 인기 있는 페이지가 30개의 HTTP 요청을 발생시키는 경우 그 중 하나는 동적 페이지에 대한 것이고 나머지 29개는 이미지, css 및 자바스크립트와 같은 정적 리소스에 대한 것일 수 있습니다. 동적 콘텐츠를 제공하지 않는 29개의 요청에 비대한 Apache를 사용하는 이유는 무엇입니까?

그 차이는 극적일 수 있습니다. mod_php를 활성화하면 Apache 자식 프로세스당 100MB 이상의 RAM 사용량을 사용할 수 있습니다! 기본적으로 Apache 서버에 25개 이상의 프로세스가 실행될 수 있다는 점을 고려하면 이것이 문제가 될 수 있는 이유를 알 수 있습니다.

이를 위해 사용할 수 있는 몇 가지 도구는 다음과 같습니다.

  • PHP는 fastcgi 프로토콜을 사용하는 별도의 프로세스인 php-fpm의 이점을 누릴 수 있습니다.\n
  • Python의 경우 여기 DigitalOcean에서 이 훌륭한 기사를 사용하십시오.\n
  • Rails의 경우 여기 DigitalOcean Covering Unicorn에 대한 이 기사를 사용하십시오.\n

이 변경의 단점은 초기에 작업을 수행하기가 더 어렵다는 것입니다. 어떤 경우에는 문서가 매우 좋습니다. 다른 경우 cough php-fpm cough 문서가 희박합니다.

일반적으로 PHP, Python 또는 Ruby용 특수 서버 프로세스가 시작된 다음 Apache는 내장 코드를 통해 이러한 요청을 처리하는 방법을 본능적으로 아는 대신 동적 콘텐츠에 대한 호출을 이 백엔드 프로세스로 전달합니다.

이것이 얼마나 큰 차이를 만드는지 놀랄 것입니다. 내 가상 서버에서 mod_php를 제거한 후 내 Apache 프로세스의 크기는 각각 90-120MB에서 10MB 미만으로 줄었습니다. 각각 60MB만 사용하는 두 개의 PHP 백엔드 프로세스로 모든 동적 콘텐츠를 제공할 수 있었습니다.

Apache 프로세스 및 하위 수 제한

대부분의 운영 체제의 기본 Apache 구성은 소규모 서버에 적합하지 않습니다. 25개 이상의 하위 프로세스가 일반적입니다. 각 Apache 하위 프로세스가 120MB의 RAM을 사용하는 경우 VPS에는 Apache에만 3GB가 필요합니다.

한 방문자의 웹 브라우저는 한 번에 웹 사이트에서 4개의 항목을 요청할 수 있으므로 7~8명이 동시에 페이지를 로드하려고 하면 클라우드 서버가 과부하될 수 있습니다. 이로 인해 웹 페이지가 영원처럼 보이는 동안 지속적으로 로드되는 상태로 정지하게 됩니다.

서버는 이러한 죽은 Apache 프로세스를 활성 상태로 유지하고 사용자가 포기한 후에도 오랫동안 콘텐츠를 제공하려고 시도하므로 사용자에게 서비스를 제공할 수 있는 프로세스 수가 줄어들고 사용 가능한 시스템 RAM의 양이 줄어듭니다. 이로 인해 귀하와 귀하의 사이트 방문자 모두에게 나쁜 경험으로 끝나는 일반적으로 알려진 하향 나선형이 발생합니다.

당신이 해야 할 일은 애플리케이션에 필요한 RAM의 양을 파악한 다음 남은 양을 파악하고 대부분을 Apache에 할당하는 것입니다.

예를 들어 동적 콘텐츠를 처리하는 3개의 php-fpm 프로세스가 있고 각각 최대 70MB의 RAM을 사용할 수 있고 MySQL 서버는 최대 120MB의 RAM을 사용할 수 있으므로 애플리케이션에서 총 330MB를 사용합니다. 이를 통해 Apache에 약 150MB를 할당할 수 있습니다.

Apache가 실행되는 동안 서버에서 top 명령을 엽니다. 관련되지 않은 대부분의 줄을 잘라내어 표시되는 내용을 약간 붙여넣겠습니다.

top -bn 1
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                    
[...]
15015 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    
15016 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.01 apache2                    
15017 www-data  20   0  232m 9644 1900 S  0.0  1.6   0:00.02 apache2                    

Apache 하위 프로세스의 RES 열을 확인하고 해당 RES 값을 기록해 둡니다. 예를 들어, 최적화가 잘 된 내 가상 서버에서 값은 9,644이며 이는 10MB의 RAM을 사용하지 않는다는 의미입니다. Apache를 최대 15개의 자식 프로세스로 제한하면 약 150MB의 RAM이 최대가 되어야 합니다.

Ubuntu 및 Debian에서 /etc/apache2/apache2.conf인 클라우드 서버의 apache 구성 파일을 편집하고 mpm_prefork_module 구성 섹션을 찾습니다. MaxClients 줄을 찾아 15로 설정한 다음 Apache를 저장하고 다시 시작합니다.

다음은 Ubuntu에서 찾을 내용의 예입니다.

<IfModule mpm_prefork_module>
    StartServers          3
    MinSpareServers       3
    MaxSpareServers       5
    MaxClients           30
    MaxRequestsPerChild   0
</IfModule>

거기에 MaxClients 라인이 보입니까? 그 값을 더 낮은 숫자로 변경해야 합니다.

VPS가 과부하되고 한 번에 서비스할 수 있는 최대 클라이언트 수에 도달하면 해당 서비스를 제공하고 다른 사용자는 빠른 실패를 겪게 됩니다. 그런 다음 페이지를 다시 로드하고 두 번째 시도에서 더 큰 성공을 거둘 수 있습니다.

나쁘게 들리겠지만, 이러한 연결을 빨리 닫고 서버를 계속 열어두는 것보다 건강한 상태로 유지하는 것이 훨씬 낫습니다. 놀랍게도 처리할 수 없는 자식 프로세스가 많은 서버보다 자식 프로세스가 적지만 응답 속도가 빠른 서버에서 더 나은 성능을 얻을 수 있습니다.

예를 들어 내가 관리하는 Wordpress 사이트는 4개의 php-fpm 프로세스를 사용하여 1GB 드롭릿에서 호스팅되며 한 번에 950명 이상의 동시 사용자에게 서비스를 제공할 수 있습니다. 이것은 이 웹사이트가 충분히 인기를 끌면 하루에 약 4,200만 페이지 뷰의 최대 용량으로 변환됩니다!

대체 MPM 구성 고려

대부분의 Apache 구성은 역사적으로 prefork mpm을 사용했습니다. 이는 스레드로부터 안전하므로 PHP 및 기타 임베디드 언어와 함께 사용하기에 적합합니다.

PHP 또는 Rails와 같은 외부 모듈을 제거하는 경우 종종 프리포크보다 빠른 작업자 MPM을 고려할 수 있습니다.

작업자 모듈을 활성화하려면 설치해야 합니다.

sudo apt-get install apache2-mpm-worker

그러면 다음과 같은 메시지가 표시됩니다.

The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5
The following NEW packages will be installed:
  apache2-mpm-worker
0 upgraded, 1 newly installed, 2 to remove and 2 not upgraded.
Need to get 2,284 B of archives.
After this operation, 8,718 kB disk space will be freed.
Do you want to continue [Y/n]? 

Ubuntu에서 작업자 mpm을 설치하면 prefork mpm이 제거되고 mod_php 및 기타 호환되지 않는 애드온 모듈이 제거됩니다.

여기서 우리는 작은 방울이 있더라도 애플리케이션 성능을 크게 향상시켜야 하는 Apache에 대해 수행할 수 있는 네 가지 최적화에 대해 논의했습니다.

프로덕션 서버가 아닌 테스트 드롭릿에서 시도해 볼 것을 강력히 제안합니다. DigitalOcean 서비스의 장점은 변경 사항을 테스트하는 데 필요한 시간 동안 새 물방울을 가동하고 완료되면 종료할 수 있다는 것입니다. 시간당 청구를 통해 VPS에 대한 완벽한 구성을 찾을 수 있는 저위험 저비용 방법입니다.

제출자: Matthew Nuzum