RHEL/CentOS 계열에서 Apache의 패키지·데몬 이름은 모두 httpd다(데비안 계열은 apache2).
# 설치yum install httpd# 데몬 제어systemctl start httpdsystemctl enable httpd # 부팅 시 자동 시작systemctl status httpd# 설정 문법 검사 (재시작 전 필수!)httpd -t # Syntax OK 확인apachectl configtest # 동일# 적용된 가상 호스트 목록 확인httpd -S
경로
역할
/etc/httpd/conf/httpd.conf
메인 설정 파일
/etc/httpd/conf.d/
추가 설정(가상 호스트 등)을 분리해 두는 디렉터리
/etc/httpd/conf.modules.d/
모듈 로드 설정
/var/www/html/
기본 DocumentRoot(웹 문서 루트)
/var/log/httpd/
access_log, error_log
httpd.conf 안의 Include conf.d/*.conf 덕분에 가상 호스트나 추가 설정을 메인 파일에 욱여넣지 않고 conf.d/에 파일로 분리할 수 있다. 메인 설정은 깔끔히 두고 사이트별 설정은 별도 파일로 — 이것이 운영에서 권장되는 구조다. 설정을 고쳤다면 반드시 httpd -t로 문법을 검사한 뒤 재시작해야, 오타 한 줄로 서버 전체가 죽는 사고를 막는다.
Apache 설정의 단위는 지시어(Directive)다. 실기에서 각 지시어의 역할을 단답으로 묻는다.
ServerRoot "/etc/httpd" # Apache 설치 기준 디렉터리Listen 80 # 수신 포트 (443은 HTTPS)ServerName www.example.com:80 # 서버의 정식 이름·포트DocumentRoot "/var/www/html" # 웹 문서가 놓이는 최상위 디렉터리DirectoryIndex index.html index.php # 디렉터리 요청 시 보여 줄 기본 파일ServerAdmin admin@example.com # 오류 페이지에 표시될 관리자 메일User apache # 데몬이 동작할 사용자Group apache # 데몬이 동작할 그룹ErrorLog "logs/error_log" # 오류 로그 경로CustomLog "logs/access_log" combined # 접근 로그 경로·형식LogLevel warn # 로그 기록 수준
지시어
역할
Listen
Apache가 대기할 포트(기본 80, HTTPS 443)
ServerName
서버의 정식 호스트명. 가상 호스트 매칭에 사용
DocumentRoot
URL 루트(/)에 대응하는 실제 파일 경로
DirectoryIndex
디렉터리만 요청했을 때 보여 줄 기본 문서
ServerRoot
설정·로그·모듈의 기준 경로
User / Group
보안을 위해 root가 아닌 전용 계정으로 동작
LogLevel
로그 상세도(debug/info/warn/error 등)
Apache는 root 권한으로 시작해 80번 포트(1024 미만은 root만 바인딩 가능)를 연 뒤, 실제 요청 처리는 권한이 낮은 apache 계정으로 내려가서(privilege drop) 처리한다. 그래서 User apache/Group apache 설정이 보안의 핵심이다 — 혹시 웹 애플리케이션이 뚫려도 root가 아닌 제한된 계정으로만 동작하므로 피해 범위가 줄어든다. User root로 두는 것은 심각한 보안 실수다.
<Directory "/var/www/html"> Options Indexes FollowSymLinks # 디렉터리 기능 옵션 AllowOverride None # .htaccess 허용 범위 Require all granted # 접근 허용(2.4 문법)</Directory>
지시어
역할
Options Indexes
index 파일 없을 때 파일 목록 자동 표시
Options FollowSymLinks
심볼릭 링크를 따라가도록 허용
AllowOverride
해당 디렉터리에서 .htaccess 파일로 설정 재정의 허용 범위
Require all granted
모든 접근 허용 (Apache 2.4)
Require all denied
모든 접근 차단
⚠️ 함정: Apache 2.2와 2.4는 접근 제어 문법이 다르다. 2.2는 Order allow,deny / Allow from / Deny from을, 2.4는 Require all granted / Require ip ...을 쓴다. 또한 Options Indexes를 켜 두면 index.html이 없는 디렉터리의 파일 목록이 그대로 노출되는 보안 문제가 생긴다 — 운영 서버에서는 보통 끈다. AllowOverride None이면 .htaccess가 아예 무시된다는 점도 함정으로 나온다.
이름 기반 가상 호스트가 가능한 이유는 HTTP/1.1부터 요청에 Host 헤더가 필수가 되어, 같은 IP로 들어와도 "어느 도메인을 원하는지"가 요청 안에 담기기 때문이다. 이 덕분에 IP 하나로 수백 개 사이트를 돌릴 수 있다. 만약 도메인과 무관하게 들어온 요청(매칭되는 ServerName 없음)은 첫 번째로 정의된 VirtualHost가 기본으로 처리한다.
초창기 웹(HTTP/1.0)에는 Host 헤더가 없어서, 서로 다른 사이트를 같은 서버에서 돌리려면 사이트마다 공인 IP를 따로 사 줘야 했다(IP 기반). IPv4 주소가 고갈되기 시작하면서 이는 큰 낭비였고, HTTP/1.1이 Host 헤더를 의무화하며 이름 기반 가상 호스트가 표준이 됐다. 오늘날 클라우드에서 도메인 하나당 IP를 사지 않고도 무수한 사이트를 운영할 수 있는 것이 이 변화의 결과다.
Apache의 동작 모델은 MPM(Multi-Processing Module)으로 결정된다. prefork는 요청마다 프로세스를 띄워 안정적이지만 메모리를 많이 쓰고(전통적 PHP 환경), worker/event는 스레드를 써서 동시 접속에 효율적이다. 한 서버에 동시 접속이 많아 메모리가 부족하다면 MPM 선택과 MaxRequestWorkers 같은 한계값 조정이 튜닝의 출발점이 된다.
# 접근 로그: 누가 무엇을 요청했는가tail -f /var/log/httpd/access_log# 예: 192.168.1.5 - - [05/Jun/2026:10:00:00] "GET /index.html HTTP/1.1" 200 1024# 오류 로그: 무엇이 잘못됐는가tail -f /var/log/httpd/error_log
access_log의 combined 형식은 클라이언트 IP, 시각, 요청 줄, 응답 상태 코드, 전송 바이트, 리퍼러, 브라우저 정보를 담는다.
상태 코드만 봐도 정상(2xx)·리다이렉트(3xx)·클라이언트 오류(4xx)·서버 오류(5xx)를 가를 수 있다.
⚠️ 함정: CustomLog(또는 access_log)는 모든 요청을 기록하고, ErrorLog는 오류·진단 메시지를 기록한다. 둘을 혼동해 "404가 access_log가 아닌 error_log에만 남는다"는 식의 보기는 틀린다 — 404 같은 응답 코드는 access_log에 상태 코드로 남고, 설정 오류·모듈 실패 등은 error_log에 남는다.
# 1. 기본 페이지 만들기echo "<h1>Hello Apache</h1>" > /var/www/html/index.html# 2. 설정 문법 검사 후 시작httpd -tsystemctl restart httpd# 3. 로컬에서 응답 확인curl http://localhost/curl -I http://localhost/ # 헤더만(상태 코드 확인)# 4. 가상 호스트 매칭 점검httpd -S # 정의된 VirtualHost 목록# 5. 로그 실시간 관찰tail -f /var/log/httpd/access_log
curl -I로 받은 첫 줄 HTTP/1.1 200 OK가 보이면 정상이다.
가상 호스트 테스트는 curl -H "Host: www.site-a.com" http://localhost/처럼 Host 헤더를 지정해 어느 사이트가 응답하는지 확인한다.
내일은 또 다른 웹 서버의 강자 Nginx로 넘어가, 이벤트 기반 구조와 리버스 프록시, 그리고 Apache와의 비교를 다룬다.