오라클 클라우드에 nginx proxy manager를 도커로 올려서 리버스 프록시 쓰시는 분들께 도움이 될만한 내용입니다.
기존까지 제가 본 글들은
npm의 Forward Hostname / IP 부분에 오라클 서버 아이피를 기입하고
+ 오라클 클라우드 사이트의 네트워크 방화벽에서 해당 포트를 열어줘야만 했습니다.
Hostname 부분에 127.0.0.1이나 localhost를 입력하면 안되더라고요.
분명 홈서버에서는 127.0.0.1을 넣어도 잘 작동했는데, 오라클 클라우드에서는 작동하지 않아서
왜그럴까 생각만 하다가 오늘 이유와 방법을 찾은 것 같아서 공유하고자 합니다.
https://nginxproxymanager.com/advanced-config/#best-practice-use-a-docker-network
위 링크를 참고하였습니다.
결론부터 말하면, 같은 도커 네트워크 내에 속해있지 않았기 때문에 127.0.0.1이 먹히지 않았던 것 같습니다.
집의 헤놀로지에 설치된 npm은 네트워크가 host로 되어 있어서 127.0.0.1이 작동했던 것이고요.
그래서 오라클 클라우드의 npm도 host 네트워크로 설정하려고 알아봤지만 실패했고, 대신 같은 네트워크에 속하게 하는 방식으로 성공했습니다.
이 스크린샷처럼 서버 주소를 기입하기 않아도 리버스 프록시가 작동하도록 하는 방법입니다.
일단 ssh로 오라클 클라우드에 접속해서
docker network create scoobydoo
를 입력하여 네트워크를 하나 만들어줍니다. scoobydoo는 예제 사이트에 있던 것으로, 이름은 자유롭게 하셔도 됩니다.
그 뒤에, npm이랑 npm을 사용하는 모든 서비스의 docker-compose.yml 파일에 아래 구문을 추가합니다.
networks:
default:
external:
name: scoobydoo
이제 npm UI 화면으로 돌아와서 hostname에는 docker-compose.yml에 적힌 서비스 이름을, 포트에는 기본 포트를 입력하면 됩니다.
서비스 이름은 아래 빨간색으로 밑줄친 부분입니다.
기본 포트는 docker-compose에서 포트 맵핑하실 때 ports:- 8923:9000에서 뒷부분 9000 입니다.
docker-compose.yml에서 포트 맵핑 부분은 완전히 삭제하셔도 됩니다.
따로 ports 맵핑하지 않아도 작동하더라고요.
이렇게 하시면 오라클 클라우드 방화벽에서 포트 여신걸 삭제하셔도 정상적으로 리버스 프록시로 접속할 수 있었습니다.
docker-compose 말고 docker run -d 옵션으로 실행한 컨테이너도 네트워크 옵션을 주면 될 것 같은데, 공식 사이트에 방법이 나와있지 않아 자세한 것은 모르겠습니다.
이제 80, 443 포트만 개방하면 되니까 기분이 좋습니다 ㅎㅎ
저는 오라클 클라우드 arm에서 돌리기 위해 jc21/nginx-proxy-manager:github-develop 태그 이미지를 사용하고 있습니다. 그래서인지 아니면 다른 이유에서인지 network_mode: host가 안 되는 것 같더라고요...
host network에서 동작시키고 루프백 아이피를 기입하는게 가장 깔끔한 방법 같습니다.
https://github.com/jc21/nginx-proxy-manager/issues/1128
지금 다시 보니까 latest도 arm64 지원하나봐요
docker-compose에 network_mode: host 이부분만 추가해주고 nginx포트가 8080이면
80:8080으로 해주면 되는것인지요?
아... 이걸 진짜 찾고있었는데 돌아버리겠더라고요
자고일어나서 해봐야겠습니다 감사합니다
일단 이대로 하면 로컬호스트나 127.0.0.1작동하겠지요..?
시놀로지에서는 그냥 역방향 프록시만 사용했는데
npm설치시에도 nginx설치하고 포트 바꿔줘야하나요
아님 npm자체가 스텐드얼론인가요?
여태 npm설정에서 80:80 부분이 문제인가 싶어서 계속 변경했거든요...
오라클 클라우드에서 80 443 포트만 열어준 다음, npm docker-compose에서 80→80, 443→443 포트 맵핑해주시면 되요. 역방향 프록시를 사용하는 다른 서비스(예를들면 portainer)는 포트 맵핑해주실 필요가 없구요.
따로 포트를 열지 않아도 접속이 잘 되더라구요.
아래는 NPM의 Docker-Compose입니다.
```
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
ports:
- '80:80'
- '8081:81'
- '443:443'
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "-"
DB_MYSQL_PASSWORD: "-"
DB_MYSQL_NAME: "-"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
db:
image: 'jc21/mariadb-aria:latest'
environment:
MYSQL_ROOT_PASSWORD: '-'
MYSQL_DATABASE: '-'
MYSQL_USER: '-'
MYSQL_PASSWORD: '-'
volumes:
- ./data/mysql:/var/lib/mysql
```
오라클의 IP정책은 100%는 이해하지 않고 있으나
VM 삭제하고 다시 만들지 않는 이상 Private IP는 안 변할겁니다.
참고하시라고 제 설정 올립니다.