Nginx Proxy · 12 min read · Nov 20, 2025
Docker로 Nginx Proxy Manager 설치 및 사용 방법

리버스 프록시는 다른 웹 서버나 웹 서비스 앞에 위치할 수 있는 웹 서버입니다. 이는 나가는 트래픽을 암호화하고, 로드 밸런서 역할을 하며, 트래픽을 리디렉션하고, 보호 기능을 제공합니다. Nginx 웹 서버는 전통적인 서버 앞에서 프록시 서버로 사용할 수 있지만, 때때로 설정이 번거롭고 제대로 이루어지지 않으면 문제가 발생할 수 있습니다.
Nginx Proxy Manager는 Let’s Encrypt를 사용한 내장 SSL 지원, 여러 호스트 지원, HTTP 인증, 접근 목록 및 사용자 관리와 같은 기능을 제공하는 그래픽 사용자 인터페이스(GUI)를 통해 Nginx를 프록시 서버로 설정하는 것을 쉽게 만들어주는 애플리케이션입니다.
이 튜토리얼에서는 Docker를 사용하여 Linux 서버에 Nginx 프록시 관리자를 설치하는 방법을 배웁니다. 우리는 하나의 튜토리얼에서 모든 인기 있는 Linux 배포판을 다룰 것입니다.
전제 조건
- 최소 1GB의 RAM을 갖춘 Ubuntu/Debian/CentOS/Alma Linux/Rocky Linux를 실행하는 Linux 서버.
- sudo 권한이 있는 비루트 사용자.
- 서버를 가리키는 완전한 도메인 이름(FQDN) 예:
npm.example.com.
1단계 - 방화벽 구성
Cent OS/Rocky Linux/Alma Linux
Firewalld 방화벽이 설치되어 있어야 합니다. 방화벽의 상태를 확인하세요.
$ sudo firewall-cmd --state
running
포트 80, 81 및 443을 엽니다.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --permanent --add-port=81/tcp
변경 사항을 적용하기 위해 방화벽을 다시 로드합니다.
$ sudo firewall-cmd --reload
Ubuntu/Debian
Ubuntu 및 Debian 시스템은 기본적으로 ufw(간단한 방화벽)를 사용합니다.
방화벽이 실행 중인지 확인하세요.
$ sudo ufw status
실행 중이라면 포트 80, 81 및 443을 엽니다.
$ sudo ufw allow 80
$ sudo ufw allow 81
$ sudo ufw allow 443
방화벽이 실행 중이지 않다면 SSH 포트를 엽니다.
$ sudo ufw allow "OpenSSH"
방화벽이 실행 중이지 않다면 활성화합니다.
$ sudo ufw enable
실행 중이라면 변경 사항을 적용하기 위해 다시 로드합니다.
$ sudo ufw reload
2단계 - Docker 설치
Cent OS/Rocky Linux/Alma Linux
다음 명령어를 실행하여 Docker를 설치합니다.
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
Ubuntu
$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
Debian
$ sudo apt install ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
Docker 서비스를 활성화하고 시작합니다.
$ sudo systemctl start docker --now
사용자를 Docker 그룹에 추가합니다.
$ sudo usermod -aG docker $USER
시스템에서 로그아웃하고 다시 로그인하여 변경 사항을 적용합니다.
3단계 - Docker Compose 설치
Docker compose 바이너리를 다운로드하고 설치합니다.
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
바이너리에 실행 권한을 부여합니다.
$ sudo chmod +x /usr/local/bin/docker-compose
4단계 - Docker Compose 파일 생성
Nginx 프록시 관리자를 위한 디렉토리를 생성합니다.
$ mkdir ~/nginx-proxy
디렉토리로 이동합니다.
$ cd ~/nginx-proxy
사용자 데이터 및 SSL 인증서를 위한 디렉토리를 생성합니다.
$ mkdir {data,letsencrypt}
편집을 위해 docker-compose.yml 파일을 생성하고 엽니다.
$ nano docker-compose.yml
다음 코드를 붙여넣습니다.
version: "3"
services:
npm-app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm-app
restart: unless-stopped
ports:
- '80:80' # 공용 HTTP 포트
- '443:443' # 공용 HTTPS 포트
- '81:81' # 관리자 웹 포트
# 노출하려는 다른 스트림 포트를 추가하세요
# - '21:21' # FTP
environment:
DB_MYSQL_HOST: "npm-db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm"
DB_MYSQL_NAME: "npm"
# 호스트에서 IPv6가 활성화되지 않은 경우 아래 줄의 주석을 제거하세요
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- npm-db
networks:
- npm-nw
- npm-internal
npm-db:
image: 'mariadb:latest'
container_name: npm-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes:
- ./data/mysql:/var/lib/mysql
networks:
- npm-internal
networks:
npm-internal:
npm-nw:
external: true
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 나타나면 Y를 입력합니다.
파일을 살펴보겠습니다. 파일의 첫 번째 부분은 Nginx 프록시 관리자의 이미지를 가져오고 데이터베이스 자격 증명의 형태로 몇 가지 환경 변수를 설정하는 곳입니다. 우리는 서버에 접근하기 위해 포트 80, 81 및 443을 노출합니다. FTP 접근을 위해 21과 같은 더 많은 포트를 노출할 수 있습니다. DISABLE_IPV6: 'true' 줄의 주석을 제거하여 IPV6 지원을 비활성화할 수 있습니다. 우리는 데이터 및 SQL 저장을 위해 호스트에서 Docker로 여러 디렉토리를 매핑했습니다.
여기서 두 개의 네트워크를 사용하고 있습니다. 하나는 프록시 관리자와 데이터베이스를 연결하기 위한 내부 네트워크 npm-internal입니다. 이는 자동으로 생성되므로 선택 사항입니다. 그러나 여기서는 이름을 수동으로 지정하여 수동으로 생성하고 있습니다.
프록시 관리자 컨테이너에 npm-nw라는 외부 네트워크를 추가했습니다. 이 네트워크는 프록시 관리자를 설치하는 다른 Docker 컨테이너에 연결하는 데 필수적입니다. 네트워크를 사용하면 서버에 포트를 노출할 필요 없이 모든 컨테이너를 직접 연결할 수 있습니다.
5단계 - Nginx Proxy Manager 실행
Docker 컨테이너를 시작하기 전에 외부 네트워크 npm-nw를 생성해야 합니다. 내부 네트워크는 자동으로 생성됩니다. 다음 명령어를 실행하여 외부 네트워크를 생성합니다.
$ docker network create npm-nw
다음 명령어를 사용하여 Docker 컨테이너를 시작합니다.
$ docker-compose up -d
컨테이너의 상태를 확인합니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c91ca0ddca97 jc21/nginx-proxy-manager:latest "/init" About a minute ago Up About a minute 0.0.0.0:80-81->80-81/tcp, :::80-81->80-81/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp npm-app
1738d71b95da mariadb:latest "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp npm-db
6단계 - Nginx Proxy Manager 접근
이제 http://yourserverIP:81 URL을 통해 Nginx 프록시 관리자에 접근할 수 있습니다. 다음 로그인 화면이 표시되어야 합니다.

