Proxmox에서 Nginx Proxy Manager 구성 가이드

Proxmox 환경에서 GUI 기반으로 SSL 인증서와 리버스 프록시를 쉽게 관리하는 방법

Proxmox에서 Nginx Proxy Manager 구성 가이드

Nginx Proxy Manager(NPM)는 웹 GUI를 통해 리버스 프록시와 SSL 인증서를 쉽게 관리할 수 있는 도구입니다. Proxmox 환경에서 여러 서비스의 도메인과 SSL을 중앙에서 관리하는 완벽한 솔루션을 제공합니다.

Nginx Proxy Manager의 장점
  • 웹 GUI 기반 직관적인 관리 인터페이스
  • Let's Encrypt SSL 인증서 자동 발급 및 갱신
  • 여러 서비스를 하나의 도메인으로 통합 관리
  • 실시간 로그 모니터링 및 액세스 제어
  • Docker 기반 간편한 설치 및 업데이트

시스템 아키텍처

NPM 구성도

Nginx Proxy Manager를 통한 트래픽 라우팅

인터넷NPM (Port 80/443)내부 서비스들

  • app1.domain.com192.168.1.100:3000
  • app2.domain.com192.168.1.101:8080
  • webhook.domain.com192.168.1.102:3001

요구사항

사전 준비사항
  • Proxmox VE 환경 (6.0 이상)
  • 도메인 이름 (DNS A 레코드 설정)
  • 공인 IP 또는 포트 포워딩 설정
  • 기본적인 Docker 지식
1

Proxmox 컨테이너 생성

NPM 전용 LXC 컨테이너를 생성합니다. GUI를 통해 진행하겠습니다.

Proxmox 웹 인터페이스에서 진행:

  1. 좌측 패널에서 노드 선택Create CT 클릭

  2. General 탭 설정:

    • CT ID: 200 (또는 사용 가능한 ID)
    • Hostname: nginx-proxy-manager
    • Password: 안전한 패스워드 설정
    • SSH public key: 필요시 추가
  3. Template 탭 설정:

    • Storage: local (또는 사용 가능한 스토리지)
    • Template: ubuntu-22.04-standard
  4. Disks 탭 설정:

    • Disk size: 8GB (충분함)
    • Storage: 기본값 유지
  5. CPU 탭 설정:

    • Cores: 1 (NPM은 리소스를 많이 사용하지 않음)
  6. Memory 탭 설정:

    • Memory: 512MB
    • Swap: 512MB
  7. Network 탭 설정:

    • Bridge: vmbr0
    • IPv4: Static 선택
    • IPv4/CIDR: 192.168.1.200/24 (네트워크에 맞게 조정)
    • Gateway: 192.168.1.1 (라우터 IP)
  8. DNS 탭 설정:

    • DNS domain: 도메인 입력 (선택사항)
    • DNS servers: 8.8.8.8 1.1.1.1
  9. Confirm 탭에서 설정 확인Finish 클릭

컨테이너 생성 완료

컨테이너가 생성되었습니다. 이제 시작하고 접속해보겠습니다.

2

Docker 설치 및 기본 설정

생성된 컨테이너에 Docker를 설치하고 기본 환경을 구성합니다.

Proxmox GUI에서 컨테이너 접속:

  1. 좌측 패널에서 생성한 컨테이너(200) 선택
  2. Console 탭 클릭
  3. Start 버튼을 클릭하여 컨테이너 시작
  4. Console 창에서 root로 로그인

또는 SSH로 접속:

bashSSH 접속
{ssh root@192.168.1.200}
3

Nginx Proxy Manager 설치

Docker Compose를 사용하여 NPM을 설치하고 설정합니다.

/opt/nginx-proxy-manager/docker-compose.ymlyaml
{`# 작업 디렉터리 생성
mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-managerdocker-compose.yml 파일 생성cat > docker-compose.yml << 'EOF'
version: '3.8'services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:Public HTTP Port:
'80:80'
Public HTTPS Port:
'443:443'
Admin Web Port:
'81:81'
volumes:
./data:/data
./letsencrypt:/etc/letsencrypt
environment:
MySQL/MariaDB connection parametersDB_MYSQL_HOST: "mysql"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm_password_here"
DB_MYSQL_NAME: "npm"Uncomment this if IPv6 is not enabled on your hostDISABLE_IPV6: 'true'depends_on:
mysql
mysql:
image: 'mysql:8.0'
container_name: nginx-proxy-manager-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'root_password_here'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm_password_here'
volumes:
./mysql:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
volumes:
data:
letsencrypt:
mysql:
EOF`}
보안 설정 변경 필수

