Nginx Proxy Manager


  • Nginx 기반 웹 기반의, 인터페이스를 통해 사용자가 간단하게 리버스 프록시를 설정하고 관리할 수 있도록 도와주는 도구

  • 리버스 프록시? 트래픽이 요청되는 출발점으로 부터 외부망 사이에 위치한 프록시 서버를 포워드 프록시 클라이언트의 요청을 받아 적절한 서버로 전달하고, 서버의 응답을 클라이언트에 반환하는 중개 서버가 바로 리버스 프록시(쉽게 이해하자면, 백엔드 서버 쪽 망에 위치한 중개서버)

Reference


Github: https://github.com/NginxProxyManager/nginx-proxy-manager

Official Docs: https://nginxproxymanager.com/

Quick Setup


(사전에 docker가 설치되어있다고 가정)

docker-compose.yml 작성

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    # Uncomment the next line if you uncomment anything in the section
    # environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

docker-compose.yml

docker compose up -d 입력하여 간단하게 Nginx Proxy Manager + MariaDB 구성 완료.

그런데 Nginx Proxy Manger 관리자 페이지에서 이뤄지는 데이터를 저장할 DB를 따로 구성해야하는게 일반적이다. 이 또한 간단히하기 위해 공식문서에서는 MySQL관련 컨테이너 구성도 아래와 같이 추가 설명하고있다.

docker-compose.yml (MySQL 추가 구성 버전)

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # Mysql/Maria connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
      MARIADB_AUTO_UPGRADE: '1'
    volumes:
      - ./mysql:/var/lib/mysql

docker-compose.yml (MySQL 컨테이너 추가 구성버전)

⚠️
공식문서 일부 내용: Please note that the jc21/mariadb-aria:latest image might have some problems on some ARM devices, if you want a separate database container, use the yobasystems/alpine-mariadb:latest image.

컨테이너가 구성 완료되고나면 localhost:81에 접속하여 관리자 화면이 정상적으로 뜨는걸 볼수있음

초기 계정 정보 Email: [email protected] / Password: changeme

Customization


나는 이 오픈소스를 좀 더 커스텀해보기로.

그러기 위해 위 절차와는 다르게 소스코드 clone 및 수정 후 Nginx Proxy Manager를 실행할 수 있어야했는데, 그 어디에서도 이를 위한 가이드를 찾을 수 없었다.

결국 직접 소스코드 분석. 아래의 내용들을 확인할 수 있었다.

  • frontend, backend에 대한 디렉토리 구성. 그 내부에 각각 다른 package.json 파일 존재

  • yarn.lock 파일 존재 ⇒ 패키지 설치 매니저 npm 보단 yarn이 사용되는 것으로 추측 npm install시 에러. yarn install 시 패키지 설치 정상 확인.

  • docker 내부에 각종 docker-compose 파일 확인.

  • docker-compose.dev.yml 파일 기준으로 도커 컨테이너 실행하는것으로 추측.

  • docker compose -f docker-compose.dev.yml up -d 실행해보니 해당 파일 기반으로 컨테이너 구성 후 dev 디렉토리 Dockerfile을 읽고 컨테이너 내부 후속처리가 이루어지는 것을 확인.

  • 컨테이너 내부에서 yarn install 실행 확인 → frontend, backend 각각에서 직접 패키지 설치 필요 X

  • rootfs 디렉토리의 폴더가 npm_core 컨테이너에 마운트 ←서버 설정을 여기서 컨트롤 해볼 수 있겠다.