Apache 모듈 시스템
Apache의 강점 중 하나는 모듈 기반 확장성 입니다. 필요한 기능만 모듈로 활성화하여 사용할 수 있으며, 동적 모듈(DSO)을 사용하면 Apache를 재컴파일하지 않고도 모듈을 추가·제거할 수 있습니다.
모듈 시스템 개요
Apache 모듈은 두 가지 방식으로 포함됩니다.
| 방식 | 설명 | 특징 |
|---|---|---|
| 정적 컴파일 | 컴파일 시 Apache 바이너리에 내장 | 빠름, 변경 불가 |
| 동적 로딩(DSO) | LoadModule로 런타임에 로딩 | 유연함, 필요시 로딩 |
# 현재 로딩된 모듈 목록 확인
apache2ctl -M
# 또는
httpd -M
# 출력 예시:
# core_module (static)
# rewrite_module (shared) ← 동적 모듈
# ssl_module (shared)
Ubuntu의 모듈 관리 명령 (a2enmod / a2dismod)
Ubuntu/Debian은 모듈 활성화·비활성화를 위한 편리한 명령을 제공합니다.
# 모듈 활성화
sudo a2enmod rewrite # mod_rewrite 활성화
sudo a2enmod ssl # mod_ssl 활성화
sudo a2enmod headers # mod_headers 활성화
sudo a2enmod expires # mod_expires 활성화
sudo a2enmod proxy # mod_proxy 활성화
sudo a2enmod proxy_http # mod_proxy_http 활성화
# 모듈 비활성화
sudo a2dismod rewrite
# 활성화 후 반드시 리로드
sudo systemctl reload apache2
# 사용 가능한 모듈 목록
ls /etc/apache2/mods-available/
# 활성화된 모듈 목록
ls /etc/apache2/mods-enabled/
CentOS/RHEL의 모듈 관리
CentOS에서는 /etc/httpd/conf.modules.d/ 디렉터리의 설정 파일에서 모듈을 관리합니다.
# 모듈 설정 디렉터리 확인
ls /etc/httpd/conf.modules.d/
# 00-base.conf
# 00-mpm.conf
# 00-optional.conf
# 00-proxy.conf
# 00-ssl.conf
# /etc/httpd/conf.modules.d/00-optional.conf 예시
# 주석 해제로 모듈 활성화
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so
# LoadModule userdir_module modules/mod_userdir.so ← 비활성화
주요 모듈 목록과 역할
핵심 모듈
| 모듈 | 역할 | 기본 활성화 |
|---|---|---|
mod_core | Apache 핵심 기능 | 항상 |
mod_log_config | 로그 설정 | 예 |
mod_mime | MIME 타입 설정 | 예 |
mod_dir | 디렉터리 인덱스 | 예 |
mod_alias | URL 별칭, 리다이렉트 | 예 |
mod_env | 환경 변수 설정 | 예 |
URL 처리 모듈
| 모듈 | 역할 | 설치 명령 |
|---|---|---|
mod_rewrite | URL 재작성·리다이렉트 | a2enmod rewrite |
mod_alias | Alias, Redirect 지시어 | 기본 활성화 |
mod_redirects | 간단한 리다이렉트 | a2enmod redirects |
프록시 모듈
| 모듈 | 역할 | 설치 명령 |
|---|---|---|
mod_proxy | 기본 프록시 기능 | a2enmod proxy |
mod_proxy_http | HTTP 프록시 | a2enmod proxy_http |
mod_proxy_ajp | AJP 프록시 (Tomcat 연동) | a2enmod proxy_ajp |
mod_proxy_balancer | 로드밸런서 | a2enmod proxy_balancer |
mod_proxy_wstunnel | WebSocket 프록시 | a2enmod proxy_wstunnel |
보안 모듈
| 모듈 | 역할 | 설치 명령 |
|---|---|---|
mod_ssl | HTTPS/TLS 지원 | a2enmod ssl |
mod_auth_basic | HTTP Basic 인증 | a2enmod auth_basic |
mod_auth_digest | HTTP Digest 인증 | a2enmod auth_digest |
mod_authn_file | 파일 기반 인증 | 기본 활성화 |
mod_authz_host | IP 기반 접근 제어 | 기본 활성화 |
mod_headers | HTTP 헤더 조작 | a2enmod headers |
mod_evasive | DDoS 기초 방어 | apt install libapache2-mod-evasive |
성능 모듈
| 모듈 | 역할 | 설치 명령 |
|---|---|---|
mod_deflate | Gzip 압축 | a2enmod deflate |
mod_expires | 캐시 만료 헤더 | a2enmod expires |
mod_cache | 응답 캐싱 | a2enmod cache |
mod_cache_disk | 디스크 캐시 | a2enmod cache_disk |
mod_http2 | HTTP/2 지원 | a2enmod http2 |
콘텐츠 처리 모듈
| 모듈 | 역할 | 설치 명령 |
|---|---|---|
mod_php | PHP 내장 실행 (Prefork MPM) | apt install libapache2-mod-php |
mod_cgi | CGI 스크립트 실행 | a2enmod cgi |
mod_cgid | CGI (Worker/Event MPM) | a2enmod cgid |
mod_fastcgi | FastCGI 지원 | apt install libapache2-mod-fastcgi |
모듈 설정 예제
mod_rewrite — URL 재작성
# VirtualHost 또는 .htaccess에서 사용
RewriteEngine On
# 모든 HTTP를 HTTPS로
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
mod_proxy + mod_proxy_http — 리버스 프록시
# 필요한 모듈 로딩
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ProxyPreserveHost On
# /api/ 요청을 Tomcat으로 프록시
ProxyPass /api/ http://127.0.0.1:8080/api/
ProxyPassReverse /api/ http://127.0.0.1:8080/api/
</VirtualHost>
mod_headers — 보안 헤더
# 필요한 모듈 로딩
LoadModule headers_module modules/mod_headers.so
<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Strict-Transport-Security "max-age=31536000"
</IfModule>
mod_deflate — Gzip 압축
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json
DeflateCompressionLevel 6
</IfModule>
mod_expires — 캐시 만료 헤더
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
</IfModule>
mod_http2 — HTTP/2 활성화
# Apache 2.4.17+, mod_ssl 필요
Protocols h2 http/1.1
<VirtualHost *:443>
ServerName example.com
SSLEngine on
Protocols h2 http/1.1
# ... SSL 설정
</VirtualHost>
모듈 문제 진단
# 특정 모듈 로딩 여부 확인
apache2ctl -M | grep rewrite
# rewrite_module (shared) ← 활성화됨
# (없으면 비활성화)
# 설정 파일에서 모듈 의존성 확인
grep -r "RewriteEngine" /etc/apache2/sites-enabled/
# RewriteEngine 사용하는 사이트에 mod_rewrite 활성화 필요
# 모듈 활성화 안 된 상태에서 사용 시 에러 로그
# Invalid command 'RewriteEngine', perhaps misspelled or defined by a module
# not included in the server configuration
정리
- Ubuntu:
a2enmod 모듈명/a2dismod 모듈명+systemctl reload apache2 - CentOS:
conf.modules.d/파일에서LoadModule주석 해제·추가 - 실무 필수 모듈:
mod_rewrite,mod_ssl,mod_headers,mod_deflate,mod_expires,mod_proxy,mod_proxy_http - 모듈 추가 후 반드시
configtest로 문법 검증 후 리로드