[Sprint] Proxy Server

# 학습 목표

  • 리버스 프록시(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 서비스를 중지하거나 재시작하지 않고도 설정 파일을 업데이트할 수 있습니다. 이 명령어는 설정 파일을 변경했을 때, 새로운 요청은 새로운 설정에 따라 처리되지만 현재 처리 중인 요청은 이전 설정을 따라 처리


#References

Leave a Comment