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.com
→192.168.1.100:3000
app2.domain.com
→192.168.1.101:8080
webhook.domain.com
→192.168.1.102:3001
요구사항
사전 준비사항
- Proxmox VE 환경 (6.0 이상)
- 도메인 이름 (DNS A 레코드 설정)
- 공인 IP 또는 포트 포워딩 설정
- 기본적인 Docker 지식
Proxmox 컨테이너 생성
NPM 전용 LXC 컨테이너를 생성합니다. GUI를 통해 진행하겠습니다.
Proxmox 웹 인터페이스에서 진행:
-
좌측 패널에서 노드 선택 → Create CT 클릭
-
General 탭 설정:
- CT ID:
200
(또는 사용 가능한 ID) - Hostname:
nginx-proxy-manager
- Password: 안전한 패스워드 설정
- SSH public key: 필요시 추가
- CT ID:
-
Template 탭 설정:
- Storage:
local
(또는 사용 가능한 스토리지) - Template:
ubuntu-22.04-standard
- Storage:
-
Disks 탭 설정:
- Disk size:
8GB
(충분함) - Storage: 기본값 유지
- Disk size:
-
CPU 탭 설정:
- Cores:
1
(NPM은 리소스를 많이 사용하지 않음)
- Cores:
-
Memory 탭 설정:
- Memory:
512MB
- Swap:
512MB
- Memory:
-
Network 탭 설정:
- Bridge:
vmbr0
- IPv4:
Static
선택 - IPv4/CIDR:
192.168.1.200/24
(네트워크에 맞게 조정) - Gateway:
192.168.1.1
(라우터 IP)
- Bridge:
-
DNS 탭 설정:
- DNS domain: 도메인 입력 (선택사항)
- DNS servers:
8.8.8.8 1.1.1.1
-
Confirm 탭에서 설정 확인 → Finish 클릭
컨테이너 생성 완료
컨테이너가 생성되었습니다. 이제 시작하고 접속해보겠습니다.
Docker 설치 및 기본 설정
생성된 컨테이너에 Docker를 설치하고 기본 환경을 구성합니다.
Proxmox GUI에서 컨테이너 접속:
- 좌측 패널에서 생성한 컨테이너(200) 선택
- Console 탭 클릭
- Start 버튼을 클릭하여 컨테이너 시작
- Console 창에서 root로 로그인
또는 SSH로 접속:
{ssh root@192.168.1.200}
Nginx Proxy Manager 설치
Docker Compose를 사용하여 NPM을 설치하고 설정합니다.
{`# 작업 디렉터리 생성
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_here
와 root_password_here
를 강력한 패스워드로 변경하세요!
{`# 서비스 시작
docker compose up -d컨테이너 상태 확인docker compose ps로그 확인docker compose logs -f nginx-proxy-manager`}
초기 설정 및 관리자 계정 생성
웹 브라우저를 통해 NPM에 접속하여 초기 설정을 완료합니다.
NPM 웹 인터페이스 접속
브라우저에서 관리 인터페이스에 접속합니다
접속 방법:
- 웹 브라우저에서
http://192.168.1.200:81
접속 - 기본 로그인 정보로 로그인:
- Email:
admin@example.com
- Password:
changeme
- Email:
초기 설정 단계: 3. 로그인 후 즉시 관리자 정보 변경 화면이 나타남 4. 새로운 이메일 주소와 이름 입력 5. 강력한 새 패스워드 설정 6. Save 클릭하여 변경사항 저장
NPM 설치 완료
Nginx Proxy Manager 설치가 완료되었습니다! 이제 프록시 호스트를 추가하고 SSL 인증서를 설정할 수 있습니다.
첫 번째 프록시 호스트 추가
실제 서비스를 프록시하는 호스트를 GUI에서 설정해보겠습니다.
NPM 웹 인터페이스에서 진행:
-
메인 대시보드에서 "Proxy Hosts" 클릭
-
"Add Proxy Host" 버튼 클릭
-
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: 필요시 체크
- Domain Names:
-
Advanced 탭 (선택사항):
- 추가 Nginx 설정이 필요한 경우 여기서 입력
-
"Save" 클릭
DNS 설정 필요
프록시 호스트를 추가하기 전에 도메인의 A 레코드가 NPM 서버의 공인 IP를 가리키도록 DNS 설정이 되어 있어야 합니다.
고급 설정 및 관리
NPM의 고급 기능들을 설정하여 더 안전하고 효율적으로 관리합니다.
Access Lists로 IP 기반 접근 제어:
-
좌측 메뉴에서 "Access Lists" 클릭
-
"Add Access List" 버튼 클릭
-
기본 정보 입력:
- Name:
Admin Access Only
- Pass Auth: 체크 해제 (IP만으로 제어)
- Name:
-
Authorization 설정:
- Satisfy:
All
선택 - Access:
- Allow:
192.168.1.0/24
(내부 네트워크만 허용) - Deny:
all
(나머지 모든 IP 차단)
- Allow:
- Satisfy:
-
프록시 호스트에 적용:
- 해당 프록시 호스트 편집
- Details 탭에서 Access List 선택
접근 제어 활용
관리자 인터페이스나 민감한 서비스에는 반드시 접근 제어를 설정하여 보안을 강화하세요.
백업 및 복원 설정
NPM 설정과 SSL 인증서를 정기적으로 백업하는 시스템을 구성합니다.
{`#!/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"`}
{`# 실행 권한 부여
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.com
→192.168.1.100:3000
(Next.js 앱)api.example.com
→192.168.1.101:8080
(API 서버)db-admin.example.com
→192.168.1.102:8081
(phpMyAdmin)monitor.example.com
→192.168.1.103:3001
(모니터링 도구)
SSL 인증서: 모든 서비스에 자동으로 Let's Encrypt 적용
보안 설정:
db-admin
과monitor
는 내부 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으로 통합 관리
- 모니터링 및 로그 분석 시스템 구축