다음 기본 자격 증명을 입력하여 로그인합니다.
이메일 주소: [email protected] 비밀번호: changeme
다음으로 이름과 이메일 주소를 설정하라는 메시지가 즉시 표시됩니다.

저장 버튼을 클릭하면 새 비밀번호를 설정하라는 메시지가 표시됩니다.

다시 저장 버튼을 클릭하면 이제 애플리케이션을 사용할 수 있습니다.

브라우저에서 http://yourserverIP URL을 열면 프록시 관리자가 설정한 기본 페이지로 이동합니다.

7단계 - Nginx Proxy Manager의 도메인 이름 및 SSL 설정
Nginx 프록시 관리자에 접근하기 위한 도메인 이름을 설정해 보겠습니다. 이 단계는 선택 사항이지만 SSL 뒤에 애플리케이션을 두고 싶다면 유용합니다.
대시보드 메뉴에서 호스트 >> 프록시 호스트를 클릭하여 프록시 호스트 페이지를 엽니다. 거기에서 프록시 호스트 추가 버튼을 클릭하여 진행합니다.

FQDN 이름(npm.example.com)을 추가하고 클릭합니다. 서버의 IP 주소와 81을 포워드 포트로 입력합니다.
SSL 탭으로 전환합니다.

드롭다운 메뉴에서 새 SSL 인증서 요청을 선택합니다. SSL 강제 적용 및 HTTP/2 지원 옵션을 선택합니다. HSTS를 활성화하려면 해당 옵션도 활성화할 수 있습니다. Cloudflare를 통해 도메인을 구성한 경우 SSL 강제 적용 옵션을 활성화하지 마세요. 그렇지 않으면 리디렉션 루프에 갇힐 수 있습니다.
이메일 주소를 입력하고 Let’s Encrypt 서비스 약관(TOS)에 동의한 후 저장 버튼을 클릭하여 완료합니다.

