# 학습 목표
- 리버스 프록시(Reverse Proxy)와 포워드 프록시(Forward Proxy)에 대해서 이해하고, 특징을 학습합니다.
- 프록시 서버에 사용되는 지시어(directives)를 학습하고, 이를 활용합니다.
- 프록시 서버에서 원 서버로 전달되는 요청 헤더를 설정하는 방법을 학습합니다.
- 프록시 서버의 cache-control 방법과 캐시 관련 지시어 사용법을 확인합니다.
# 해결 과제
- 내 컴퓨터를 원(origin) 서버의 리버스 프록시 서버로 만들어야 합니다.
- 캐싱 기능을 포함한 프록시 서버를 작성해야 합니다.
- sprint-proxy-server 레포지토리에 Pull Request를 통해,
nginx.conf
설정 내용을 제출해야 합니다.
# 실습 자료
# 과제 항목별 진행 상황
1. 내 컴퓨터를 원(origin) 서버의 리버스 프록시 서버로 만들기
- nginx proxy 서버 공식문서를 참고하여, 프록시 서버를 만듭니다.
- 프록시 서버의 포트는 원하는 포트 번호를 사용해도 됩니다.
- 원 서버의 주소는
3.39.193.136:8080
이며, 프록시 서버(localhost:10026
)로 요청을 보내면 아래와 같은 화면과 함께 서버가 작동됩니다. - 프록시 서버가 원서버에 전달해야 하는 요청 헤더와 값은 다음과 같습니다.
nginx.conf
http {
#2023-04-07 리버스 프록시 서버 실습
server {
listen 10026;
location / {
proxy_pass http://3.39.193.136:8080;
#요청을 처리할 백엔드 서버를 설정
proxy_set_header myname 'devops04-parkchankyu';
#사용자 지정 HTTP 헤더 이름
proxy_set_header Host $host;
#Nginx가 클라이언트 요청을 프록시 서버로 전달할 때, HTTP 헤더 값을 설정하는 지시어
proxy_set_header X-Real-IP $remote_addr;
#백엔드 서버에 실제 클라이언트의 IP 를 전달
}

2. 프록시 서버에 캐싱 기능 포함하기
- nginx caching 공식문서 와 nginx caching guide 를 참고하여, 매 요청마다,
X-Cache-Status
헤더 값인MISS
,HIT
,EXPIRED
를 구현하고,Cache-Control
헤더의 값을 지정할 수 있어야 합니다. - 캐시 기간은 5초로 지정합니다.
- 매 요청의 결과는 X-Cache-Status 헤더의 값이 아래 스크린샷 값과 같이,
MISS
,HIT
,EXPIRED
와 같은 값이어야 합니다. - X-Cache-Status의 순서는
MISS
,HIT
, (5초 후)EXPIRED
순서로 응답이 와야 합니다.
nginx.conf
http {
#2023-04-07 리버스 프록시 서버 실습
# 캐시 설정
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=5s;
#캐시된 콘텐츠가 저장될 위치[/var/cache/nginx],
#디렉토리 구조 : leverls=1:2
#캐시 이름 및 캐시 크기 : keys_zone=my_cache:10m
# levels=1:2를 사용하면 캐시 파일이 효과적으로 분류되어 저장되어 검색속도를 향상시킴
#이 경우 캐시는 "/var/cache/nginx" 디렉토리에 위치하며, 캐시 크기는 10MB입니다.
# inactive=5s : 캐시 이용기간, 5초 안에 요청이 없으면 삭제
proxy_cache_key "$scheme$request_method$host$request_uri";
#캐시 키를 설정하는 라인
# 캐시 키는 요청 스키마, 요청 메소드, 호스트 및 요청 URI로 구성
# 기본 Cache-Control 헤더 설정
add_header Cache-Control "public, max-age=5";
#기본적으로 적용되는 캐시 제어 헤더를 설정
# "public, max-age=5" 값이 설정되어 있어서 캐시된 콘텐츠는 5초 동안 캐시
server {
listen 10026;
location / {
proxy_pass http://3.39.193.136:8080;
#요청을 처리할 백엔드 서버를 설정
proxy_set_header myname 'devops04-parkchankyu';
#사용자 지정 HTTP 헤더 이름
proxy_cache my_cache;
#Nginx에서 지정한 캐시 메모리나 디스크에 응답을 저장하고
#재사용할 수 있게 해주는 지시어입니다.
#즉, 뒤에 명시된 캐시 이름 my_cache를 사용하도록 설정하는 것
#이렇게 설정하면, 이후에 다른 location 블록에서 같은 이름의 캐시를 사용
#하거나, proxy_cache_bypass나 proxy_cache_purge 지시어 등을 사용하여
#캐시를 제어할 수 있습니다.
proxy_set_header Host $host;
#Nginx가 클라이언트 요청을 프록시 서버로 전달할 때, HTTP 헤더 값을 설정하는 지시어
proxy_set_header X-Real-IP $remote_addr;
#백엔드 서버에 실제 클라이언트의 IP 를 전달
proxy_cache_valid 200 5s;
#200 OK 응답을 받은 경우에 5초간 캐시가 유지
# X-cache-Status 헤더 값 반환 설정
add_header X-Cache-Status $upstream_cache_status;
# Cache-Control 헤더 값 재설정 설정
if ($upstream_cache_status = "MISS") {
add_header Cache-Control "public, max-age=5";
}
if ($upstream_cache_status = "HIT") {
add_header Cache-Control "public, max-age=5, must-revalidate";
}
if ($upstream_cache_status = "EXPIRED") {
add_header Cache-Control "no-cache";
}
}


# TROUBLE SHOOTING LOG
💡 문제 내용 nginx 재기동 후에도 이전 실습페이지가 출력되고 proxy 구성이 안되는 상황
원인

위와 같은 방식으로 서비스를 재기동 함
해결 방안
systemctl restart nginx
명령어는 nginx 서비스를 중지하고 다시 시작하는 것으로, nginx의 설정 파일이 변경되었을 경우 해당 설정 파일을 반영하기 위해 사용됩니다. 이 명령어를 실행하면 현재 연결된 모든 클라이언트와의 연결이 끊어지고, 모든 요청이 중단됩니다.
반면에 nginx -s reload
는 nginx가 실행중인 상태에서 설정 파일을 다시 로드하는 것으로, nginx 서비스를 중지하거나 재시작하지 않고도 설정 파일을 업데이트할 수 있습니다. 이 명령어는 설정 파일을 변경했을 때, 새로운 요청은 새로운 설정에 따라 처리되지만 현재 처리 중인 요청은 이전 설정을 따라 처리