Reverse Proxy : Nginx Proxy Manager

Nginx Proxy Manager 소개

npm_snapshot1.png

Open Souce Proxy Manager 입니다. Nginx Proxy Manager와 같은 Proxy Manager를 이용하는 목적은 역방향프록시 (Reverse Proxy)를 사용하기 위함 입니다.

역방향프록시 (Reverse Proxy)를 이용하면 웹 서버를 공격으로부터 보호하고 성능 및 안정성 이점을 제공할 수 있습니다.

아래 Cloudflare에서 설명하는역방향프록시 (Reverse Proxy)에 대한 소개를 참고 하시기 바랍니다.

https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/

사전준비

사전준비

Database 설치

1. Database는 MariaDB를 이용하며, Synology Package 센터에 있는 MariaDB 10을 예제로 설명 합니다.

    다른 DBMS가 이미 있다면 이 단계는 넘어가시면 됩니다.

2. Synology Package 센터에서 MariaDB 10 앱을 설치 후 "TCP/IP 연결 활성화"를 체크하고, 포트는 3306으로 설정 합니다.

   mariadb1.png

2. MariaDB에 Nextcloud Database 및 사용자 생성을 위해 Synology Package 센터에 있는 phpMyAdmin을 설치 합니다.

   1) "데이터베이스 > 새로운"에서 "npm"로 신규 Database를 생성 합니다.

 mariadb2.png

  2) "npm" Database를 선택하고 우측 상단의 "권한"을 선택 합니다.

 mariadb3.png

  3) 아래 예제와 같이 사용자명에 "npm"를 입력하고 암호와 재입력란에 사용하고자하는 암호를 입력 합니다.

      그런 후 전체적 권한에 "모두 체크"를 선택하여, 사용자가 Database의 모든 권한을 사용할 수 있게 설정 합니다.

mariadb4.png

설치

설치

Docker 설치

Docker Mapping 볼륨을 생성합니다. 아래는 디렉토리 위치 예제 입니다.

mkdir /volume1/docker/npm/data
mkdir /volume1/docker/npm/letsencrypt

아래 내용으로 "docker-compose.yml" 파일을 작성합니다.

version: "3.8"
services:
  nginx-proxy-manager:
  #app:
    image: 'jc21/nginx-proxy-manager:latest'
    #network_mode: host # option
    restart: unless-stopped
    ports:
      # network_mode: host
      # These ports are in format <host-port>:<container-port>
      - '8080:80' # Public HTTP Port
      - '8443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "DB_IP" # ex : 192.168.1.200
      DB_MYSQL_PORT: DB_PORT # ex : 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "DB_PW"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
      TZ: Asia/Seoul # option
    volumes:
      - '/volume1/docker/npm/data:/data'
      - '/volume1/docker/npm/letsencrypt:/etc/letsencrypt'
      - '/volume1/docker/npm/config.json:/app/config/production.json'

경로값 부분은 사용자 환경에 맞게 수정해 줍니다.

단, 8080, 8443 포트 설정은 시놀로지의 경우 DSM에서 이미 80 (http)과 443 (https) 포트를 사용 중이라 정상적인 Docker Container 설정이 불가합니다. 이런 사유로 80은 8080, 443은 8443으로 포트 맵핑을 설정하였습니다.

"docker-compose.yml"이 있는 위치로 이동 후 아래 명령을 실행 합니다.

 docker-compose up -d

마지막으로 아래 tcp 포트를 라우터에서 포트포워딩 해줍니다.

외부포트 내부포트 비고
80 8080 http
443 8443 https

“IP:81”로 접속하시면 관리자 페이지가 나옵니다.

admin_page.png

초기 계정은 아래와 같으며, 최초 로그인 후 수정해 주시면 됩니다.

Email address : admin@example.com
Password : changeme

admin_page2.png

인증서 설치

인증서 설치

Cloudflare 예제

먼저 80포트가 포트포워딩으로 개방 됐는지 확인 합니다. (80포트가 개방되지 않으면 인증서 설치가 불가 합니다.)

Nginx Proxy Manager의 관리자 페이지로 접속합니다.

메뉴 중 "SSL Certificates"로 이동 합니다.

SSL1.jpg

"Add SSL Certificate > Let's Encrypt" 를 선택 합니다.

SSL2.jpg

"Domains Names"에 인증서를 설치할 도메인을 입력합니다.

도메인은 기본도메인과 와일드카드 붙여 두개를 등록해 줍니다.

제 경우 "dhcloud.me"라는 도메인과 모든 서브 도메인을 포함시키도록 ""를 추가한 ".dhcloud.me"를 입력하였습니다.

SSL4.jpg

이메일 주소를 입력해 주시고, "Use DNS Challenge"를 활성화 시키면 DNS Provider를 선택할 수 있는 메뉴가 나타납니다.

제 경우 "Cloudflare" DNS를 이용하고 있어 "Cloudflare"를 선택 하였습니다.

SSL3.jpg

Credentials File Content에 Cloudflare에서 부여 받은 Token 정보를 넣어 줍니다.

SSL5.jpg

[Credentials File Content]

# Cloudflare API token
dns_cloudflare_api_token = Token 값

"Agree"를 활성화 시키고 "Save"를 눌러 줍니다.

SSL6.jpg

SSL 인증서 발급이 완료되면 이후 Proxy Host 등록 시 "SSL" 항목에 해당 인증서를 선택할 수 있게 됩니다.

SSL_choice.jpg

Host 설정

Host 설정

Proxy Host 추가

"Host > Proxy Hosts"로 이동 후 "Add Proxy Host"를 선택 합니다.

 

add_host1.jpg

기본적으로 내용을 넣오줘야 할 부분은 "Details"와 "SSL"부분 입니다.

나머지는 상황에 맞게 넣어주시면 됩니다.

add_host2.jpg

1. Details

아래는 "Nextcloud"에 대한 예제 입니다.

현재 셋팅된 "Nextcloud"는 서브도메인 "https://cloud.dhcloud.me"라는 서브도메인을 사용중이고,

내부 IP "192.168.1.200"과 내부포트 "8888"을 이용 중입니다.

이 부분에 대한 사용자 환경에 맞는 정보를 아래와 같이 넣어주시면 됩니다.

add_host3.jpg

정보 입력 후 "SSL" 탭으로 이동 후 발급 받은 인증서를 선택 합니다.

SSL_choice.jpg

이후 아래와 같이 설정 후 "Save"를 눌러 줍니다.

add_host4.jpg

"cloud.dhcloud.me"라는 소스가 정상 등록 되었고, Status가 정상적인 "Online"임을 확인 할 수 있습니다.

add_host5.jpg