프로덕션 환경에서는 반드시 npm_password_hereroot_password_here를 강력한 패스워드로 변경하세요!

bashNPM 서비스 시작
{`# 서비스 시작
docker compose up -d컨테이너 상태 확인docker compose ps로그 확인docker compose logs -f nginx-proxy-manager`}
4

초기 설정 및 관리자 계정 생성

웹 브라우저를 통해 NPM에 접속하여 초기 설정을 완료합니다.

NPM 웹 인터페이스 접속

브라우저에서 관리 인터페이스에 접속합니다

접속 방법:

  1. 웹 브라우저에서 http://192.168.1.200:81 접속
  2. 기본 로그인 정보로 로그인:
    • Email: admin@example.com
    • Password: changeme

초기 설정 단계: 3. 로그인 후 즉시 관리자 정보 변경 화면이 나타남 4. 새로운 이메일 주소와 이름 입력 5. 강력한 새 패스워드 설정 6. Save 클릭하여 변경사항 저장

NPM 설치 완료

Nginx Proxy Manager 설치가 완료되었습니다! 이제 프록시 호스트를 추가하고 SSL 인증서를 설정할 수 있습니다.

5

첫 번째 프록시 호스트 추가

실제 서비스를 프록시하는 호스트를 GUI에서 설정해보겠습니다.

NPM 웹 인터페이스에서 진행:

  1. 메인 대시보드에서 "Proxy Hosts" 클릭

  2. "Add Proxy Host" 버튼 클릭

  3. Details 탭 설정:

    • Domain Names: your-app.yourdomain.com 입력
    • Scheme: http 선택 (내부 서비스가 HTTP인 경우)
    • Forward Hostname / IP: 192.168.1.100 (대상 서버 IP)
    • Forward Port: 3000 (대상 서비스 포트)
    • Cache Assets: 체크 (선택사항)
    • Block Common Exploits: 체크 (보안 강화)
    • Websockets Support: 필요시 체크
  4. Advanced 탭 (선택사항):

    • 추가 Nginx 설정이 필요한 경우 여기서 입력
  5. "Save" 클릭

DNS 설정 필요

프록시 호스트를 추가하기 전에 도메인의 A 레코드가 NPM 서버의 공인 IP를 가리키도록 DNS 설정이 되어 있어야 합니다.

6

고급 설정 및 관리

NPM의 고급 기능들을 설정하여 더 안전하고 효율적으로 관리합니다.

Access Lists로 IP 기반 접근 제어:

  1. 좌측 메뉴에서 "Access Lists" 클릭

  2. "Add Access List" 버튼 클릭

  3. 기본 정보 입력:

    • Name: Admin Access Only
    • Pass Auth: 체크 해제 (IP만으로 제어)
  4. Authorization 설정:

    • Satisfy: All 선택
    • Access:
      • Allow: 192.168.1.0/24 (내부 네트워크만 허용)
      • Deny: all (나머지 모든 IP 차단)
  5. 프록시 호스트에 적용:

    • 해당 프록시 호스트 편집
    • Details 탭에서 Access List 선택
접근 제어 활용

관리자 인터페이스나 민감한 서비스에는 반드시 접근 제어를 설정하여 보안을 강화하세요.

7

백업 및 복원 설정

NPM 설정과 SSL 인증서를 정기적으로 백업하는 시스템을 구성합니다.

