Nginx Proxy Manager로 HTTPS 연결, 포트 없는 깔끔한 주소를 사용해보자
Reverse Proxy

Reverse Proxy는 웹 서버 앞 단에 위치하여 클라이언트로부터 오는 요청을 대신 받아 내부 백엔드 서버로 전달하고 응답을 다시 클라이언트에게 반환하는 중계서버이다.
주요 장점은
- 보안 강화 : Original server가 직접 인터넷에 노출되지 않는다.
- Load Balancing : 여러 백엔드 서버로 트래픽을 분산 시켜 부하를 분산한다.
- Encryption : SSL 인증을 중앙집중화 하여 관리가 용이하다
특히 홈 서버에서는 아래와 같은 장점을 가진다.
- 서비스 별로 포트포워딩을 구성하지 않아도 된다.
mydomain.com:1523같은 지저분한 포트 번호가 붙은 접속 주소를 사용하지 않고service.mydomain.com과 같이 깔끔한 접속 주소를 사용할 수 있다.- Let's Encrypt를 활용해 HTTPS연결을 위한 SSL인증이 간편하다.
이번 포스팅에서는 Nginx Proxy Manager(NPM)을 사용해 Reverse Proxy를 사용해보겠다.
Prerequisite
- Docker, Dokcer compose

- Domain
Install via Docker Compose
디렉토리 구성 후 docker-compose.yml 파일을 연다
nano docker-compose.ymldocker-compose.yml
services:
nginxpm:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
environment:
TZ: "Asia/Seoul"
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt위 파일을 붙여 넣는다.
80번 포트는 Http, 443포트는 Https, 81번 포트는 웹 콘솔 접속을 위해 사용된다.
ctrl + X -> y로 저장 후 종료 한 뒤 docker compose up -d로 실행한다.
포트포워딩 설정
기존에는 게이트웨의 특정 포트로 들어오는 연결을 포트포워딩을 통해
내부망 웹서버의 서비스 중인 포트로 일일히 연결해서 사용했을 것이다.
Reverse Proxy 사용 시에는 모든 연결을 Proxy 서버로 보낸 뒤
Proxy서버에서 주소를 보고 알맞는 서비스로 연결해준다.
AWS, GCP, OCI와 같은VPS에서는 단순히 80, 81, 443 포트만 열어두면 된다.
집 내부 망이라면 일반적으로 게이트웨이 역할을 하는 공유기에서
포트포워딩 설정을 해야 한다.
(Iptime 기준: 고급 설정 -> NAT/라우터 관리 -> 포트포워드 설정)
80(http), 443(https) 포트를 각각 Nginx Proxy Manager가 올라간 서버의 80, 443으로 포워딩 해준다.
HTTP 연결 설정
[IP주소 or 도메인 주소]:81 로 웹 콘솔에 접속한다.
로그인 창이 나올 텐데 초기 로그인 정보는 아래와 같다.ID : admin@example.com
PW: changeme
로그인 한 후 비밀번호 변경과 정보 입력을 마치면 Dashboard에 접속할 수 있다.
Proxy Hosts -> 우 상단 Add Proxy Host에서 호스트를 추가할 수 있다.
Domain Name: 서비스에 접속 할 도메인 주소
Scheme: 서버가 서비스와 연결 할 때 사용할 프로토콜, http or https중 선택
Forward Hostname / IP: 서버가 연결 할 주소
Forward Port: 서버가 연결 할 포트
위와 같이 구성하면 Http 연결은 무리없이 사용할 수 있다.
만약 https://service.mydomain.com으로 접속한다면 인증서 에러가 뜨거나 접속할 수 없을 것이다.
Let's Encrypt를 통해 SSL인증서를 받고 Https연결까지 사용해보자
Let's Encrypt SSL 발급
Cloudlfare API 토큰 발급
API 토큰 생성
영역 DNS 템플릿 편집
적절한 토큰 이름과 권한, 리소스를 설정한다.
이 페이지에서 벗어나면 토큰을 다시 확인할 수 없다.
발급 받은 API 토큰을 복사해 둔다.
Nginx Proy Manager에서 SSL 등록
SSL Certificates -> Add SSL Certificates -> Let's Encrypt 선택
Domain names: *.[구입한 도메인]
Use a DNS Challenge: True
DNS Provider: Cloudflare
Credentials File Content에서 token=뒷 부분을 복사해둔 토큰으로 바꾼다.
Domain names는 *.[도메인] 형식으로 와일드 카드를 사용하면
하나의 인증서로 모든 2차 도메인을 사용할 수 있다.
발급 후 Proxy Host에 적용을 하지 않았다면 STATUS는 Inactive로 뜬다.
SSL 적용
다시 Nginx Proxy Manager 콘솔로 들어와 생성해둔 Proxy Host를 편집하거나
Add Proxy Host를 연다.
SSL에서 발급받은 인증서 선택, Force SSL, HTTP/2 Support를 켜고 Save
HTTPS 연결 확인
이제 Proxy Host에서 설정한 주소로 접속하면 Https 접속이 정상적으로 되는 것을 확인할 수 있다.
https://[도메인주소]로 접속

인증서도 Let's Encrypt에서 정상적으로 발급 된 것을 확인할 수 있다.
이렇게 Cloudflare와 Let's Encrypt를 이용해 Nginx Proxy Manager에서
단순 Reverse Proxy 뿐만 아니라 SSL인증서 발급을 통한 HTTPs 연결까지 설정할 수 있다.