Nginx Proxy Manager(NPM)는 Nginx 리버스 프록시와 Let's Encrypt 인증서 발급을 웹 화면에서 다루는 도구다. 내부에서 실제로 하는 일은 도메인별 server 블록을 만들어 /data/nginx/proxy_host/<id>.conf 에 쓰고 Nginx 를 재적재하는 것이다.
따라서 문제가 생기면 결국 Nginx 설정 문제로 환원된다. 화면에서 안 되는 것은 Advanced 탭에 Nginx 지시자를 직접 넣어 해결하는 경우가 많다.
| 포트 | 용도 |
|---|---|
| 80 | HTTP. ACME HTTP-01 검증에도 쓰인다 |
| 443 | HTTPS |
| 81 | 관리 UI |
# docker-compose.yml
services:
npm:
image: jc21/nginx-proxy-manager:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
docker compose up -d
docker compose logs -f npm
첫 접속은 http://<호스트>:81 이며 초기 계정으로 로그인한 뒤 즉시 비밀번호를 바꾼다. 관리 UI 는 인터넷에 직접 노출하지 않는다. 내부망에서만 접근하게 하거나 방화벽으로 출발지를 제한한다.
프록시 대상이 같은 호스트의 컨테이너라면 같은 도커 네트워크에 두고 컨테이너 이름으로 지정하는 편이 낫다. 호스트 IP 와 공개 포트를 쓰면 대상 컨테이너의 포트를 외부에 열어야 한다.
Hosts → Proxy Hosts → Add Proxy Host 에서 만든다.
| 항목 | 설명 |
|---|---|
| Domain Names | 이 프록시가 받을 도메인. server_name 이 된다. 여러 개 등록 가능 |
| Scheme | 백엔드로 보낼 프로토콜. 내부 통신이면 대개 http |
| Forward Hostname / IP | 백엔드 주소 |
| Forward Port | 백엔드 포트 |
| Cache Assets | 정적 자원 캐시 |
| Block Common Exploits | 알려진 공격 패턴 차단. 일부 애플리케이션에서 오탐이 있다 |
| Websockets Support | WebSocket 업그레이드 허용. 채팅 · 터미널 · 실시간 UI 에 필요 |
SSL 탭에서 인증서를 발급하거나 기존 인증서를 선택하고, Force SSL · HTTP/2 Support 를 켠다. HSTS Enabled 는 인증서 자동 갱신이 확실해진 뒤에 켠다.
# 어떤 응답이 어디서 나오는지
curl -I https://app.example.com
# Host 헤더를 강제해 라우팅만 시험
curl -I -H "Host: app.example.com" http://<NPM_IP>/
# NPM 이 만든 설정 파일
docker exec -it npm sh -c 'ls /data/nginx/proxy_host/ && cat /data/nginx/proxy_host/1.conf'
# 설정 문법
docker exec -it npm nginx -t
nginx -t 가 실패하면 UI 에서 저장은 되어도 반영되지 않는다. Advanced 에 넣은 지시자에 오타가 있을 때 이 상태가 된다.
http://<호스트>:81 로 접속했는지 확인한다. 80 으로 접속하면 프록시 대상이 없어 기본 사이트(404)가 나온다.docker compose ps
docker compose logs --tail=100 npm
ss -lntp | grep -E ':80|:443|:81'
proxy_pass 의 슬래시 규칙과 Nextcloud · Guacamole 사례.