/opt/nginx-proxy-manager/backup.shbash
{`#!/bin/bash백업 설정BACKUP_DIR="/backup/nginx-proxy-manager"
DATE=$(date +%Y%m%d_%H%M%S)
COMPOSE_DIR="/opt/nginx-proxy-manager"백업 디렉터리 생성mkdir -p $BACKUP_DIRecho "Starting NPM backup process..."서비스 일시 중지 (선택사항 - 데이터 일관성을 위해)cd $COMPOSE_DIRdocker compose pause데이터 백업echo "Backing up NPM data..."
tar -czf "$BACKUP_DIR/npm-data-$DATE.tar.gz" -C $COMPOSE_DIR data letsencrypt mysqlMySQL 덤프 (추가 백업)echo "Creating MySQL dump..."
docker compose exec mysql mysqldump -u npm -pnpm_password_here npm > "$BACKUP_DIR/npm-mysql-$DATE.sql"서비스 재개docker compose unpause오래된 백업 파일 정리 (30일 이상)find $BACKUP_DIR -name ".tar.gz" -mtime +30 -delete
find $BACKUP_DIR -name ".sql" -mtime +30 -deleteecho "Backup completed: $BACKUP_DIR/npm-data-$DATE.tar.gz"
echo "MySQL dump: $BACKUP_DIR/npm-mysql-$DATE.sql"`}
bash백업 스크립트 설정
{`# 실행 권한 부여
chmod +x /opt/nginx-proxy-manager/backup.sh크론잡 설정 (매일 새벽 2시)crontab -e다음 라인 추가:0 2 * * * /opt/nginx-proxy-manager/backup.sh >> /var/log/npm-backup.log 2>&1`}
복원 방법

백업을 복원하려면: tar -xzf npm-data-YYYYMMDD_HHMMSS.tar.gz -C /opt/nginx-proxy-manager/ 실행 후 Docker Compose 재시작

실제 사용 예시

다중 서비스 구성 예시

하나의 NPM으로 여러 서비스를 관리하는 실제 사례

설정된 프록시 호스트들:

  • app.example.com192.168.1.100:3000 (Next.js 앱)
  • api.example.com192.168.1.101:8080 (API 서버)
  • db-admin.example.com192.168.1.102:8081 (phpMyAdmin)
  • monitor.example.com192.168.1.103:3001 (모니터링 도구)

SSL 인증서: 모든 서비스에 자동으로 Let's Encrypt 적용

보안 설정:

  • db-adminmonitor는 내부 IP만 접근 허용
  • 모든 서비스 HTTP→HTTPS 자동 리다이렉트
  • 보안 헤더 자동 적용

문제 해결

NPM 웹 인터페이스에 접속할 수 없는 경우:

  • 컨테이너 상태 확인: docker compose ps
  • 포트 충돌 확인: netstat -tlnp | grep :81
  • 방화벽 설정 확인: ufw status

프록시가 작동하지 않는 경우:

  • 대상 서비스가 실행 중인지 확인
  • 내부 네트워크 연결성 테스트: curl http://192.168.1.100:3000
  • NPM 로그 확인: docker compose logs nginx-proxy-manager

Let's Encrypt 인증서 발급 실패:

  • DNS A 레코드가 올바르게 설정되었는지 확인
  • 포트 80/443이 외부에서 접근 가능한지 확인
  • Rate Limit 확인 (시간당 5개, 일주일당 50개 제한)

고급 활용 방안

Enterprise 레벨 구성

대규모 환경에서의 NPM 활용 방안

고가용성(HA) 구성:

  • 여러 NPM 인스턴스를 로드밸런서 뒤에 배치
  • 공유 스토리지를 통한 SSL 인증서 동기화
  • 데이터베이스 클러스터링

모니터링 통합:

  • Prometheus + Grafana 연동
  • 로그 수집을 위한 ELK Stack 연동
  • 알림 시스템 (Slack, Discord) 연동

보안 강화:

  • WAF (Web Application Firewall) 통합
  • DDoS 보호 설정
  • IP 화이트리스트 자동화
NPM 구성 완료!

축하합니다! Nginx Proxy Manager가 성공적으로 구성되었습니다. 이제 웹 GUI를 통해 쉽게 여러 서비스의 도메인과 SSL 인증서를 관리할 수 있습니다.

다음 단계

  • GitHub Webhook CI/CD 가이드에서 NPM과 연동하여 자동 배포 구성
  • 추가 서비스들을 NPM으로 통합 관리
  • 모니터링 및 로그 분석 시스템 구축