당신의 도메인은 활성화되어 작동해야 합니다. 브라우저에서 https://npm.example.com을 열어보세요. Nginx 프록시 관리자의 로그인 화면이 표시되어야 합니다.
기본 랜딩 페이지에 대해서도 동일하게 수행하고 https://example.com과 같은 도메인 이름을 할당할 수 있습니다. 프록시 호스트를 설정할 때 포트를 81에서 81로 변경하기만 하면 됩니다.
8단계 - 다른 Docker 웹 애플리케이션과 함께 Nginx Proxy Manager 사용
이제 프록시 관리자를 설치했으므로 이를 활용할 시간입니다. 우리가 할 첫 번째 일은 다른 Docker 웹 애플리케이션을 호스팅하는 것입니다. 이를 위해 Ghost 블로그를 설치할 것입니다. 더 알고 싶다면 Ubuntu 서버에서 Docker를 사용하여 Ghost를 설치하는 튜토리얼을 확인하세요.
Ghost 블로그를 위한 또 다른 디렉토리를 생성합니다.
$ mkdir ~/ghost
Ghost 디렉토리로 이동합니다.
$ cd ~/ghost
콘텐츠와 데이터베이스를 위한 두 개의 디렉토리를 생성합니다.
$ mkdir {content,mysql}
같은 MySQL 이미지를 사용하더라도 데이터와 컨테이너를 프록시 관리자의 것과 분리해야 합니다. 이는 발생할 수 있는 문제를 격리하고 필요할 경우 이동할 수 있도록 도와줍니다.
편집을 위해 Docker compose 파일을 생성하고 엽니다.
$ nano docker-compose.yml
다음 코드를 붙여넣습니다. Ghost 블로그의 실제 도메인 이름으로 example.com을 바꾸세요. 이메일을 수신하려면 SMTP 세부 정보를 입력하세요. 필요하지 않다면 제거할 수 있습니다.
version: '3.3'
services:
ghost-app:
image: ghost:latest
container_name: ghost-app
restart: always
depends_on:
- ghost-db
environment:
url: https://ghost.example.com
database__client: mysql
database__connection__host: ghost-db
database__connection__user: ghost
database__connection__password: ghostdbpass
database__connection__database: ghostdb
mail__transport: SMTP
mail__options__host: {Your Mail Service host}
mail__options__port: {Your Mail Service port}
mail__options__secureConnection: {true/false}
mail__options__service: {Your Mail Service}
mail__options__auth__user: {Your User Name}
mail__options__auth__pass: {Your Password}
volumes:
- /home//ghost/content:/var/lib/ghost/content
networks:
- npm-nw
- ghost-network
ghost-db:
image: mariadb:latest
container_name: ghost-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_mysql_root_password
MYSQL_USER: ghost
MYSQL_PASSWORD: ghostdbpass
MYSQL_DATABASE: ghostdb
volumes:
- /home//ghost/mysql:/var/lib/mysql
networks:
- ghost-network
networks:
ghost-network:
npm-nw:
external: true
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 나타나면 Y를 입력합니다.
보시다시피, 우리는 Ghost 컨테이너를 Nginx 프록시 관리자와 외부 네트워크 npm-nw를 사용하여 연결했습니다. 이렇게 하면 Ghost의 포트를 시스템에 노출하지 않게 됩니다. 또한 Ghost 앱과 해당 데이터베이스 컨테이너를 연결하기 위해 내부 네트워크 ghost-network를 사용했습니다.
컨테이너를 시작합니다.
$ docker-compose up -d
Nginx Proxy Manager에서 Ghost 구성
이제 Ghost 설치를 위한 리버스 프록시를 설정해야 합니다. 브라우저에서 Nginx 프록시 관리자를 열고 대시보드 >> 호스트 >> 프록시 호스트로 이동하여 새 프록시 호스트를 추가합니다.

