사이트에 ssl을 적용하지 않으면 안되는 상황이 많아지면서 nginx에서 요청을 받아 ssl을 풀고 실제로 요청을 처리하는 docker container로 전달하는 경우가 많아졌습니다. 작업을 하다가 이와 같은 경우에 어떻게 해야되는지를 정리해보았습니다
아래는 docker container들을 관리해주는 docker-compose.yml입니다.ㄷ
//docker-compose.yml
version: '2'
services:
janus-gateway:
image: janus-gateway
environment:
- DOCKER_IP=${DOCKER_IP}
nginx:
image: nginx:1.14.2
container_name: nginx
ports:
- "8088:8088"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- /path/to/ssl:/ssl
depends_on:
- janus-gateway
실제로 요청을 처리하는 컨테이너는 janus-gateway이고, nginx는 단순히 ssl을 해제하여 맞는 포트로 포워딩만 시켜줍니다.
nginx가 외부에서 접근하는 8088포트를 바인딩하여 자신의 컨테이너의 8088포트로 보내줍니다.
//nginx.conf
http {
server {
listen 8088;
ssl on;
server_name YOUR_DOMAIN;
ssl_certificate /path/to/certificate;
ssl_certificate_key /path/to/key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_redirect off;
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_pass http://janus-gateway:8088;
}
}
}
그 후 nginx에서 nginx.conf에서 nginx가 docker-compose.yml에서 설정하였듯 외부포트의 8088로 접근하는 요청을 내부 8088포트로 돌려줬기때문에 `listen 8088`을 사용하여 내부포트 8088에 바인딩해줍니다.
ssl을 해제한 이후 http://<docker 컨테이너 이름>:<실제 포트>로 전달하여줍니다.
여기까지는 간단한데, 헷갈렸던 점이 위의 docker-compose.yml같이 janus-gateway 컨테이너에 아무 port가 명시되어있지 않으면 외부로부터 요청을 받지 못하는 줄 알았는데, 내부포트는 전부 열려있고, 단지 자체적으로 외부 포트로의 바인딩이 되어있지 않은점입니다. 따라서 외부포트로부터의 요청을 하나도 받지 못하지만 위처럼 nginx가 내부의 8088번 포트로 포워딩해주는 요청들은 전부 받을 수 있습니다.
또, 처음에는 이 사실을 몰랐기에:
//docker-compose.yml
version: '2'
services:
janus-gateway:
image: janus-gateway
ports:
- "9088:8088"
environment:
- DOCKER_IP=${DOCKER_IP}
nginx:
image: nginx:1.14.2
container_name: nginx
ports:
- "8088:8088"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- /path/to/ssl:/ssl
depends_on:
- janus-gateway
//nginx.conf
http {
server {
listen 8088;
ssl on;
server_name YOUR_DOMAIN;
ssl_certificate /path/to/certificate;
ssl_certificate_key /path/to/key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_redirect off;
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_pass http://janus-gateway:9088;
}
}
}
위와 같이 docker-compose.yml에서 janus-gateway를 9088번 포트에서 요청을 받아서 실제로 요청을 처리하는 8088번 포트로 포워딩해주고(왜냐하면 8088번으로부터 외부에서 들어오는 요청에는 ssl이 적용되어있어 nginx에서 ssl을 해제하여 포워딩해주어야합니다), 외부에서 8088번포트로 들어오는 요청은 nginx에서 받아서 janus-gateway 컨테이너의 9088번 포트로 포워딩해주었습니다.
해보니 당연히 작동이 되지않았습니다. janus-gateway에서 바인딩한 9088번포트는 해당 컨테이너가 돌아가고있는 물리적인 머신의 9088번 포트로 들어오는 요청을 컨테이너의 8088번포트로 연결해주는 것이었기때문에, nginx에서 컨테이너의 9088번포트로 보내주어도, 요청을 받지 못합니다.
'개발 > 백엔드' 카테고리의 다른 글
Dependency Injection이 무엇인지 알아보자 (0) | 2023.04.26 |
---|---|
Apache vs NginX vs Tomcat (0) | 2020.03.30 |
[Django 공식문서 번역] Class-based Views - 1. Introduction (0) | 2020.03.18 |
[Web Server 이해하기] Apache vs Nginx (0) | 2020.03.18 |
[Web Server 이해하기] CGI / WAS / WSGI (0) | 2020.03.18 |