20-1. 리버스 프록시란?
- 일반적인 프록시는 네트워크 상의 다른 구성 요소를 대신해 트래픽을 처리하는 네트워크 구성 요소를 말한다.
- 리버스 프록시는 컨테이너로 실행되어, 애플리케이션 컨테이너(업스트림)와 연결해줌으로써 앱 컨테이너의 포트를 외부(다운스트림)에 공개시키지 않는다.
- 엔진엑스(Nginx)와 트래픽(Traefik)을 주로 사용한다.
# 1. 사이트에 대한 엔진엑스 프록시 설정 파일
server {
server_name whoami.local; # 도메인
location / (
proxy_pass http://whoami; # 콘텐츠가 위치한 주소
proxy_set_header Host $host; # 호스트 정보를 콘텐츠 위치로 설정
add_header X-Host $hostname; # 응답의 호스트 정보를 프록시 이름으로 변경
)
}
20-2. 리버스 프록시의 라우팅과 SSL 적용하기
- 엔진엑스를 재시작할 때 사이트별 설정파일을 읽은 후 접근가능한지 확인하기 때문에 앱 컨테이너 실행->사이트 설정파일 엔진엑스 컨테이너에 복사->엔진엑스 컨테이너 재시작 순서를 지켜야한다.
- 리버스 프록시는 로드밸런싱까지 수행하기에 스웜이나 쿠버네티스 없이도 적용가능하다.
- SSH인증서를 중앙 프록시에 설정하여 애플리케이션 컴포넌트마다 설정하지 않아도 된다.
# 2. HTTP연결을 리다이렉트하는 HTTPS 설정
server{
server_name image-gallery.local;
listen 80;
return 301 https://$server_name$request_uri;
}
server{
server_name image-gallery.local;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/server-cert.pem;
ssl_certificate_key /etc/nginx/xerts/server-key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
20-3. 프록시를 이용한 성능 및 신뢰성 개선
- nginx 프록시 설정에 사용자 정의 응답 헤터 X-Cache를 포함시켜 캐싱 프록시로 두면 고성능 활용이 가능하다. 아래는 초당 5000번의 요청이 들어온다는 가정하에, 1분동안 캐싱되게 설정한 파일이다.
# 3. 캐시 프록시 설정
...
location = /api/image{
proxy_pass http://iotd/image;
proxy_set_header Host $host;
proxy_cache SHORT; # 캐시 규격
proxy_cache_valid 200 1m; # 용량과 유효시간
}
location /{
proxy_pass http://image-gallery;
proxy_set_header Host $host;
proxy_cache LONG;
proxy_cache_valid 200 6h;
proxy_cache_use_stale error timeout invalid_header updating # proxy_cache_use_stale은 업스트림이 사용불가할 때 만료된 캐시라도 사용하여 서비스를 제공하는 설정이다.
http_500 http_502 http_503 http_504;
...
}
20-4. 클라우드 네이티브 리버스 프록시
- 리버스 프록시 도구 중 하나인 트래픽(Traefik)은 설정파일 없이 컨테이너 레이블 추가로 적용가능하다.
# 4. 컨테이너 레이블로 트래픽 자동 설정
services:
whoami:
labels:
- "traefik.enable=true"
- "traefik.http.route.whoami.rule=Host('whoami.local')"
- 트래픽은 도커 엔진 접속 채널이 리눅스와 윈도에서 서로 다르기에 오버라이드 파일이 따로 있다.
- 트래픽은 외부 트래픽을 주시하는 포트인 엔트리 포인트, 요청을 컨테이너 배정하는 라우터, 업스트림 컴포넌트인 서비스, 라우터와 서비스 사이에서 서비스에 전달되는 요청을 변경하는 미들웨어로 작동된다.
- 트래픽은 캐시를 지원하지 않지만 SSL 지원이 굉장히 잘돼있기에 자동으로 인증서 갱신까지 된다.
- 현대 애플리케이션은 최대한 많은 부분을 Stateless하게 만들어야 수평확장과 로드밸런싱이 극대화된다. 이를 위해 트래픽은 같은 사용자 요청은 깉은 컨테이너로 라우팅되게 하는 sticky session(사용자에게 컨테이너 쿠키를 부여)을 지원한다.
20-5. 리버스 프록시를 활용한 패턴의 이해
- 클라이언트 요청에 포함된 호스트 명에 따라 HTTP or HTTPS를 제공
- MSA에서 일부만 노출
- 모놀리식 설계 애플리케이션을 컨테이너로 이주하여 프론트엔드 역활을 프록시에 맡김