Ghost 블로그를 위해 선택한 도메인 이름을 추가합니다. 호스트 이름/IP 값에는 컨테이너의 이름을 입력합니다. 이 경우 ghost-app이 됩니다. 여기서는 IP 주소를 추가할 수 없습니다. 왜냐하면 Ghost의 포트를 서버에 노출하지 않았기 때문에 Nginx 프록시가 IP를 통해 Ghost에 접근할 수 없기 때문입니다. 따라서 우리는 NPM이 Docker의 네트워크 npm-nw를 사용하여 접근할 수 있는 컨테이너 이름을 사용합니다. 포트에는 Ghost 블로그에서 사용하는 기본 포트인 2368을 사용합니다. 위 스크린샷에 표시된 다른 옵션을 확인하세요.
다음으로 SSL 탭으로 전환하고 6단계에 따라 새 SSL 인증서를 생성합니다. Ghost 블로그에 콘텐츠를 업로드할 것이므로 업로드에 대한 최대 업로드 크기를 설정하는 것이 좋습니다.
다행히도 NPM은 사용자 정의 구성을 추가할 수 있습니다. 고급 탭으로 전환하고 상자에 client_max_body_size 50m;를 입력합니다.

저장 버튼을 클릭하여 프록시 호스트 추가를 완료합니다. 이제 https://ghost.exampl.com URL을 통해 Ghost 블로그에 접근할 수 있어야 합니다.

9단계 - Nginx Proxy Manager를 리디렉션 서비스로 사용
NPM을 사용하여 한 도메인을 다른 도메인으로 쉽게 리디렉션하는 방법을 살펴보겠습니다. 이를 위해 대시보드 >> 호스트 >> 리디렉션 호스트로 이동합니다. 거기에서 리디렉션 호스트 추가 버튼을 클릭하여 시작합니다.

포워드할 도메인 이름을 입력합니다. 그리고 포워딩 도메인을 입력합니다. 포워딩 도메인은 이미 구성되어 있어야 합니다. 스킴은 자동으로 두세요. 필요에 따라 http 또는 https를 선택할 수 있습니다. 올바른 HTTP 코드를 선택하고 경로 유지 및 일반적인 악용 차단 옵션을 체크하세요. 자동 또는 https 스킴을 사용하는 경우 NPM을 사용하여 SSL 인증서를 선택하거나 생성했는지 확인하세요. 저장을 클릭하여 리디렉션 호스트 추가를 완료합니다.
당신의 도메인 example.com은 blog.example.com으로 리디렉션되기 시작해야 합니다.
Nginx Proxy Manager의 다른 용도
Nginx 프록시 관리자를 사용할 수 있는 다른 두 가지 방법이 있습니다. 404 호스트로 사용할 수 있습니다. 즉, 도메인을 랜딩 페이지로 사용하여 검색 엔진에 도메인 페이지가 존재하지 않음을 보여줄 수 있습니다. 이 단계는 도메인을 입력하고 SSL을 설정하는 것만 포함됩니다. 또한 도메인 이름의 로그를 추적하고 리퍼러 트래픽을 볼 수 있는 기회로 사용할 수 있습니다.
다른 기능은 NPM을 스트림 호스트로 사용하는 것입니다. 이 기능을 사용하여 TCP/UDP 포트를 네트워크의 다른 컴퓨터로 포워딩할 수 있습니다. 이는 게임 서버를 호스팅하는 경우 유용합니다. 필요한 것은 수신 포트, 포워딩 도메인 또는 IP 주소, 포워딩 포트 및 포트 유형을 입력하는 것입니다.

Nginx Proxy Manager를 사용하여 정적 웹사이트 호스팅
Nginx 프록시 관리자는 간단한 정적 또는 동적 웹사이트도 호스팅할 수 있습니다. 이를 위해 새 프록시 호스트를 추가하고 포워드 도메인으로 127.0.0.1을 선택하고 포트로 80을 선택합니다.

고급 탭에서 루트 디렉토리를 지정하는 구성을 입력합니다. 사이트의 루트 디렉토리가 초기 Docker compose 구성에 마운트되어 있는지 확인하세요. 여기서는 /data/static 디렉토리를 사용하여 정적 웹사이트를 호스팅합니다.

저장을 클릭하여 완료하면 사이트에 접근할 수 있어야 합니다. 프록시 관리자를 사용하여 모든 유형의 사이트를 호스팅할 수 있습니다.

10단계 - 기타 기능
Nginx Proxy Manager의 접근 제어 기능 사용
NPM의 접근 목록 기능을 사용하여 HTTP 인증을 활성화하거나 IP 범위를 차단할 수 있습니다. NPM을 열고 대시보드 >> 접근 목록 페이지로 이동합니다.
접근 목록 추가 버튼을 클릭하여 시작합니다.

