새소식

Docker

Docker - Nginx Proxy Manager(npm) Docker로 실행하기

  • -

개요

아....... 글 80% 작성 완료했는데 날아가서 새로 써야하네요.... 정말 속상합니다....

한 서버에서 여러 프로젝트를 돌려야 하는데 각 서브 도메인마다 ssl 인증 관리를 해주어야 해서 열심히 삽질을 한 결과
Nginx Proxy Manager(이하 npm, js 패키지 매니저 아님)를 사용하는게 가장 쉽고 편하다는 것을 깨닫게 되었다.
그리하여 docker compose를 사용하여 npm을 컨테이너로 실행하고 서브도메인별로 ssl 인증을 받는 과정을 정리해본다.


서버 디렉토리 구조

.ssh
├── nginx
│    └── docker-compose.yml
├── project1
│    └── docker-compose.yml
└── project2
     └── index.js

nginx/docker-compose.yml 작성

version: '3'  # Docker Compose 파일 버전

services:
  npm:
    image: jc21/nginx-proxy-manager:latest  # 사용할 Docker 이미지 (Nginx Proxy Manager의 최신 버전)
    restart: unless-stopped  # 컨테이너가 중지된 경우 자동 재시작 (수동으로 중지하지 않는 한)

    ports:
      - "80:80"       # HTTP 포트 (외부 80 포트를 컨테이너의 80 포트에 매핑)
      - "81:81"       # 관리 UI 포트 (외부 81 포트를 컨테이너의 81 포트에 매핑)
      - "443:443"     # HTTPS 포트 (외부 443 포트를 컨테이너의 443 포트에 매핑)

    volumes:
      - ./data:/data  # 로컬 ./data 디렉토리를 컨테이너의 /data 디렉토리에 매핑 (데이터 저장소)
      - ./letsencrypt:/etc/letsencrypt  # 로컬 ./letsencrypt 디렉토리를 컨테이너의 /etc/letsencrypt 디렉토리에 매핑 (SSL 인증서 저장소)

npm 접속

1. 81포트 허용

사용하는 클라우드 서비스 사이트에 접속하여 방화벽 관리에서 81포트를 허용해준다.

2. nginx/docker-compose.yml 실행

cd ~/.ssh/nginx
docker compose up

3. npm 접속 및 로그인

브라우저에서 http://도메인:81로 접근하여 npm 서비스에 접속한 후, 관리자 계정으로 로그인한다.

초기 설정 관리자 계정

Email Addres: admin@example.com 
Password: changeme

4. 관리자 계정 설정

관리자 이름과 이메일, 비밀번호를 변경해준다.



ssl 인증

1. 서브 도메인 DNS 설정

사용하는 호스팅 사이트에 접속하여 사용할 서브 도메인을 A레코드로 추가해준다.

2. 서브 도메인 설정 확인

호스팅 사이트에서 설정한 서브 도메인의 적용이 완료 됐는지 확인한다.

확인 명령어

ping 서브도메인.도메인
# Ex) ping project.aleph.kr

적용 완료 시 출력 화면

만약 ping: cannot resolve 도메인: Unknown host 와 같은 메시지가 나온다면 아직 적용이 안 된 것이니 5~10분 후에 다시 시도해보자.

3. Proxy Host 추가

Proxy Hosts에 접속하여 Add Proxy Host 버튼을 클릭한다.

4. proxy host detail 설정

항목 설명

Domain Names: 설정된 서브도메인 이름
Scheme: HTTP 프로토콜을 사용하여 요청을 전달
Forward Hostname / IP: 요청을 전달할 서버의 IP 주소
Forward Port: 요청이 전달될 서버의 포트 번호
Access List: 웹사이트나 애플리케이션에 접근할 수 있는 사용자 또는 IP 주소 리스트 설정
Cache Assets: 이미지, CSS, JavaScript등 정적 파일 캐싱 설정 여부
Block Common Exploits: SQL 인젝션, XSS(교차 사이트 스크립팅) 공격, 디렉터리 트래버설과 같은 흔히 알려진 웹 공격 기법에 대한 기본적인 보호 여부
Websockets Support: 웹소켓(WebSocket) 프로토콜을 사용하는 애플리케이션에 대한 프록시의 웹소켓 연결 지원 여부

웹소켓 프로토콜은 사용하지 않을 예정이라 굳이 설정해주지 않았다.

6. proxy host ssl 설정

SSL Certificate: 새로운 SSL 인증서를 요청하거나 기존 인증서를 사용하는 옵션 (Let's Encrypt 사용 가능)
Force SSL: HTTP 요청을 HTTPS로 강제 리다이렉트하도록 설정
HTTP/2 Support: HTTP/2 프로토콜 지원 옵션
HSTS Enabled: HSTS(HTTP Strict Transport Security)를 활성화하여 보안 강화(HTTPS를 통해서만 접근되도록)
HSTS Subdomains: 하위 서브도메인에 대해 HSTS 적용 여부를 설정하는 옵션(전체 도메인에 대한 HTTPS 보안을 일관되게 유지할 수 있도록)
Use a DNS Challenge: DNS 챌린지를 사용하여 SSL 인증서를 발급받을 때 사용하는 옵션(웹 서버에 직접 접근할 수 없는 경우나, 여러 도메인 또는 와일드카드(예: *.example.com) 인증서를 발급받을 때 사용)
Email Address for Let's Encrypt: Let's Encrypt SSL 인증서를 발급받기 위한 이메일 주소 입력

7. 프로젝트 접속


저장 후 설정한 도메인으로 접속이 가능한지 확인한다.

Ex) https://project1.aleph.kr로 접속

만약 접속이 되지 않는다면 project가 정상적으로 실행되고 있는지, 프로젝트 포트 번호가 열려있는지 다시 한 번 확인한다.


후기

여기저기 접속하지 않고 docker compose up 명령어 하나만으로 착착착 설정이 완료되게끔 만들고 싶어 대략 3일정도 삽질을 열심히 했으나 두뇌 회전량의 한계로 인해 실패하고 주변 개발자분께(감사합니다 명한님) 조언을 받아 npm을 사용하게 되었다.
근데 막상 사용해보니 생각보다 너무 간단해서 여태 삽질한게 어이없을 정도였다.
명확한 근거와 시행착오가 없는 고집은 스스로를 고립시킨다는 것을 다시금 깨닫게 되었다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.