안녕하세요
오늘은 어제 소개드린 Nginx Proxy Manager (이하 NPM)을 설치하는 방법과 Reverse Proxy(역방향 프록시)를 설정하는 방법을 포스팅하겠습니다.
1. NPM이란?
Nginx의 프록시 기능을 세팅할 수 있도록 도와주는 애플리케이션으로
별도의 웹서버 설치없이 사용할 수 있도록 도와준다
- Tabler 기반으로 안전하게 관리해주는 인터페이스 제공
- Nginx에 대해 전혀 몰라도 Forwarding Domains, Redirections, Streams, 404 hosts를 생성
- Let's Encrypt를 사용한 무료 SSL 인증 또는 사용자 정의 SSL 인증서 제공
- 호스트의 액세스 목록 및 기본 HTTP 인증
- 고급 Nginx 구성
무슨 말인지 어려우시죠?
간단하게 설명드리면 웹 인터페이스를 통해서 본인의 도메인을 별도의 인증 절차 없이 SSL 인증을 해주고,
역방향 프록시를 통해서 포트 없이 도메인에 접속할 수 있도록 도와주는 기능을 제공합니다.
ex) 도메인.com:9999 --> subdoamin.도메인.com
2. NPM 도커 이미지 소개
1) jlesage/nginx-proxy-manager
- 간단한 설치
- mysql 내장으로 별도의 DB설치 필요 없음
2) jc21/nginx-proxy-manager
- 별도의 DB 설치 필요
- 상세 설정을 통한 커스텀 Nginx 설정 기능 제공
3. NPM 설치를 위한 Docker / Docker Compose 설치하기
1) docker 설치
## 도커 설치하기 curl -fsSL https://get.docker.com/ | sudo sh ## sudo 없이 사용하기 (현재 로그인한 사용자에게 권한 주기) sudo usermod -aG docker $USER ## sudo 없이 사용하기 (특정 사용자에게 권한 주기) sudo usermod -aG docker your-user ## 설치 확인 (정상) docker version Client: Version: 18.09.8 API version: 1.39 Go version: go1.11 Git commit: bfed4f5 Built: Fri Mar 13 06:46:11 2020 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.09.8 API version: 1.39 (minimum version 1.12) Go version: go1.11 Git commit: 3a371f3 Built: Fri Mar 13 06:44:35 2020 OS/Arch: linux/amd64 Experimental: false ## 설치 확인 (에러 발생) Error response from daemon: Bad response from Docker engine -> 이 경우 보통 sudo 를 입력 하지 않은 경우 발생합니다.
2) docker-compose 설치
## Docker Compose 다운로드
sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # https://github.com/docker/compose/releases 에서 다른 버전 다운로드 가능
## Docker Compose가 위치한 경로에 실행 권한 추가
sudo chmod +x /usr/local/bin/docker-compose
## 설치 확인
docker-compose --version
docker-compose version 1.24.0, build 0aa59064
## Docker Compose 삭제
sudo rm /usr/local/bin/docker-compose
3. NPM 설치하기 (Docker / Docker Compose)
1) jlesage/nginx-proxy-manager
docker run -d \
--name=nginx-proxy-manager \
-p 81:8181 \
-p 80:8080 \
-p 443:4443 \
-v /docker/appdata/nginx-proxy-manager:/config:rw \
jlesage/nginx-proxy-manager
--name 컨테이너의 이름 (원하는 데로 설정 가능)
-p 내부포트:컨테이너포트 내부 포트는 본인이 원하는 데로 설정 가능
(ssh에서 "netstat -ntpl"로 검색 후 나오지 않는 포트 사용 가능)
-v /본인경로:/config:rw 본인 경로에 NPM이 설치됨 (우측의 /config:rw는 수정 X)
2) jc21/nginx-proxy-manager
## docker-compose 파일을 저장할 디렉토리 생성
mkdir -p /volume1/docker/config/npm
## 컨테이너 내부 경로와 매칭할 디레토리 생성
mkdir -p /volume1/docker/appdata/npm/data
mkdir -p /volume1/docker/appdata/npm/letsencrypt
mkdir -p /volume1/docker/appdata/npm/mysql
## config.json 작성
nano /volume1/docker/config/npm/config.json
{ "database":
{ "engine": "mysql",
"host": "db",
"name": "npm",
"user": "npm",
"password": "npm",
"port": 3306
}
}
## docker-compose.yml 작성
nano /volume1/docker/config/npm/docker-compose.yml
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /volume1/docker/config/npm/config.json:/app/config/production.json
- /volume1/docker/appdata/npm/data:/data
- /volume1/docker/appdata/npm/letsencrypt:/etc/letsencrypt
db: image: 'jc21/mariadb-aria:10.4'
container_name: npm_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 'npm'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'npm'
volumes: - /volume1/docker/appdata/npm/mysql:/var/lib/mysql
## docker-compose 컨테이너 생성
docker-compose up -d
jc21님의 이미지는 별도의 DB를 설치해 주어야 합니다.
물론 docker-compose 파일에 함께 설정해주어 한번에 설치가 되기 때문에 크게 신경 쓰실 필요는 없습니다.
"본인IP:80"로 접속하여 위와 같은 화면이 나오면 정상적으로 설치된 것입니다.
4. NPM 접속 및 설정하기
1) 최초 접속하기
"본인아이피:81"로 접속하시면 위와 같은 화면이 나오는데,
아이디 : admin@example.com
비밀번호 : changeme
2) admin 계정 아이디 및 비밀번호 변경
"Email : 변경할 아이디 입력" 나머지는 설명 안 해도 아시겠죠?
3) 역방향 프록시 설정하기
신규 Proxy Host 추가 (Details 탭 설정)
- "Hosts -> Proxy Hosts -> Add Proxy Host"
- Domain Names : 서브도메인.도메인.com
- Scheme : http
- Forward Hostname / IP : 내부IP
- Forward Port : 내부포트
- Cache Assets 선택
- Block Common Exploits 선택
- Websockets Support 선택
신규 Proxy Host 추가 (SSL 탭 설정)
- Request a new SSL Certificate 선택
- Force SSL 선택
- HTTP/2 Support 선택
- HSTS Enabled 선택
4) SSL 인증 기간 확인 및 자동 갱신 설정하기
여기서 EXPIRES의 기간이 가기 전에 반드시 SSL을 갱신해주어야 합니다.
- 갱신 주기 : 90일 (만료 30일 이전부터 갱신 가능)
NPM의 단점? 인지 만약 갱신 기간을 놓쳐 버리면 DB가 꼬이면서 상당히 불편한 상황이 발생합니다.
(저도 최근에 한번 겪었죠 그 일로.... 하드까지 날려버리는 나비효과가..)
이상으로 NPM 설치하기 및 역방향 프록시 설정하는 방법에 대한 포스팅을 마치겠습니다.
내일은 NPM으로 설정한 Proxy Host의 SSL을 자동 갱신하는 방법에 대하여 포스팅하도록 하겠습니다.