Apache HTTP Server 개념과 특징
Apache HTTP Server(httpd)의 역할, 요청 처리 방식, process/thread worker, 설정 구조와 점검 명령을 정리한다.
Apache httpd가 담당하는 구간
Client
-> Apache HTTP Server
-> WAS / Application
Apache HTTP Server는 클라이언트 요청을 먼저 받는 Web Server다. 정적 파일을 직접 응답하거나, 뒤쪽 Tomcat 같은 WAS로 요청을 전달한다.
핵심 역할
Apache HTTP Server는 모듈 기반으로 동작하는 범용 Web Server이며, 운영에서는 httpd라고도 부른다.
Apache의 특징
| 특징 | 설명 |
|---|---|
| 모듈 기반 | 필요한 기능을 mod_ssl, mod_proxy, mod_rewrite 같은 모듈로 붙인다 |
| 정적 파일 처리 | 이미지, HTML, CSS, JS 같은 정적 파일을 직접 응답할 수 있다 |
| VirtualHost | 하나의 서버에서 여러 도메인이나 사이트를 나누어 운영할 수 있다 |
| Reverse Proxy | 뒤쪽 Tomcat, API 서버, 다른 Web Server로 요청을 전달할 수 있다 |
| process/thread worker | MPM에 따라 프로세스와 스레드로 동시 요청을 처리한다 |
Apache HTTP Server를 볼 때는 “요청을 어디서 받고, 어떤 규칙으로 응답하거나 넘기는가”를 먼저 본다. 성능이나 동시 접속 문제는 설정 파일만 보는 것이 아니라 MPM, KeepAlive, backend WAS 상태까지 함께 봐야 한다.
접속자, 세션, connection 구분
“접속자 한 명당 세션 하나”라고 생각하면 Apache 역할을 오해하기 쉽다. Apache HTTP Server 관점의 기본 단위는 사용자 세션이 아니라 HTTP request, TCP connection, worker process/thread다.
| 용어 | Apache에서 보는 의미 |
|---|---|
| request | 클라이언트가 보낸 HTTP 요청 하나 |
| connection | 클라이언트와 Apache 사이의 TCP 연결 |
| KeepAlive | 한 connection에서 여러 request를 이어서 처리하도록 유지하는 기능 |
| worker | 요청이나 연결을 처리하는 process/thread |
| session | 로그인 상태 같은 애플리케이션 상태. 보통 Tomcat/Application/Redis/Cookie 쪽 문제 |
오래된 prefork MPM에서는 child process 하나가 한 connection을 처리하므로 “접속자마다 프로세스가 붙는다”처럼
보일 수 있다. 하지만 정확히는 사용자 세션이 아니라 connection과 worker 처리 모델의 문제다.
worker와 event MPM은 스레드와 이벤트 처리 방식이 섞이므로 동시 접속을 보는 관점이 달라진다.
왜 따로 보는가
Apache HTTP Server와 Apache Tomcat은 이름이 비슷하지만 역할이 다르다. Apache HTTP Server는 HTTP 요청을 받고 라우팅하는 Web Server고, Apache Tomcat은 Java 웹 애플리케이션을 실행하는 WAS다.
운영 대화에서 “Apache”라고만 말하면 보통 Apache HTTP Server를 뜻하는 경우가 많다. 그래서 Tomcat과
구분해서 httpd라고 부르면 오해가 줄어든다.
설정 구조
| 구성 | 역할 |
|---|---|
| 전역 설정 | 포트, 사용자, 모듈, 로그 형식 등 서버 전체 설정 |
| Module | mod_ssl, mod_proxy, mod_rewrite처럼 기능을 추가하는 단위 |
| VirtualHost | 도메인이나 포트 단위로 사이트를 나누는 설정 |
| Directory | 파일 시스템 경로에 대한 접근 제어 |
| Location | URL 경로에 대한 처리 규칙 |
| Log | access log, error log로 요청과 오류를 기록 |
Apache HTTP Server는 작은 기능을 모듈로 붙여서 만든다. HTTPS가 필요하면 mod_ssl, Tomcat으로
프록시하려면 mod_proxy와 mod_proxy_http, URL 재작성은 mod_rewrite를 확인한다.
주요 파일
| 계열 | 경로 예시 |
|---|---|
| RHEL / CentOS / Rocky | /etc/httpd/conf/httpd.conf, /etc/httpd/conf.d/*.conf |
| Debian / Ubuntu | /etc/apache2/apache2.conf, /etc/apache2/sites-available/, /etc/apache2/sites-enabled/ |
| 로그 | /var/log/httpd/, /var/log/apache2/ |
| 모듈 | /etc/httpd/conf.modules.d/, /etc/apache2/mods-available/ |
배포판마다 파일 경로는 다르지만 보는 순서는 같다. 먼저 Listen, ServerName, Include,
VirtualHost, ErrorLog, CustomLog를 찾는다.
VirtualHost 예시
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
<Directory "/var/www/example">
Require all granted
Options -Indexes
</Directory>
ErrorLog logs/example-error.log
CustomLog logs/example-access.log combined
</VirtualHost>
이 설정은 example.com으로 들어온 HTTP 요청을 /var/www/example 아래 정적 파일로 응답한다.
Tomcat 연동을 붙이면 DocumentRoot만 보는 것이 아니라 ProxyPass, JkMount 같은 전달 규칙도
함께 봐야 한다.
자주 보는 모듈
| 모듈 | 역할 |
|---|---|
mod_ssl | HTTPS 처리 |
mod_proxy | 프록시 공통 기능 |
mod_proxy_http | HTTP upstream 프록시 |
mod_proxy_ajp | AJP upstream 프록시 |
mod_jk | Tomcat AJP 연동용 커넥터 |
mod_headers | 요청/응답 헤더 조작 |
mod_rewrite | URL rewrite, redirect |
mod_status | 서버 상태 확인 |
점검 명령
httpd -t
apachectl configtest
apachectl -M
systemctl status httpd
systemctl status apache2
ss -lntp | grep ':80\|:443'
tail -f /var/log/httpd/error_log
configtest는 문법 오류를 잡고, apachectl -M은 실제 로드된 모듈을 확인한다. 설정 파일에는
ProxyPass가 있는데 mod_proxy_http가 로드되지 않았다면 서비스가 올라오지 않거나 프록시가
동작하지 않는다.
운영에서 보는 포인트
| 포인트 | 확인 질문 |
|---|---|
| 포트 | Listen 80, Listen 443이 의도한 주소에 열려 있는가 |
| 도메인 | ServerName, ServerAlias가 요청 Host와 맞는가 |
| 모듈 | 필요한 모듈이 로드되어 있는가 |
| 프록시 | ProxyPass, ProxyPassReverse 대상이 살아 있는가 |
| 보안 | directory listing, 서버 버전 노출, TLS 설정이 안전한가 |
| 로그 | access log와 error log가 원하는 VirtualHost에 남는가 |
관련 문서
관련 블로그 기록
- Apache 2.4.37 서버 버전 정보 제한 — Apache HTTP Server 보안 설정을 점검한 사례
공식 문서
닫기 전 질문
- 지금 보는 “Apache”는 Apache HTTP Server인가, Apache Tomcat인가?
- 요청은 정적 파일로 끝나는가, WAS로 전달되는가?
- 필요한 모듈은 실제로 로드되어 있는가?
- access log와 error log는 어느 VirtualHost 기준으로 남는가?