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

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

Reverse Proxy

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
Docker, Docker-compose 설치
Docker 설치 1. 패키지 업데이트, 의존성 패키지 설치 sudo apt-get update sudo apt-get install ca-certificates curl 2. Docker 공식 GPG key 등록 sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r
  • Domain
나만의 인터넷 주소를 홈 서버에 연결해보자(feat. Cloudflare, DDNS)
인터넷을 사용할 때 주소 창에 172.217.213.100과 같은 진짜 ip 주소가 아닌 google.com같은 도메인 주소를 사용한다. 이것이 가능한 이유는 DNS(Domain Name System)서버가 도메인 주소를 ip주소로 변환해 주기 때문이다. 이번 포스팅에서는 도메인 주소 구매 후 DDNS설정까지 완료하여 홈 서버에 연결하는 과정을 소개하겠다. 도메인 구입 도메인 판매는

Install via Docker Compose

디렉토리 구성 후 docker-compose.yml 파일을 연다

nano docker-compose.yml

docker-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에 접속할 수 있다.

Dashbooard

Proxy Hosts -> 우 상단 Add Proxy Host에서 호스트를 추가할 수 있다.

new 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 토큰 발급

cloudflare profile

API 토큰 생성

영역 DNS 템플릿 편집

적절한 토큰 이름과 권한, 리소스를 설정한다.

api token

이 페이지에서 벗어나면 토큰을 다시 확인할 수 없다.
발급 받은 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에 적용을 하지 않았다면 STATUSInactive로 뜬다.

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 연결까지 설정할 수 있다.