Apache·Nginx와 웹 서버 운영
웹 서버는 요청을 받을 주소와 사이트를 선택하고 정적 파일을 제공하거나 애플리케이션으로 요청을 전달합니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 연결 주소·TLS SNI·HTTP Host와 요청 경로로 사이트가 선택되는 과정을 설명한다.
- 정적 파일 응답과 upstream 전달의 관찰 지점을 구분한다.
- 접근 로그·오류 로그·요청 조건으로 장애 위치를 좁힌다.
01HTTP 요청을 파일 응답으로 바꾸는 처리 순서
- HTTP·요청브라우저가 URL에서 호스트 이름과 경로를 나누고 주소를 찾은 뒤 연결을 수립하면 웹 서버는 HTTP 요청의 메서드·대상 경로·헤더를 읽는다.
- HTTPS·HTTPHTTPS에서는 HTTP보다 먼저 협상과 서버 인증서 검증이 진행된다.
- URI서버는 어떤 가상 호스트인지 선택하고 URI에 맞는 정적 파일 또는 처리기를 찾은 뒤 상태 코드·헤더·본문을 응답한다.
- GET과 HEADGET은 표현을 요청하고 HEAD는 같은 종류의 메타데이터를 본문 없이 요청한다.
- 응답상태 200은 성공 응답, 301/302 등은 이동, 403은 접근 거부, 404는 찾을 수 없음, 5xx는 서버 쪽 처리 문제를 표현한다.
- 모든 실패를 연결 문제로 설명할 수 없는 이유다.
- Content-LengthContent-Type은 수신자가 본문을 해석할 형식이고 Content-Length는 전송하는 본문의 바이트 길이에 관련된다.
- HTTPHTTP/1.1의 아래 텍스트 형식과 HTTP/2·3의 프레이밍은 다르다.
GET /guide.html HTTP/1.1
Host: study.example
Accept: text/html
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 32
<!doctype html><p>hello web!</p>교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
02DNS가 IP를 알려 줘도 Host와 SNI가 필요한 이유
- 한 주소의 여러 사이트는 이름을 주소로 해석하지만 같은 IP와 포트에서 여러 사이트를 제공할 수 있다.
- HTTP·HostHTTP/1.1의 Host 헤더는 요청한 사이트 이름을 서버에 전하고 이름 기반 가상 호스트 선택에 사용된다.
- 단순히 IP 주소로 접속하면 기본 가상 호스트로 갈 수 있다.
- HostHost가 파일 시스템 디렉터리 이름 그 자체는 아니며 설정에 정의된 선택 규칙을 거친다.
- HTTPS·HTTPHTTPS에서는 HTTP 헤더가 암호화되어 전송되기 전에 단계에서 인증서를 선택해야 한다.
- SNI·요청SNI는 클라이언트가 요청한 서버 이름을 협상에 전달한다.
- 인증서 이름 검증인증서 이름과 요청한 호스트가 맞아야 정상적인 서버 인증이 된다.
- 와 인증서 선택같은 IP에서 인증서가 다른 두 사이트를 제공하는 상황을 만으로 설명할 수 없는 이유가 여기에 있다.
03Apache Listen·VirtualHost·Directory의 역할
- 은 서버가 어느 주소·포트의 연결을 받을지 정한다.
- 는 해당 연결과 호스트 이름에 맞는 사이트 설정을 선택하고 ServerName은 이름 선택 기준, DocumentRoot는 정적 문서 기준 경로다.
- <>는 파일 시스템 경로에 대한 정책이며 URL 기준 처리와 구분한다.
- 연결설정을 conf.d에 놓는 방식은 주 설정이 그 파일들을 하도록 연결되어 있어야 작동한다.
- 는 적절한 인덱스 파일이 없을 때 디렉터리 목록을 생성할 수 있게 한다.
- None None은 해당 경로의 .htaccess 재정의를 읽지 않도록 하는 정책이다.
- RequireRequire all granted는 접근 통제를 허용하지만 실제 파일의 DAC·까지 바꾸지 않는다.
- 아래는 정적 실습 사이트의 예시이며 를 구성한 운영 설정을 대체하지 않는다.
<VirtualHost *:80>
ServerName study.example
DocumentRoot /srv/study
<Directory /srv/study>
Options -Indexes
AllowOverride None
Require all granted
</Directory>
</VirtualHost>교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
Apache의 수신 포트·문서 루트·디렉터리 허용을 따로 검증하기
의 LAMP 설정 화면에서 요청을 받는 조건과 파일을 제공하는 조건을 나누고, 기본 페이지가 뜨는 원인을 추적한다.
실습 구성과 전제
- 2.4 계열의 httpd 서비스와 /etc/httpd 설정 경로를 기준으로 읽는다. 의 apache2 경로와 섞지 않는다.
- 캡처는 서로 다른 설정 항목을 보여 주는 자료다. 아래 확인 명령은 실습용 예시이며, 이 조각만으로 설정 전체나 모든 URL의 성공을 단정하지 않는다.
Listen과 주석을 구별해 수신 조건을 읽는다
- #으로 시작하는 예시는 주석이다. 활성 줄의 80이 실제 수신 설정이며 방화벽 허용과는 별개다.
- 가상 호스트는 수신 주소·포트 후보 안에서 Host 이름을 비교한다. ServerName을 추가해도 나 이 자동으로 생기지는 않는다.
bashsudo httpd -t sudo httpd -S sudo ss -ltnp구문, 가상 호스트 매핑, 실제 수신 소켓을 각각 확인하는 명령이다.
원본 크기로 보기 ↗- 46행의 특정 주소 Listen은 #으로 주석 처리되어 있다.
- 47행의 Listen 80은 활성 설정이며, 다른 포트를 사용한 Nginx 실습과 구분해야 한다.
확인 기준구문 검사가 통과해도 서비스가 중지되어 있으면 수신하지 않는다. 80 포트의 실제 를 확인한다.
DocumentRoot에 URI를 연결한다
- 기본 파일 제공에서 /index.html은 DocumentRoot 아래의 index.html에 대응한다. ·Rewrite·별도 가 있으면 적용 경로를 다시 확인한다.
- 홈 디렉터리에 index.html을 만들었다는 사실만으로 기본 웹 문서가 바뀌지는 않는다. 요청의 문서 루트와 생성한 파일 위치가 일치해야 한다.
bashls -l /var/www/html/index.html namei -l /var/www/html/index.html파일 존재와 상위 디렉터리 검색 권한을 조회한다.
원본 크기로 보기 ↗- 활성 DocumentRoot 값은 /var/www/html이다.
- 이 설정 조각에는 사용자 홈 디렉터리를 문서 루트로 지정한 내용이 없다.
확인 기준파일을 놓은 경로와 요청이 선택한 DocumentRoot가 같아야 한다. 파일 없음과 읽기 거부를 구별한다.
웹 접근 허용과 운영체제 권한을 분리한다
- 화면의 < />는 파일 시스템 루트에 대한 기본 제한이다. 공개 경로에 적용되는 더 구체적인 설정도 함께 읽어야 최종 허용 여부를 판단할 수 있다.
- Require all denied는 HTTP 접근 제어이고 chmod 모드와 다른 검사다. none은 해당 범위에서 .htaccess의 설정 덮어쓰기를 사용하지 않는다는 뜻이다.
원본 크기로 보기 ↗- <Directory /> 안에 AllowOverride none과 Require all denied가 나란히 있다.
- 전역 기본 제한 한 조각이므로 /var/www/html의 추가 허용 블록 존재 여부를 이 사진만으로 알 수 없다.
확인 기준403이면 적용된 ·Require, 경로 권한, 정책과 오류 로그를 대조한다. 전체 루트의 제한을 해제하는 방식으로 해결하지 않는다.
기본 테스트 페이지를 사용자 문서와 구별한다
- 의 테스트 페이지는 웹 요청에 응답한 화면이다. 문서에는 와 안내가 모두 있으므로 화면의 로고만으로 실제 응답 를 확정하지 않는다.
- 문서 내용·접속 URL·서비스와 로그를 함께 확인한다. 설정을 수정했다면 구문 검사 후 reload하고 같은 URL을 다시 요청해 비교한다.
bashsudo httpd -t && sudo systemctl reload httpd curl -i -H 'Host: lab.example.test' http://127.0.0.1/ sudo tail -n 30 /var/log/httpd/error_log실습의 Host 이름으로 바꿔 응답과 오류 로그를 확인한다. reload는 설정을 수정한 경우에만 실행한다.
원본 크기로 보기 ↗- HTTP Server Test Page라고 표시되며 운영체제 기본 안내 문서가 보인다.
- 본문은 /var/www/html과 welcome.conf를 안내하고 Apache·Nginx 각각의 사용 조건을 설명한다.
확인 기준기본 페이지가 계속 보이면 선택된 ·문서 루트·index·welcome 설정을 확인한다. HTTP 응답 코드와 본문이 기대한 값인지 함께 판단한다.
실습에서 확인한 동작 원리
- 수신 포트, 가상 호스트 선택, URI의 파일 경로 변환, 접근 허용은 서로 다른 단계다.
- 서비스 active·구문 검사·기본 페이지 출력만으로 원하는 사이트의 동작을 모두 검증한 것은 아니다.
설정·출력 추가로 확인하기 9장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 9장
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
04Nginx의 server·location·root·try_files
- ·는 과 으로 서버 블록을 선택하고 URI에 따라 location을 적용한다.
- ·파일 경로는 정적 파일 경로의 기준을 정하며 단순 매핑에서는 요청 URI를 이어 파일을 찾는다.
- ·location는 지정 location 부분을 다른 경로로 대체하는 방식이라 경로 결합 의미가 다르다.
- location location과 prefix location에는 선택 순서가 있으므로 파일에 적힌 모든 블록을 위에서 아래로 단순 실행한다고 보지 않는다.
- 는 지정 후보가 실제 존재하는지 순서대로 보고 마지막 처리로 넘어간다. 정적 사이트에서 $uri $uri/ =404는 요청 파일, 디렉터리 후보를 살펴보고 없으면 404를 돌려주는 예다.
- indexSPA에서 무조건 index.html로 넘기는 구성을 일반 문서 사이트에도 쓰면 존재하지 않는 경로가 모두 200처럼 보일 수 있으므로 서비스의 방식에 맞춘다.
server {
listen 80;
server_name study.example;
root /srv/study;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
서로 다른 포트의 가상 서버가 문서 루트를 선택하는 과정
포트와 ·index·를 실제 설정에 대입해 요청할 URL과 파일 경로를 계산한다.
실습 구성과 전제
- 포트 83·84·85를 나눈 설정 화면과 기본 포트의 환영 페이지는 별도 구성 사례다. 환영 페이지를 세 가상 서버의 성공 증거로 사용하지 않는다.
- 예시 경로는 /srv/lab-a로 재구성한다. 설정을 실제 적용한다면 준비된 실습 서버와 파일 접근 권한이 있어야 한다.
요청이 들어올 포트와 server 블록을 대응시킨다
- 화면은 server 블록 세 개에 서로 다른 포트를 둔다. 클라이언트가 어떤 포트로 연결했는지에 따라 먼저 선택 가능한 서버 집합이 달라진다.
- _는 특별한 모든 이름 매칭 연산자가 아니다. 해당 주소·포트의 default_server 또는 기본 서버 선택과 Host 이름 비교 규칙을 함께 읽어야 한다.
원본 크기로 보기 ↗- 세 블록의 listen 값은 83, 84, 85로 나뉘고 IPv6 listen도 각각 있다.
- 블록마다 root 경로가 다르고 index index.html, try_files $uri $uri/ =404가 반복된다.
확인 기준포트를 생략한 http URL은 보통 80으로 연결하므로 83·84·85 서버 확인과 다르다.
URI를 문서 루트 아래 파일로 계산한다
- 재구성 설정에서 /guide.html은 /srv/lab-a/guide.html로 연결된다. / 요청은 디렉터리와 index 처리까지 이어지므로 파일 요청과 처리 경로가 다를 수 있다.
- 는 정해진 경로에 후보가 존재하는지 확인하고 모두 없으면 지정한 404로 끝낸다. 파일 존재 외에도 웹 서버 계정의 경로 검색·읽기 권한이 필요하다.
server { listen 8083; server_name lab.example.test; root /srv/lab-a; index index.html; location / { try_files $uri $uri/ =404; } }8083과 /srv/lab-a로 재구성한 독립 server 예시다.
확인 기준요청 URL과 예상 파일 경로를 먼저 적고 실제 파일·권한·접근 로그를 대조한다. 404와 접근 거부를 같은 문제로 처리하지 않는다.
응답 화면이 어느 요청을 검증했는지 한정한다
- 환영 페이지는 해당 URL에서 기본 문서가 응답한 결과다. 사용자별 나 다른 포트가 올바르다는 결과로 확대하지 않는다.
- 구성 검사 후 해당 포트와 Host를 지정해 요청하고 예상 문서의 고유 내용을 확인한다. -t 성공은 문법·참조 파일 검사이며 모든 URL의 정상 응답을 보장하지 않는다.
bashsudo nginx -t curl -i -H "Host: lab.example.test" http://127.0.0.1:8083/guide.html재구성한 포트와 Host를 명시해 실제 문서 응답을 확인한다.
원본 크기로 보기 ↗- 브라우저에는 Nginx 기본 환영 문서가 보인다.
- 주소는 별도 사용자 포트 구분 없이 기본 웹 요청 형태이므로 앞의 83·84·85 블록을 직접 검증한 화면은 아니다.
확인 기준기본 환영 페이지만 나오면 실제 요청의 포트·Host와 선택된 서버를 먼저 확인한다.
실습에서 확인한 동작 원리
- 가상 서버 선택과 파일 경로 계산은 서로 다른 처리 단계다.
- 기본 페이지 한 장의 성공을 모든 포트·도메인·문서 루트의 성공으로 확대하지 않는다.
설정·출력 추가로 확인하기 4장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 1장
원본 크기로 보기 ↗- 「was 설정」 문맥에 삽입된 원본 설정 예시이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 2장
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 03 1장
원본 크기로 보기 ↗- 학습 원본 · 웹 서버 접근 결과와 오류 응답의 해당 절에 수록된 화면·도식이다.
동작·명령 참고 문서
05Nginx location 선택과 경로 매핑은 별도 계산이다
- 정확 일치location = /health 같은 정확 일치가 선택되면 그 요청의 location 탐색을 끝낼 수 있다. 파일 이름이 /health라는 뜻이 아니라 URI 선택 조건이다.
- 접두사와 일반적인 prefix/ 구성에서는 가장 긴 접두사를 기억한 뒤 location을 설정 순서로 평가한다. 일치한 이 없으면 기억한 접두사를 사용한다.
- 의 역할선택된 최장 접두사에 가 있으면 그 단계의 탐색을 생략한다. 모든 중첩 location과 새 기능을 이 단순 예의 순서만으로 설명하지 않는다.
- 와 는 URI를 지정 경로 뒤에 붙이는 방식이고 는 일치한 location에 대응하는 파일 경로를 대신 지정한다. 같은 디렉터리 문자열을 넣어도 결과 경로가 달라질 수 있다.
- 내부 재선택의 마지막 URI나 index 처리 등으로 내부 redirect가 생기면 새 URI에 대해 location 선택이 다시 일어날 수 있다. 최초 요청 URI와 최종 처리 location을 구분한다.
06/assets/logo.png의 실제 파일 경로를 계산하기
- 예제 범위같은 server 안에 중첩··rewrite가 없는 단순 location /assets/를 가정한다. 요청 URI는 /assets/logo.png이다.
- 사례 /srv/site;이면 URI 전체를 붙여 /srv/site/assets/logo.png를 찾는다. /srv/site/logo.png로 바로 가는 것은 아니다.
- 사례 /srv/static/;이면 location의 /assets/를 대신하여 /srv/static/logo.png를 찾는다. 뒤 슬래시와 location 경계가 맞는지 중요하다.
- 없는 파일선택된 실제 경로에 파일이 없으면 404가 될 수 있다. 나 연결은 이미 성공했으므로 네트워크 주소를 고치는 것이 직접 해결이 아닐 수 있다.
- 권한 분기파일이 있어도 중간 디렉터리 탐색과 웹 읽기 정책을 충족해야 한다. 경로 매핑 결과와 권한 결과를 서로 다른 단계로 판독한다.
| 설정 | 요청 URI | 매핑된 경로 |
|---|---|---|
| /srv/site | /assets/logo.png | /srv/site/assets/logo.png |
| /srv/static/ | /assets/logo.png | /srv/static/logo.png |
07설정 검사 성공 뒤에도 한 경로만 실패하는 경우
- 파싱 성공 -t나 apachectl configtest는 설정 파싱·일부 자원 접근을 검사한다. 모든 Host·URI·인증·백엔드 응답을 실제로 실행해 검증하는 것은 아니다.
- 사이트 선택같은 IP에서 한 이름만 실패하면 Host·SNI·/ServerName과 기본 사이트를 대조한다. 가 같은 IP를 돌려줘도 사이트 선택이 동일하지 않을 수 있다.
- 한 확장자만 다른 결과면 location 또는 처리기 선택을 살핀다. 가장 눈에 띄는 prefix block만 읽고 실제로 선택된 규칙을 놓치지 않는다.
- 내부 redirectindex나 뒤 다른 처리기로 이동했다면 오류 로그의 최종 파일 경로·upstream을 원래 URI와 연결한다. 파일 문제처럼 시작해 앱 실행 오류로 끝날 수 있다.
- 반영된 세대reload 후에도 기존 연결·작업자가 이전 요청을 처리하는 구간이 있을 수 있다. 설정 파일 저장 시각과 실제 요청을 처리한 ·로그를 구별해 변화의 범위를 판단한다.
08설정 검사·reload와 실제 요청의 연결
- apachectl configtest와 -t는 설정 문법과 일부 참조 조건을 검사한다.
- 문법이 유효하다는 사실이 ·인증서·파일 접근·백엔드 응답까지 정상임을 보장하지는 않는다.
- reloadreload는 지원되는 방식으로 새 설정을 읽게 하는 요청이며 보통 기존 요청을 가능한 한 처리하면서 새 worker 또는 설정으로 전환한다.
- 프로그램별 구현과 실패 시 기존 설정 유지 여부를 구분한다.
- access log·요청access log는 어떤 요청에 어떤 응답을 반환했는지, error log는 처리 중의 구체적 오류를 설명한다.
- 요청·Host로컬 요청에서 Host를 명시하면 와 분리하여 가상 호스트 선택을 관찰할 수 있다.
- HTTPss의 결과와 curl의 HTTP 상태를 이어 보면 연결 수락, 사이트 선택, 파일 처리라는 정상 흐름이 증거로 연결된다.
- 로그의 민감정보로그에는 인증 정보나 민감한 쿼리 문자열이 남을 수 있으므로 필요한 기록 범위를 설계한다.
- 변경 전후에는 대표 경로와 오류 경로를 같은 조건으로 비교한다.
- HTTP·응답HTTP 응답이 성공했더라도 애플리케이션의 업무 기능까지 정상인지는 별도 검증이 필요하다.
nginx -t
# Apache 환경은 apachectl configtest / httpd -S
curl -i -H "Host: study.example" http://127.0.0.1/guide.html
ss -lntp교육용 예시. 결과와 주소는 설명용이며 실제 시스템에서 실행한 기록이 아니다.
09한 HTTP 요청이 처리되는 단계
- 요청·notes.example.test의 정적 문서를 요청하는 예에서는 인증서 선택, HTTP 사이트 선택, URI의 파일 경로 대응, 파일 접근을 차례로 연결한다.
- 동적 경로의 처리같은 서버의 애플리케이션 경로로 바꾸면 마지막 단계가 파일 읽기에서 upstream 연결로 달라진다.
- 응답다음 도식에서 응답 코드가 만들어진 위치를 따라가면 인증서 문제·정적 파일 접근 문제·뒤 서버 연결 문제를 서로 구분할 수 있다.
- 연결·리스닝 주소에 연결하고 HTTPS이면 및 인증서 조건을 확인한다.
- HTTP 요청Host와 문서 경로로 사이트와 경로 규칙이 선택된다.
- 파일 열기문서 루트 등에 매핑된 경로의 읽기와 접근 조건을 확인한다.
- 내용 반환파일 내용을 읽거나 경로·권한 오류가 반환된다.
- HTTP 응답선택된 처리 결과를 상태 코드와 본문으로 전달한다.
설명과 함께 보는 보조 도식
정적 문서 응답의 처리 순서
notes.example.test는 설명용 도메인이며 실제 서비스 접속은 하지 않는다.
연결·TLS
리스닝 주소에 연결하고 HTTPS이면 TLS 및 인증서 조건을 확인한다.
- 이름 조건
- SNI
전체 단계를 한 번에 읽기
- 01
연결·TLS
리스닝 주소에 연결하고 HTTPS이면 TLS 및 인증서 조건을 확인한다.
- 이름 조건
- SNI
- 02
HTTP 요청
Host와 문서 경로로 사이트와 경로 규칙이 선택된다.
- 요청
- GET /guide.html
- 03
파일 열기
문서 루트 등에 매핑된 경로의 읽기와 접근 조건을 확인한다.
- 실행 주체
- 웹 서버 계정
- 04
내용 반환
파일 내용을 읽거나 경로·권한 오류가 반환된다.
- 분기
- 성공·없음·거부
- 05
HTTP 응답
선택된 처리 결과를 상태 코드와 본문으로 전달한다.
- 관찰
- 접근 로그와 오류 로그
Redirect와 Alias를 URL 변화·접근 로그로 구별하기
같은 실습 앱을 제공하는 세 설정을 비교하여 브라우저 재요청, 내부 파일 매핑, 규칙의 차이를 설명한다.
실습 구성과 전제
- 의 서로 다른 구성 사례를 비교한다. RedirectMatch·RewriteRule· 세 설정을 한 에 동시에 넣는 절차가 아니다.
- 경로는 수업의 실습 앱 예시다. 공개 서버에 취약한 앱을 설치하는 배포 예제가 아니며, 주소와 포트는 격리된 실습 환경에 맞춰 사용한다.
RedirectMatch의 301을 두 요청으로 추적한다
- ^/$는 루트 경로 하나를 선택한다. //는 클라이언트에게 다시 요청하도록 알려 주는 목적지이며 서버 파일 경로가 아니다.
- 브라우저는 리다이렉트 응답의 Location을 읽고 새 요청을 보낸다. 주소창 변화와 접근 로그의 요청 수를 함께 보면 내부 매핑과 구분할 수 있다.
bashcurl -i http://127.0.0.1/ curl -i -L http://127.0.0.1/해당 실습 서버에서 첫 응답만 보는 요청과 리다이렉트를 따라가는 요청을 비교한다.
원본 크기로 보기 ↗- VirtualHost *:80 안에 RedirectMatch 301 ^/$ /dvwa/가 있다.
- ServerName과 리다이렉트 목적지는 서로 다른 항목이며 앱의 실제 파일 위치는 이 줄에 표시되지 않는다.
원본 크기로 보기 ↗- 첫 로그는 GET / HTTP/1.1과 상태 301이다.
- 다음 로그는 GET /dvwa/ HTTP/1.1과 상태 200이어서 두 요청을 구분할 수 있다.
확인 기준첫 응답의 Location과 두 번째 요청 경로를 확인한다. 301은 영구 이동이므로 브라우저 캐시의 영향도 구별한다.
RewriteRule이 외부 리다이렉트를 만드는 조건을 읽는다
- 화면은 RewriteEngine On, 루트 URI 조건, R=301·L 플래그를 사용한다. Rewrite라는 이름만 보고 항상 서버 내부 처리라고 판단하면 안 된다.
- R은 리다이렉트 응답을 만들고 L은 현재 규칙 처리의 해당 단계를 끝낸다. RewriteRule의 매칭 대상은 server와 문맥에 따라 달라지므로 규칙 위치를 먼저 확인한다.
원본 크기로 보기 ↗- RewriteCond는 REQUEST_URI가 루트인지 검사한다.
- RewriteRule 끝의 [R=301,L]이 보이므로 외부 301 응답을 의도한 사례다.
확인 기준응답 코드와 Location이 의도대로인지 확인한다. 규칙 모양이 다르더라도 RedirectMatch 사례처럼 클라이언트 재요청이 일어나는지 비교한다.
Alias의 URL→파일 경로 매핑을 읽는다
- 별도 사례는 URL /를 /var/www/html// 아래에 매핑한다. 클라이언트가 //로 이동할 필요 없이 루트 URL에서 해당 파일을 제공할 수 있다.
- 가 가리킨 파일에도 접근 허용과 파일 시스템 권한이 적용된다. 화면의 all은 .htaccess 처리를 넓게 허용하므로 필요한 설정 범위를 검토해야 한다.
원본 크기로 보기 ↗- Alias / 뒤에 /var/www/html/dvwa/ 파일 시스템 경로가 있다.
- 같은 경로의 Directory 안에 AllowOverride all과 Require all granted가 있다.
원본 크기로 보기 ↗- 접근 로그의 첫 요청 GET /는 200이며 이 구간에는 앞 사례의 301 행이 없다.
- 이후 CSS·JavaScript·이미지 등 추가 리소스 요청도 각각 별도 로그 행으로 남는다.
확인 기준주소가 유지된다는 관찰, 첫 응답 코드, 적용 설정을 함께 비교한다. 일부 로그에 301이 없다는 사실만으로 서버 전체에 리다이렉트가 없다고 단정하지 않는다.
실습에서 확인한 동작 원리
- Redirect는 클라이언트에게 새 URL을 요청하게 하고 는 서버 내부에서 URL의 파일 위치를 매핑한다.
- 접근 로그의 한 행은 보통 한 요청을 나타낸다. 페이지 로드 한 번에도 리다이렉트와 여러 리소스 요청이 생길 수 있다.
설정·출력 추가로 확인하기 37장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 3장
원본 크기로 보기 ↗- 「ubuntu - nginx - port base」 문맥에 삽입된 원본 명령·상태 출력이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「어제」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「ubuntu - nginx - port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 02 12장
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. Windows Server 관리자와 IIS Manager에서 설치된 웹 서버 역할 및 사이트 목록을 확인하는 화면이다.
원본 크기로 보기 ↗- 문서 문맥에 삽입된 원본 설정 예시이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. 브라우저에 표시된 Windows Server IIS 기본 환영 페이지이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. Windows Server 역할 추가 마법사에서 Web Server(IIS)와 관리 도구 설치 완료를 확인하는 화면이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS의 Default Document 설정에서 기본 문서 파일 이름과 검색 순서를 읽는 화면이다.
원본 크기로 보기 ↗- 「실습- window」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS 사이트 메뉴에서 바인딩·권한·가상 디렉터리 등 관리 항목을 선택하는 화면이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS Site Bindings에서 HTTP 바인딩의 호스트 이름·포트·IP 주소를 확인하는 화면이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS 웹사이트의 실제 파일 경로를 지정하는 화면이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. Windows 파일 탐색기에서 IIS의 inetpub/wwwroot 웹 루트에 들어 있는 기본 문서 파일을 확인하는 화면이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS 웹사이트 바인딩에서 IP 주소와 포트를 선택하는 입력 부분이다.
원본 크기로 보기 ↗- 에 삽입된 원본 학습 화면이다. IIS 웹사이트 바인딩에 특정 IP 주소와 포트·호스트 이름을 지정하는 입력 부분이다.
실습 화면 묶음 03 1장
원본 크기로 보기 ↗- 「rocky 실습 (sata)」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 04 1장
원본 크기로 보기 ↗- 「이게 무슨 의미인가?」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 05 1장
원본 크기로 보기 ↗- 「LAMP - httpd(apache)」 문맥에 삽입된 원본 설정 예시이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 06 16장
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「새로운 .conf 파일 만들」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「새로운 .conf 파일 만들」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「새로운 .conf 파일 만들」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「port base」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「실습」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「nmtui」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「nmtui」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
원본 크기로 보기 ↗- 「새로운 .conf 파일 만들」 문맥에 삽입된 원본 실습·개념 참고 화면이다. Apache·Nginx와 웹 서버 운영 학습 내용과 함께 당시 구성·설정·관찰 결과를 비교할 수 있다.
실습 화면 묶음 07 1장
원본 크기로 보기 ↗- 수업 원본 자료 · IP 기반 가상 호스트의 구성 관계. 원문에서 「VH 1. IP base Virtual Hosting」에 배치된 그림 또는 화면이다.
실습 화면 묶음 08 1장
원본 크기로 보기 ↗- 학습 원본 · 웹 서버 접근 결과와 오류 응답의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 09 1장
원본 크기로 보기 ↗- 학습 원본 · 웹 서버 호스트 이름 설정의 IIS(apache)에 수록된 화면·도식이다.
10같은 서버에서 한 사이트만 실패하는 이유
- 기본 사이트는 열리는데 특정 도메인만 실패한다면 결과와 접속 이름, 가상 호스트 매칭, 해당 인증서를 확인한다.
- 404와 경로 매핑특정 경로만 404면 URL과 실제 파일 매핑을 대조하고, 403이면 파일·상위 경로 권한과 목록 정책 등 접근 조건을 확인한다.
- 502와 Upstream프록시 경로에서 502가 나오면 정적 파일 권한만 조사하지 말고 upstream 연결과 응답 형식을 살핀다.
- 504는 중계 구간의 시간 초과를 조사할 단서다.
- 상태 코드의 한계오류 코드는 원인을 좁히는 단서이며 서버나 애플리케이션이 정의한 응답 정책도 고려해야 한다.
- 설정 검사설정 검사가 성공해도 바인딩할 포트 충돌, 인증서 파일 접근, 외부 의존성 실패는 실행 중에 드러날 수 있다.
- 같은 조건의 전후 비교변경 전후 같은 도메인·프로토콜·경로·인증 조건으로 요청해야 결과를 비교할 수 있다.
- 상태 코드접근 로그의 상태 코드와 처리 시간, 오류 로그의 시각을 연결하고 프록시가 있다면 요청 식별자로 뒤 서버까지 추적한다.
- 오래된 캐시 응답브라우저 캐시나 중간 캐시 때문에 오래된 응답을 보는 경우에는 실제 응답을 만든 계층과 캐시 조건도 확인한다.
| 구성·관찰 대상 | 관찰 내용 | 해석 |
|---|---|---|
| 연결· | 주소·포트·SNI·인증서 | 다른 사이트나 인증서 선택 |
| 가상 호스트 | Host와 기본 사이트 | IP 직접 접속과 도메인 접속 차이 |
| 경로 매핑 | URL과 파일·upstream | 404와 잘못된 전달 경로 |
| 로그 | 상태·시각·처리 시간 | 응답을 만든 계층 추적 |
함께 보는 학습 자료
아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.
Nginx 설정·reload·정적 파일·FastCGI 입문
Starting, Stopping, and Reloading Configuration에서 worker 세대 교체를 읽고 Serving Static Content의 URI→파일 경로를 직접 계산한다. 마지막 절에서 앱 실행기와의 경계를 확인한다.
- 설정 적용 실패 때 기존 worker가 계속 처리하는 경로
- 에 URI가 붙어 실제 경로가 되는 계산
- 와 fastcgi_pass가 연결하는 뒤쪽 서비스의 차이
Apache event MPM의 연결 대기와 작업 스레드
Relationship with the Worker 다음 How it Works의 Keep-alive 항목을 읽는다. 연결마다 하나라는 단순 비교 대신 listener와 worker가 언제 역할을 넘기는지 살펴본다.
- 자식 안의 listener와 worker 스레드
- keep-alive 대기를 처리 스레드에서 분리하는 시점
- graceful 종료 중 기존 가 남는 이유
이해했는지 확인하기
- 요청 주소·Host·사이트 설정의 대응을 확인한다.
- 응답을 만든 계층과 관련 로그를 연결한다.
- 설정 문법 검사 뒤 실제 대표 요청도 확인한다.
