Dev
NGINX - PROXY - 서브도메인 설정하기
foxlee
2022. 2. 16. 22:09
EC2의 잦은 이슈들로 IP가 변경(탄력적 IP 설정으로 지금은 고정됨)되거나, 포트를 정리하면서 포트가 변경되는 일들이 많았다. 이때마다 프론트에서 API 주소를 변경하는 일이 불필요하게 생겨 이참에 서브도메인을 적용하기로 함.
* https://hub.docker.com/r/jwilder/nginx-proxy
기존
- 현재 진행 했던 모든 프로젝트들에는 Nginx를 사용하고 있었다
- 클라이언트(ip:1234주소로 접근) -> Nginx(외부 포트(1234) 개방 O) -> Guicorn -> Flask
- 클라이언트(ip:1235주소로 접근) -> Nginx(외부 포트(1235) 개방 O) -> Express
- 이방식인데 앞에 서브도메인을 설정해주고 해석해서 프록시 해주는 Nginx를 하나 더 추가했다.
변경 이후
- 클라이언트(flask.domain.com) -> Nginx proxy(외부 포트 80 개방) -> Nginx(포트 개방x) -> Guicorn -> Flask
- 클라이언트(express.domain.com) -> Nginx proxy(외부 80 개방 위와 동일) -> Nginx(포트 개방x) -> Express
# ./nginx-proxy/docker-compose.yml
version: '3'
services:
nginx-proxy:
container_name: nginx-proxy
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx/log:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
networks:
default:
external:
name: nginx-proxy
1. 위와 같이 작성한후 docker-compose up -d --build 를 하면 네트워크 nginx-proxy 를 생성하라고 한다. 그럼 네크워크를 생성해주고 다시 실행시킨다.
2. 간단한 예 - NGINX 디폴트 페이지 연결
# ./nginx-www/docker-compose.yml
version: '3'
services:
nginx-www:
image: nginx:latest
environment:
- VIRTUAL_HOST=www.mydomain.kr - 호스팅 서비스 사이트에서 도메인 설정 먼저 해야함
container_name: nginx-www
networks:
default:
external:
name: nginx-proxy
3. 위와 같이 작성한 후 nginx-www(2번) nginx-proxy(1번)에서도 docker-compose up -d --build (+--force-recreate)해주주면
4. 1번에서 볼륨설정해준 nginx/conf.d/default.conf 아래부분에 아래와 같이 업데이트 된걸 볼 수 있다.
~~~~~~~~~~~
# www.mydomain.kr
upstream www.mydomain.kr {
## Can be connected with "nginx-proxy" network
# nginx-www (docker container name)
server 172.20.0.16:80;
}
server {
server_name www.mydomain.kr;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http:/www.mydomain.kr;
}
}
5. Exress / Flask 앱 같은 경우에는 환경변수만 추가해주면 됨
# ./project/docker-compose.yml
version: "3"
services:
flask: (또는 express)
~~ flask 설정
nginx:
~~ nginx 설정(이 nginx는 flask으로 프록시해줌)
environment:
- "VIRTUAL_HOST=${DOMAIN}" # ./project/.env 에 DOMAIN 변수
networks:
default:
external:
name: nginx-proxy
6. 마찬가지로 ./project/ 에서 docker-compose up 과 nginx-proxy도 다시 재실행시켜주면
# DOMAIN
upstream DOMAIN {
## Can be connected with "nginx-proxy" network
# [Project nginx container name]
server 172.20.0.16:80;
}
server {
server_name DOMAIN; 내가 호스팅에서 설정한 도메인
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://DOMAIN; 위 upstream으로 프록시
}
}
위와 같이 업데이트 됨
리버스 프록시와 포워드 프록시
- 리버스 프록시(위와 같은 경우) : 클라이언트 -> 인터넷 -> 프록시 -> 서버
- 보안, 서버를 감출수 있다. 또는 로드밸런싱(upstream에서 여러개의 서버 설정해서 최소 연결/ 해시를 통한 같은 서버 연결)
- 포워드 프록시 : 클라이언트 -> 프록시 -> 인터넷 -> 서버
- 특정 사이트 접근 제한
- 동일한 요청의 경우 캐싱
- 서버측에 클라이언트 정보 숨길 수 있음