CertNote/ 출퇴근 학습 노트
로드맵
KOEN
리눅스마스터 2급 · 2급리눅스마스터 2급
리눅스마스터 1급 · 1급리눅스마스터 1급
  • Week 1
    • 1.운영체제와 리눅스: 커널이 하는 일
    • 2.자유 소프트웨어와 배포판: 라이선스가 만든 생태계
    • 3.설치와 부팅: 전원을 켜는 순간부터
    • 4.파일시스템 구조와 파일의 종류: 모든 것은 파일이다
    • 5.Week 1 종합 복습: 개념을 꿰뚫는 시간
  • Week 2
  • Week 3
  • Week 4
  • Week 5
  • Week 6
  • Week 7
  • Week 8
  • Week 9
    • 1.DNS와 BIND: 이름을 주소로 바꾸는 인터넷의 전화번호부
    • 2.DHCP와 NTP: 주소를 나눠 주고 시계를 맞추는 두 서비스
    • 3.Apache 웹 서버: httpd.conf와 가상 호스트의 모든 것
    • 4.Nginx와 리버스 프록시: 이벤트 기반 웹 서버의 설계
    • 5.Week 9 종합 복습: 이름·주소·시간·웹을 한 장으로
    • 6.데이터베이스 서비스: MySQL/MariaDB 설치부터 백업·복구까지
  • Week 10
  • Week 11
  • Week 12
  • Week 13
  • Week 14
합격 후기

© CertNote · 주간랩스

  • 소개
  • 수정 기록
  • 문의
  • 이용약관
  • 개인정보처리방침
← 리눅스마스터 1급/Week 9/Day 3

기준: 리눅스마스터 1급 출제 기준·오류 제보

리눅스마스터 1급· AssociateWeek 9 · Day 3읽기 약 9분
핵심 정리
  • 웹 서버 설정은 "어떤 요청을, 어느 파일로, 누구에게 보여 줄 것인가"를 지시어로 선언하는 일이다.
  • 세 축만 잡으면 httpd.conf가 읽힌다 — DocumentRoot(파일 위치) · <Directory>(접근 권한) · <VirtualHost>(사이트별 분기).
  • 가상 호스트는 이름 기반(Host 헤더로 구분, IP 하나로 다수 사이트)과 IP 기반(사이트마다 IP)으로 나뉜다. HTTP/1.1의 Host 헤더 의무화가 이름 기반을 표준으로 만들었다.
  • 보안 3종: User apache로 권한 낮추기, 운영에서 Options Indexes 끄기, Apache 2.4의 Require 문법 쓰기(2.2는 Order/Allow).
  • 설정을 고쳤으면 반드시 httpd -t로 문법 검사 후 재시작. 가상 호스트 목록은 httpd -S, 모듈은 httpd -M.

Day 3 - Apache 웹 서버: httpd.conf와 가상 호스트의 모든 것

Apache 설치와 디렉터리 구조

  • RHEL/CentOS 계열에서 Apache의 패키지·데몬 이름은 모두 httpd다(데비안 계열은 apache2).
# 설치
yum install httpd
 
# 데몬 제어
systemctl start httpd
systemctl 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로 문법을 검사한 뒤 재시작해야, 오타 한 줄로 서버 전체가 죽는 사고를 막는다.

httpd.conf 핵심 지시어

  • 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                    # 로그 기록 수준
지시어역할
ListenApache가 대기할 포트(기본 80, HTTPS 443)
ServerName서버의 정식 호스트명. 가상 호스트 매칭에 사용
DocumentRootURL 루트(/)에 대응하는 실제 파일 경로
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 블록 — 디렉터리별 접근 제어

  • 특정 디렉터리에 대한 권한·옵션은 <Directory> 블록으로 지정한다.
<Directory "/var/www/html">
    Options Indexes FollowSymLinks    # 디렉터리 기능 옵션
    AllowOverride None                # .htaccess 허용 범위
    Require all granted               # 접근 허용(2.4 문법)