접근 목록(ACL) 구성을 이름을 지정할 수 있습니다. Satisfy Any 탭이 체크되어 있으면 클라이언트가 지정된 조건 중 하나를 충족하면 접근이 허용됩니다. 클라이언트가 HTTP 인증을 통과하지만 IP 기반 접근에 실패할 경우에도 허용됩니다. 그러나 Satisfy Any 옵션이 체크 해제된 경우 클라이언트는 모든 조건을 충족해야 합니다.
Pass Auth to Host 기능은 인증 기능을 호스트 서버로 전달합니다.
다음으로 인증 탭으로 전환합니다. 여기에서 HTTP 인증 방법을 위한 사용자 이름과 비밀번호를 생성할 수 있습니다. 여러 사용자를 추가하려면 추가 버튼을 클릭하세요. 최대 5명의 사용자만 추가할 수 있습니다. 추가 버튼에 버그가 있으므로 먼저 버튼을 사용한 후 세부 정보를 입력하세요. 세부 정보를 입력하고 나중에 버튼을 클릭하여 다른 사용자를 추가하려고 하면 이전 사용자 데이터가 지워집니다.

접근 탭으로 전환합니다. 여기에서 어떤 IP 주소에 접근을 허용하거나 거부할지를 설정할 수 있습니다.

저장을 클릭하여 완료합니다.
이 접근 목록을 사용하려면 프록시 호스트를 추가할 때 선택해야 합니다. 아래 Ghost 블로그의 예와 같이 접근 목록을 선택했습니다.

더 많은 도메인 이름 지원 활성화
호스트와 도메인의 수가 증가함에 따라 Nginx는 해시 공간이 부족해지거나 메모리 문제에 직면할 수 있습니다. 이 문제를 해결하기 위해 모든 호스트에 적용될 사용자 정의 구성을 추가할 수 있습니다.
이를 위해 ~/nginx-proxy/data/nginx 내에 custom 디렉토리를 생성합니다.
$ sudo mkdir ~/nginx-proxy/data/nginx/custom
이 디렉토리 내에 http.conf 파일을 생성하고 엽니다.
$ sudo nano ~/nginx-proxy/data/nginx/custom/http.conf
다음 줄을 붙여넣습니다.
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;
파일을 저장하려면 Ctrl + X를 누르고 프롬프트가 나타나면 Y를 입력합니다.
Nginx는 이러한 값을 자동으로 수용해야 합니다. 그렇지 않으면 다음 명령어를 사용하여 NPM 컨테이너를 재시작할 수 있습니다.
$ docker restart npm-app
기본 랜딩 페이지 리디렉션
6단계에서 http:// URL을 입력하면 기본 페이지가 표시됩니다. 이를 변경하고 싶다면 가능합니다. 그렇게 하려면 설정 페이지로 이동합니다. 오른쪽에 있는 세 개의 점을 클릭하고 편집 버튼을 클릭합니다.

랜딩 페이지를 404 페이지, 리디렉션 페이지로 설정하거나 사용자 정의 페이지 옵션을 사용하여 사용자 정의 HTML을 추가할 수 있습니다. 리디렉션을 선택하면 대상 URL을 지정해야 합니다.

이것은 우리가 목적을 위해 사용한 사용자 정의 HTML입니다.
여기 아무것도 없습니다
이런!
불편을 드려 죄송하지만 여기에 있어서는 안 됩니다. 여기서는 아무것도 얻을 수 없습니다. 이 페이지는 HowtoForge Nginx Proxy Manager 가이드를 위해 설정되었습니다. 언젠가 무언가를 보여줄 수 있을 것입니다.
저장을 클릭하여 완료합니다. 랜딩 페이지가 아래와 같은 것으로 변경되어야 합니다.

11단계 - Nginx Proxy Manager 업데이트
NPM을 업데이트하려면 먼저 컨테이너를 중지합니다.
$ cd ~/nginx-proxy
$ docker-compose down --remove-orphans
최신 이미지를 가져옵니다.
$ docker-compose pull
컨테이너를 다시 시작합니다.
$ docker-compose up -d
결론
이 튜토리얼에서는 Nginx Proxy Manager를 설치하고 다른 Docker 컨테이너에 대한 프록시 호스트를 추가하고, 리디렉션 서비스로 사용하고, 이를 사용하여 접근을 제어하는 방법을 배웠습니다. 질문이 있으면 아래 댓글로 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.