TIL

23일차 네트워크 기초

김영재0412 2022. 5. 19. 00:12

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 순서로 응답이 와야 합니다.

Ex)

curl -I http://localhost:10026

원래 페어활동은 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를 터미널에 입력 할 시 로컬호스트의 응답을 결과물로 볼 수 있었고 여기에 요구하는 캐싱 기능이 응답결과에 나오게 해야 했었다. 그래서 참고된 공식문서12를 보았다. 

 

공식문서 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는 해당 캐시가 없어야 뜨는 상태인데 그럼 처음에만 뜨는거고 다시 볼려면 캐시를 지워야한다. 그래서 캐시를 지우는 코드를 찾아보니

inactive=n
 
이 코드를 넣으면 캐시를 n시간만큼 유지시키고 지운다. 그래서 나는 inactive=5s로 설정하여서 5초마다 캐시를 지워서 miss 상태도 확인 할 수 있었다.

 

 

결과

'TIL' 카테고리의 다른 글

25일차 AWS  (0) 2022.05.22
24일차 AWS  (0) 2022.05.19
22일차 네트워크 기초  (0) 2022.05.17
22일차 발표  (0) 2022.05.17
21일차 발표  (0) 2022.05.16