</Directory>
지시어역할
Options Indexesindex 파일 없을 때 파일 목록 자동 표시
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가 아예 무시된다는 점도 함정으로 나온다.

가상 호스트 — 한 서버에서 여러 사이트

  • 물리 서버 한 대로 site-a.com과 site-b.com을 동시에 서비스하려면 가상 호스트를 쓴다. 방식은 두 가지다.
방식구분 기준IP 필요량용도
이름 기반(Name-based)요청의 Host 헤더(도메인명)IP 1개로 다수 사이트가장 일반적
IP 기반(IP-based)접속한 IP 주소사이트마다 IP 1개HTTPS 일부·격리 필요 시

이름 기반 가상 호스트 — 하나의 IP에서 도메인 이름으로 구분:

<VirtualHost *:80>
    ServerName www.site-a.com
    DocumentRoot "/var/www/site-a"
    ErrorLog "logs/site-a-error_log"
</VirtualHost>
 
<VirtualHost *:80>
    ServerName www.site-b.com
    DocumentRoot "/var/www/site-b"
    ErrorLog "logs/site-b-error_log"
</VirtualHost>
  • 둘 다 같은 *:80(모든 IP의 80번 포트)을 듣는다.
  • Apache는 클라이언트가 보낸 HTTP Host 헤더의 도메인명이 어느 ServerName과 일치하는지로 사이트를 가른다.

IP 기반 가상 호스트 — 서버에 여러 IP를 두고 IP로 구분:

<VirtualHost 192.168.1.10:80>
    ServerName www.site-a.com
    DocumentRoot "/var/www/site-a"
</VirtualHost>
 
<VirtualHost 192.168.1.20:80>
    ServerName www.site-b.com
    DocumentRoot "/var/www/site-b"
</VirtualHost>

이름 기반 가상 호스트가 가능한 이유는 HTTP/1.1부터 요청에 Host 헤더가 필수가 되어, 같은 IP로 들어와도 "어느 도메인을 원하는지"가 요청 안에 담기기 때문이다. 이 덕분에 IP 하나로 수백 개 사이트를 돌릴 수 있다. 만약 도메인과 무관하게 들어온 요청(매칭되는 ServerName 없음)은 첫 번째로 정의된 VirtualHost가 기본으로 처리한다.

초창기 웹(HTTP/1.0)에는 Host 헤더가 없어서, 서로 다른 사이트를 같은 서버에서 돌리려면 사이트마다 공인 IP를 따로 사 줘야 했다(IP 기반). IPv4 주소가 고갈되기 시작하면서 이는 큰 낭비였고, HTTP/1.1이 Host 헤더를 의무화하며 이름 기반 가상 호스트가 표준이 됐다. 오늘날 클라우드에서 도메인 하나당 IP를 사지 않고도 무수한 사이트를 운영할 수 있는 것이 이 변화의 결과다.

모듈 — Apache의 확장 구조

  • Apache는 핵심 기능 외의 것을 모듈(module)로 끼워 확장한다.
  • SSL, 재작성(rewrite), PHP 연동 등이 모두 모듈이다.
LoadModule rewrite_module modules/mod_rewrite.so   # URL 재작성
LoadModule ssl_module modules/mod_ssl.so           # HTTPS
# 적재된 모듈 확인
httpd -M
모듈역할
mod_sslHTTPS(TLS) 지원
mod_rewriteURL 재작성·리다이렉트
mod_proxy리버스 프록시·로드 밸런싱
mod_dirDirectoryIndex 처리

Apache의 동작 모델은 MPM(Multi-Processing Module)으로 결정된다. prefork는 요청마다 프로세스를 띄워 안정적이지만 메모리를 많이 쓰고(전통적 PHP 환경), worker/event는 스레드를 써서 동시 접속에 효율적이다. 한 서버에 동시 접속이 많아 메모리가 부족하다면 MPM 선택과 MaxRequestWorkers 같은 한계값 조정이 튜닝의 출발점이 된다.

로그 — access_log와 error_log

  • Apache는 두 가지 핵심 로그를 남긴다.
