SSL 적용을 완료하고, 서버에 리버스 프록시를 적용하려고 한다.

위 그림처럼 서버단의 프록시 서버가 모든 요청을 받아서 처리해준다.
내가 생각하는 큰 장점으로는
1. 호스트의 포트를 노출시키지 않아도 된다.
2. 모든 요청에 공통적으로 SSL 적용이 가능하다.
그러면 이제 Nginx 를 구축해보자
NginX 는 굳이 dockerfile 을 둘 필요가 없다 ! docker Compose 에서 포트는 지정하고
엔진엑스 기본 설정으로 포트 포워딩을 진행한다 !
config.conf 에는 기본 스레드 수 등을 조정할 수 있으나, 현재 수준에서는 건들일게 없다
또한 conf.d 에 로드 밸런싱 설정을 할수있다. Nginx는 실행시 해당 디렉터리에 들어있는 conf 파일들을 모두 include 해서 사용한다 .
vi default.conf
server {
listen 80;
listen [::]:80;
server_name dangil.store;
access_log off;
location /.well-known/acme-challenge/ {
allow all;
root /var/www/certbot;
}
location / {
// return 301 https://$host$request_uri;
return 308 https://$host$request_uri;
}
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name dangil.store;
include /etc/nginx/conf.d/service-color.inc;
# 서트봇이 볼륨으로 남겨두는 인증서를 가지고 이미지를 만들었고 엔진엑스 컨테이너에서 해당 인증서를 사용한다.
ssl_certificate /etc/letsencrypt/live/dangil.store/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dangil.store/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 부적절한 헤더도 요청을 허용한다.
ignore_invalid_headers off;
location /api/ws {
resolver 127.0.0.11 valid=30s;
proxy_pass http://spring_$spring_color:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location /api {
resolver 127.0.0.11 valid=30s;
proxy_pass http://spring_$spring_color:8080;
proxy_set_header X-Forwarded-Host $server_name;
# 디폴트로 IP는 프록시로 변경되고 난뒤에 (리버스 프록시 기능)
# 원래의 요청의 헤더에 설정을 수정 및 추가한다
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
따라서 나는 해당 설정을 통해서 리버스 프록시의 기본 설정을 지정해줬다.
http 요청시 https로 redirect 해주고 있다.
vi service-url.inc
set $spring_color blue;
추후 가변적인 로드 밸런싱을 위해 컨테이너 이름( 도커 DNS )를 환경변수로 지정했다.
해당 Nginx 를 공부하며 의문점이 들었다...
포트와 http/https 의 개념이 확실하게 잡히지 않았다.
그러면 dangil.store:9999 | dangil.store/jenkins
→ 이렇게 들어오는 요청은 다르다 !
첫번째 요청은 http 던 https 던 중요하지 않다 왜? 포트를 직접 정했기 때문이다 !
두번째 요청은 포트번호가 없기에 앞에 http | https 를 보고 포트번호에 접근한다 따라서 리버스 프록시를 타고 들어가는 것이다 !
이처럼 리버스 프록시는 포트번호를 숨겨주는 장점이 있다.
이후 컨테이너를 가동시키면 성공적으로 로드 되는것을 확인했다.
