# Reverse Proxy : Nginx Proxy Manager

# Nginx Proxy Manager 소개

[![npm_snapshot1.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/KeKWNhyyT7m2PKqS-npm-snapshot1.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/KeKWNhyyT7m2PKqS-npm-snapshot1.png)

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

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

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

<p class="callout success">[https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/](https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/)</p>

# 사전준비

# Database 설치

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

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

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

[ ![mariadb1.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb1.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb1.png)

<span class="syno-fontsize-x-small">2. MariaDB에 Nextcloud Database 및 사용자 생성을 위해 Synology Package 센터에 있는 phpMyAdmin을 설치 합니다.</span>

<span class="syno-fontsize-x-small"> 1) "데이터베이스 &gt; 새로운"에서 "npm"로 신규 Database를 생성 합니다.</span>

<span class="syno-fontsize-x-small">[ ![mariadb2.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb2.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb2.png)</span>

<span class="syno-fontsize-x-small"> 2) "npm" Database를 선택하고 우측 상단의 "권한"을 선택 합니다.</span>

<span class="syno-fontsize-x-small"> [![mariadb3.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb3.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb3.png)</span>

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

 그런 후 전체적 권한에 "모두 체크"를 선택하여, 사용자가 <span class="syno-fontsize-x-small">Database의 모든 권한을 사용할 수 있게 설정 합니다.</span>

<span class="syno-fontsize-x-small">[![mariadb4.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/mariadb4.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/mariadb4.png)</span>

# 설치

# Docker 설치

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

```shell
mkdir /volume1/docker/npm/data
mkdir /volume1/docker/npm/letsencrypt
```

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

```yaml
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 포트 설정은 **<span style="color: rgb(224, 62, 45);">시놀로지의 경우 DSM에서 이미 80 (http)과 443 (https) 포트를 사용 중</span>**이라 정상적인 Docker Container 설정이 불가합니다. 이런 사유로 80은 8080, 443은 8443으로 포트 맵핑을 설정하였습니다.

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

```shell
 docker-compose up -d
```

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

<table border="1" id="bkmrk-%EC%99%B8%EB%B6%80%ED%8F%AC%ED%8A%B8-%EB%82%B4%EB%B6%80%ED%8F%AC%ED%8A%B8-%EB%B9%84%EA%B3%A0-80-8080" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><tbody><tr><td class="align-center">외부포트</td><td class="align-center">내부포트</td><td class="align-center">비고</td></tr><tr><td class="align-center">80</td><td class="align-center">8080</td><td class="align-center">http</td></tr><tr><td class="align-center">443</td><td class="align-center">8443</td><td class="align-center">https</td></tr></tbody></table>

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

[![admin_page.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/admin-page.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/admin-page.png)

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

<p class="callout success">Email address : admin@example.com  
Password : changeme</p>

[![admin_page2.png](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/admin-page2.png)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/admin-page2.png)

# 인증서 설치

# Cloudflare 예제

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

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

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

[![SSL1.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl1.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl1.jpg)

**<span style="color: rgb(224, 62, 45);">"Add SSL Certificate &gt; Let's Encrypt" </span>**<span style="color: rgb(0, 0, 0);">를 선택 합니다.</span>

[![SSL2.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl2.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl2.jpg)

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

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

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

[![SSL4.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl4.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl4.jpg)

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

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

[![SSL3.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl3.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl3.jpg)

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

[![SSL5.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl5.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl5.jpg)

\[Credentials File Content\]

<p class="callout success">\# Cloudflare API token  
dns\_cloudflare\_api\_token = Token 값</p>

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

[![SSL6.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl6.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl6.jpg)

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

[![SSL_choice.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl-choice.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl-choice.jpg)

# Host 설정

# Proxy Host 추가

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

[![add_host1.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/add-host1.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/add-host1.jpg)

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

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

[![add_host2.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/add-host2.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/add-host2.jpg)

1\. Details

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

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

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

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

[![add_host3.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/add-host3.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/add-host3.jpg)

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

[![SSL_choice.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/ssl-choice.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/ssl-choice.jpg)

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

[![add_host4.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/add-host4.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/add-host4.jpg)

"cloud.dhcloud.me"라는 소스가 정상 등록 되었고, Status가 정상적인<span style="color: rgb(224, 62, 45);"> **"Online"**</span>임을 확인 할 수 있습니다.

[![add_host5.jpg](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/scaled-1680-/add-host5.jpg)](https://wiki.dhcloud.me/uploads/images/gallery/2023-06/add-host5.jpg)