Nginx Reverse Proxy Server
요구사항
- 프록시 서버가 원서버에 전달해야 하는 요청 헤더와 값은 다음과 같습니다.
- myname : devops01-이름 (예시, devops01-kimyeorae)
- (myname 헤더는 제출을 확인하는 헤더로, 반드시 위와 같은 형식의 값이 포함되어야 합니다. )
- X-Real-IP
- Host
- 캐싱 기능 포함
- 매 요청마다, X-Cache-Status 헤더 값인 MISS, HIT, EXPIRED 를 구현하고, Cache-Control 헤더의 값을 지정할 수 있어야 합니다.
- 캐시 기간은 5초로 지정합니다.
- 매 요청의 결과는 X-Cache-Status 헤더의 값이 아래 스크린샷 값과 같이, MISS ,HIT, EXPIRED와 같은 값이어야 합니다.
- X-Cache-Status의 순서는 MISS, HIT, (5초 후) EXPIRED 순서로 응답이 와야 합니다.
- myname : devops01-이름 (예시, devops01-kimyeorae)
Ex)

원래 페어활동은 TIL 안 할려고 했는데 생각해보니 제일 TIL이 필요한게 페어, 팀프로젝트인거 같아서 하기로 했다.
일단 요구사항에 myname, X-Real-IP , Host가 1번 요구 사항이었으며 공식문서를 참고 하라 하였다.
myname나 Host는 따로 설명이 필요 없을거 같고 X-Real-IP는 애플리케이션에서 Client IP를 확인하기 위해 사용하는 헤더값이라한다.
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
공식 문서에 "HTTP 프록시 서버에 요청을 전달하기 위해 proxy_pass 지시문이 location 내부에 지정됩니다" 라고 나와있으며 위와 같이 예시까지 이쁘게 쓰여있다. "아마 저기에 원서버의 ip주소와 포트번호를 치면 되겠다"라는 추측을 했다.
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
공식 문서에 해당 코드가 있었고 내용을 읽어보니 "이걸 활용하면 되겠다"라고 생각했다. 위치도 친절히 location or higher라고 알려줬고 나는 location에 해당 코드를 복사 붙여넣기 한 다음 수정하였다.

이렇게 해당값을 넣고 포트번호 localhost:10026번을 여니 요구사항을 성공적으로 해결했다.

이제 캐싱 기능을 포함 시켜야한다.
$curl -I http://localhost:10026를 터미널에 입력 할 시 로컬호스트의 응답을 결과물로 볼 수 있었고 여기에 요구하는 캐싱 기능이 응답결과에 나오게 해야 했었다. 그래서 참고된 공식문서1과 2를 보았다.
공식문서 1를 보면 처음부터 응답 캐싱 활성화라며 나와있다.
http {
# ...
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
}
http 하위에 cache_path 값을 넣으면 되는거 같고 경로에는 내 nginx 경로와 cache폴더를 만들어 넣었고 캐시가 호출되면 불리는 폴더인가보다. keys_zone은 캐시된 항목에 대한 메타데이터를 저장하는 데 사용되는 공유 메모리 영역의 이름과 크기를 정의한다 되있는걸 보니 mycache에 10메가크기까지만 저장하나보다.
그후 proxy_cache서버 응답을 캐시할 컨텍스트(프로토콜 유형, 가상 서버 또는 위치)에 지시문을 포함하고 지시문(이 경우 )에 대한 keys_zone매개변수로 정의된 영역 이름을 지정합니다
http {
# ...
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
server {
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}
이렇게 나와있었다. proxy_cache mycahe를 넣어 캐시를 활성화 시켰다.
그럼 응답캐싱은 활성화 시켰고 이제 캐시 기간을 설정할 차례다.
캐싱 제한 또는 비활성화에 이걸로 제한 시킬 수 있다 나왔으며 상태코드에 따라 제한을 따로 시킬 수 있지만 any를 입력하면 모든 상태코드를 똑같이 제한한다.
proxy_cache_valid any 5m;
5초 제한을 해야하니 5s로 바꿔 입력하고 캐시응답을 공식문서 2를 보았다.
add_header X-Cache-Status $upstream_cache_status;
이 코드를 사용하면 캐싱 상태를 리턴한다고 한다. 그럼 miss 했는지 hit 했는지 값이 나온다. 해당 값을 넣고 curl -I 를 입력했다



이렇게 잘 나온다. 근데 miss는 해당 캐시가 없어야 뜨는 상태인데 그럼 처음에만 뜨는거고 다시 볼려면 캐시를 지워야한다. 그래서 캐시를 지우는 코드를 찾아보니
