Apache 웹서버 성능 향상(최적화)을 위해 손봐야할 설정

Apache 웹 서버의 성능 최적화는 효과적인 웹 애플리케이션 운영을 위해 필수적인 요소입니다. 이를 달성하기 위해서는 서버 환경, 애플리케이션 특성, 트래픽 유형 등을 고려한 맞춤형 접근이 필요하며, 다양한 방법을 조합하여 최적의 상태를 구축하는 것이 중요합니다. 아래는 Apache의 성능을 향상시키기 위해 적용할 수 있는 주요 기술과 설정 방안을 항목별로 정리한 내용입니다.

 

Apache 웹서서 성능 최적화
apache 성능 튜닝

 

1. Apache 설정 최적화

 

Apache 웹서버 환경 설정을 미세 조정하면 서버의 처리 속도와 효율성을 크게 향상시킬 수 있습니다. 이와 같은 환경 설정을 하고 안하고에 따라 실제 접속자가 느끼는 체감 속도는 큰 차이가 날수 있습니다. 제 경우도 동시접속자수가 많을때 본문 내용에서 설명드리는 아파치 환경설정 튜닝을 통해 큰 효과를 본 경험이 많습니다.

 

유의해야할 사항은 실제 프로덕션 서비스에서 테스트하지 마시고 가급적이면 개발서버에서 먼저 테스트를 진행해본 후 실제 서비스 환경에 적용하시길 당부드립니다. 이유는 실제 서비스 웹서버에 바로 적용시 서비스 장애등 다양한 부분에서 영향을 받을수 있기 때문입니다.

 

KeepAlive 설정 최적화
– KeepAlive 기능을 활성화(On)하여 클라이언트와의 연결을 재사용할 수 있도록 설정합니다.
– MaxKeepAliveRequests 값을 적절히 조정하여 연결당 처리 가능한 요청 개수를 제한합니다. 일반적으로 100 정도로 설정이 권장됩니다.
– KeepAliveTimeout 값을 지나치게 길지 않게 (예: 2~5초) 설정해 리소스 낭비를 방지합니다.

apache
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

MaxRequestWorkers 조정
– 동시에 처리할 수 있는 최대 요청 수를 서버의 메모리 및 CPU 성능에 맞게 설정합니다.
– ServerLimit과 MaxRequestWorkers 값을 신중하게 조율하여 효율적인 리소스 활용이 가능하도록 합니다.

apache
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
</IfModule>

MPM (Multi-Processing Module) 선택
– 사용 사례에 따라 적합한 MPM 모델을 선택합니다.
– prefork MPM : 응답 속도가 빠르고, 전통적인 PHP 모듈과 호환됩니다.
– worker MPM : 다중 스레드를 활용하며 PHP FastCGI와 같은 시스템과 함께 사용하기 적합합니다.
– event MPM : 최신 Apache 버전에서 지원하며 KeepAlive 성능에 유리합니다.

apache
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
</IfModule>

 

2. 압축 및 캐싱 활용

 

데이터 전송 크기와 로딩 속도를 줄여 사용자 경험을 대폭 개선할 수 있습니다.

Gzip 압축 활성화
– 클라이언트로 전송되는 데이터의 크기를 줄임으로써 네트워크 부하를 감소시키고 로딩 시간을 단축할 수 있습니다.

apache
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

브라우저 캐싱 활성화
– 정적 파일(CSS, JS, 이미지 등)을 캐싱하여 재방문 시 데이터 로드 속도를 높입니다.

apache
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault “access plus 1 month”
ExpiresByType text/html “access plus 1 day”
ExpiresByType image/jpeg “access plus 1 year”
ExpiresByType text/css “access plus 1 month”
ExpiresByType application/javascript “access plus 1 month”
</IfModule>

 

3. 정적 콘텐츠 최적화

 

더 효율적인 콘텐츠 전달을 위해 정적 파일 처리를 최적화해야 합니다.

CDN(Content Delivery Network) 활용
– CSS, JavaScript, 이미지 파일과 같은 정적 리소스는 Apache 대신 Cloudflare, AWS CloudFront, Nginx와 같은 CDN을 통해 제공하면 서버의 부하를 효과적으로 줄일 수 있습니다.

mod_cache 활성화
정적 콘텐츠 캐싱을 통해 Apache 서버의 부담을 줄입니다.

<IfModule mod_cache.c>
CacheEnable disk /
CacheRoot /var/cache/apache2
</IfModule>

 

4. 로그 최적화

불필요한 로그 비활성화
과도한 로그 기록은 성능 저하를 유발할 수 있습니다. 이를 방지하려면 로그 레벨을 적절히 설정하세요.

LogLevel warn

mod_status로 실시간 서버 상태 모니터링
mod_status 모듈을 사용해 서버의 상태를 실시간으로 확인할 수 있습니다. 특정 IP에서만 접근 가능하도록 제한을 두는 것을 권장합니다.

<Location /server-status>
SetHandler server-status
Require ip 192.168.1.100
</Location>

 

5. PHP 및 데이터베이스 최적화

 

PHP-FPM 사용 (FastCGI)
Apache의 `mod_php` 대신 PHP-FPM을 사용하면 더 나은 성능을 얻을 수 있습니다.

MySQL 튜닝
– `innodb_buffer_pool_size` 값을 서버 메모리에 맞게 최적화해 InnoDB 성능을 향상시킵니다.
– 반복적으로 실행되는 쿼리의 성능 개선을 위해 `query_cache_size` 값을 조정합니다.

 

6. 로드 밸런싱 적용

트래픽이 많은 경우 HAProxy, Nginx 리버스 프록시, 또는 Apache `mod_proxy_balancer` 모듈을 사용하여 여러 서버 간 부하를 분산시킬 수 있습니다.

<Proxy balancer://mycluster>
BalancerMember http://192.168.1.101
BalancerMember http://192.168.1.102
</Proxy>

ProxyPass / balancer://mycluster/

 

7. 메모리 및 커널 최적화

 

서버의 네트워크 및 메모리 관리를 위해 `sysctl.conf`와 `ulimit` 값을 조정합니다.

– 커널 네트워크 성능 최적화

sysctl -w net.core.somaxconn=1024

– 파일 핸들 및 프로세스 수 확대

ulimit -n 65535

 

결론 요약

Apache의 성능 최적화는 다음과 같은 요소들을 조합적으로 개선해야 합니다:

1. 설정 튜닝
2. 캐싱 활용
3. PHP-FPM 및 데이터베이스 최적화
4. 로드 밸런싱 도입

특히 최신 서버 환경에서는 event MPM , PHP-FPM , 그리고 CDN 을 함께 사용하는 것이 가장 효율적인 방법으로 평가됩니다.