# 접근 로그: 누가 무엇을 요청했는가
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에 남는다.

직접 쳐보기 — Apache 설정·검증

# 1. 기본 페이지 만들기
echo "<h1>Hello Apache</h1>" > /var/www/html/index.html
 
# 2. 설정 문법 검사 후 시작
httpd -t
systemctl 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와의 비교를 다룬다.

📖 용어

  • DocumentRoot : URL의 루트(/)가 실제로 가리키는 파일 시스템 경로. 기본값은 /var/www/html.
  • ServerRoot : 설정·로그·모듈을 찾는 기준 디렉터리. DocumentRoot와 헷갈리기 쉽다.
  • DirectoryIndex : 디렉터리만 요청했을 때 대신 보여 줄 기본 문서(index.html 등).
  • Include conf.d/*.conf : 사이트별 설정을 별도 파일로 분리해 메인 설정을 깔끔히 유지하는 구조.
  • 권한 강등(privilege drop) : root로 80번 포트를 연 뒤 요청 처리는 apache 계정으로 내려가는 것. User/Group이 정한다.
  • Options Indexes : index 파일이 없을 때 디렉터리 목록을 그대로 노출하는 옵션. 운영에서는 보통 끈다.
  • AllowOverride : 그 디렉터리에서 .htaccess로 설정을 덮어쓸 수 있는 범위. None이면 .htaccess가 무시된다.
  • Require all granted / denied : Apache 2.4의 접근 허용 / 차단 문법. 2.2의 Order·Allow from을 대체했다.
  • 가상 호스트(VirtualHost) : 서버 한 대에서 여러 사이트를 분기해 서비스하는 설정 블록.
  • Host 헤더 : HTTP/1.1에서 필수가 된 요청 헤더. "어느 도메인을 원하는지"를 담아 이름 기반 가상 호스트를 가능하게 한다.
  • MPM(Multi-Processing Module) : Apache의 동작 모델. prefork는 프로세스 기반, worker·event는 스레드 기반이다.
  • access_log vs error_log : 모든 요청과 응답 코드를 남기는 로그 / 설정 오류·진단 메시지를 남기는 로그.

📝 연습 문제

선택지를 클릭하면 정답·해설이 펼쳐집니다.

문제 1

Apache httpd.conf에서 웹 문서가 놓이는 최상위 디렉터리(URL 루트 /에 대응하는 실제 경로)를 지정하는 지시어는?

문제 2

하나의 IP 주소에서 여러 도메인을 서비스할 때, Apache가 어느 사이트로 보낼지 판단하는 기준은?

문제 3

Apache 설정을 수정한 뒤 재시작 전에 문법 오류를 검사하는 명령은?

문제 4

<Directory> 블록에서 Options Indexes를 켜 두었을 때 발생하는 동작은?

문제 5

IP 기반 가상 호스트와 이름 기반 가상 호스트의 차이로 옳은 것은?

문제 6

Apache가 root로 시작해 포트를 연 뒤, 실제 요청 처리는 권한이 낮은 계정으로 내려가 동작하도록 지정하는 지시어는?

문제 7

Apache 2.4에서 특정 디렉터리에 대한 모든 접근을 허용하는 지시어는?

이전DHCP와 NTP: 주소를 나눠 주고 시계를 맞추는 두 서비스Week 9 · Day 2다음 Nginx와 리버스 프록시: 이벤트 기반 웹 서버의 설계Week 9 · Day 4

참고 공식 자료

  • 리눅스마스터 1급 공식 출제 기준(새 탭에서 열림)

이 페이지

  • Apache 설치와 디렉터리 구조
  • httpd.conf 핵심 지시어
  • Directory 블록 — 디렉터리별 접근 제어
  • 가상 호스트 — 한 서버에서 여러 사이트
  • 모듈 — Apache의 확장 구조
  • 로그 — access_log와 error_log
  • 직접 쳐보기 — Apache 설정·검증
  • 용어
  • 연습 문제