
안녕하세요, Mark입니다.
지난 글에서 도커와 포테이너를 설치해서 서버의 기본 뼈대를 갖췄습니다. 포테이너 대시보드가 뜨는 순간의 그 쾌감, 기억하시나요? 그런데 사실 그 상태로는 아직 반쪽짜리입니다.
왜냐하면, 지금 서버에 어떤 프로그램을 올려도 접속하려면 이런 주소를 써야 하거든요.
http://123.456.789.0:8080 http://123.456.789.0:5678 http://123.456.789.0:3000
http://123.456.789.0:8080 http://123.456.789.0:5678 http://123.456.789.0:3000
숫자로 가득한 IP 주소에, 뒤에 포트 번호까지 붙어있습니다. 쓰기도 불편하고, 보안도 좋지 않고, 무엇보다 주소창에 🔒 자물쇠(HTTPS)가 없습니다. 뭔가 허전하죠.
이 문제를 한 번에 해결해주는 게 바로 오늘 설치할 NPM(Nginx Proxy Manager)입니다.
🧭 NPM이 뭔가요? 건물 입구의 안내원입니다
NPM의 역할을 가장 쉽게 설명하면 이렇습니다.
서버를 하나의 큰 건물이라고 생각해 보세요. 이 건물 안에는 여러 서비스들이 각자의 방(포트)에 입주해 있습니다. n8n은 5678호, Ghost 블로그는 2368호, 이런 식으로요.
방문객(인터넷 트래픽)이 건물에 찾아오면, NPM이 입구에 서서 목적지를 확인하고 올바른 방으로 안내합니다.
“n8n.내도메인.com 으로 오셨나요? 5678호로 안내해드리겠습니다.” “blog.내도메인.com 으로 오셨나요? 2368호로 안내해드리겠습니다.”
방문객 입장에서는 호실 번호(포트)를 알 필요가 없습니다. 그냥 이름(도메인)만 알면 됩니다. 그리고 건물 입구(80번, 443번 포트)만 열려 있고, 나머지 방들은 외부에서 직접 접근할 수 없으니 보안도 훨씬 좋아집니다.
정리하면 NPM은 이 두 가지를 해줍니다.
| 역할 | 설명 |
|---|---|
| 리버스 프록시 | 도메인 주소를 각 서비스의 포트 번호로 연결 |
| SSL 인증서 자동 발급 | HTTPS 보안 연결을 무료로 자동 처리 |
🔒 SSL 인증서, 사실 저 돈 주고 산 적 있습니다
여기서 잠깐 제 흑역사를 하나 꺼내볼게요. 😅
서버를 시작하기 훨씬 전, 제가 처음 블로그를 만들어보겠다고 마음먹었을 때의 이야기입니다. 그때는 아무것도 몰랐기 때문에 가장 익숙한 이름인 카페24에서 워드프레스 호스팅을 신청했습니다. 도메인은 닷홈(Dothome)에서 따로 구매했고요.
그런데 사이트를 만들고 나서 주소창을 보니 http:// — 자물쇠가 없었습니다. 요즘 브라우저는 HTTP 사이트에 “안전하지 않음” 경고를 띄우기도 하고, 무엇보다 찜찜했습니다.
알아보니 SSL 인증서가 필요하다는 걸 알게 됐습니다. 카페24에서 호스팅과 도메인을 같이 구매했다면 3개월 무료 인증서를 쓸 수 있었는데, 저는 도메인을 닷홈에서 따로 샀기 때문에 해당이 안 됐습니다. 결국 인증서 값으로만 약 3만 5천 원을 별도로 냈습니다.
당시엔 그게 당연한 줄 알았습니다. SSL 인증서는 돈 주고 사는 거라고요.
그런데 NPM을 알고 나서 깨달았습니다.
Let’s Encrypt라는 무료 인증서 발급 기관이 있고, NPM이 이걸 자동으로 발급하고 자동으로 갱신까지 해준다는 걸요.
도메인만 있으면, 버튼 몇 번 클릭으로 HTTPS가 완성됩니다. 갱신 기간이 다가와도 알아서 처리해줍니다. 그 3만 5천 원이 새삼 아깝게 느껴지는 순간이었습니다. 😂
📦 포테이너 스택으로 NPM 설치하기
자, 이제 실제로 설치해봅시다. 지난 편에서 포테이너를 설치한 덕분에, 이번부터는 터미널을 거의 쓰지 않아도 됩니다. 포테이너의 스택(Stack) 기능을 사용하면 되거든요.
스택이란 여러 설정값을 담은 설치 명세서 같은 겁니다. 텍스트로 내용을 붙여넣으면 포테이너가 알아서 설치해줍니다.
1. 포테이너 접속 후 스택 메뉴로 이동
브라우저에서 포테이너(https://[서버IP]:9443)에 접속한 뒤, 왼쪽 메뉴에서 Stacks → Add Stack을 클릭합니다.
2. 스택 이름 입력 및 내용 붙여넣기
스택 이름을 npm 정도로 입력하고, 아래 내용을 Web editor에 붙여넣습니다.
yaml
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: always
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
3. Deploy the Stack 클릭
아래 Deploy the Stack 버튼을 누르면 잠시 후 NPM이 설치됩니다.
4. NPM 관리 페이지 접속
브라우저에서 아래 주소로 접속합니다.
http://[서버 IP]:81
http://[서버 IP]:81
초기 로그인 정보는 아래와 같습니다.
- Email:
admin@example.com - Password:
changeme
접속 후 바로 이메일과 비밀번호를 변경하라는 화면이 나옵니다. 꼭 바꿔주세요.
이렇게 하면 NPM 대시보드가 열립니다. 이제 건물 입구 안내원이 배치된 겁니다! 🎉
🗺️ 도메인 연결과 SSL은 다음 편에서
NPM이 설치됐으니 이제 도메인을 연결하고 HTTPS를 붙이고 싶은 마음이 굴뚝같을 겁니다. 저도 그랬거든요.
그런데 도메인 연결은 다음에 실제 서비스를 올릴 때 같이 설명하는 게 훨씬 자연스럽습니다. 앞으로 워드프레스, Ghost 블로그 같은 서비스를 하나씩 올릴 예정인데, 그때 “이 서비스에 도메인을 연결하고, NPM에서 SSL을 발급하는 법”을 실전으로 보여드리겠습니다.
지금은 NPM이라는 안내원이 자리를 잡고 대기 중이라고 생각해 두세요. 손님(서비스)이 들어올 때마다 제 역할을 톡톡히 할 겁니다.
✅ 핵심 요약
| 단계 | 내용 |
|---|---|
| NPM의 역할 | 도메인을 각 서비스 포트로 연결해주는 리버스 프록시 |
| SSL 인증서 | Let’s Encrypt 무료 인증서를 자동 발급·갱신 |
| 설치 방법 | 포테이너 스택으로 클릭 몇 번에 완료 |
| 다음 단계 | 실제 서비스 설치 시 도메인·SSL 연결 실전 적용 |
마치며
서버 구축기 1편부터 따라오신 분들이라면, 이제 꽤 그럴듯한 서버 환경이 갖춰졌습니다.
- ✅ 오라클 클라우드 무료 서버
- ✅ 도커 + 포테이너 (관리 환경)
- ✅ NPM (보안 + 트래픽 안내원)
이 세 가지가 갖춰지면, 앞으로 어떤 서비스를 올리든 포테이너 스택으로 설치하고, NPM으로 도메인과 HTTPS를 붙이는 패턴이 반복됩니다. 한 번 익혀두면 그다음부터는 놀랍도록 빨라집니다.
다음 편에서는 실제 서비스를 올리는 과정을 시작해보겠습니다. 기대해 주세요!
Mark의 한마디: “SSL 인증서에 돈을 내던 시절을 생각하면 지금도 억울합니다. NPM 하나면 버튼 클릭으로 공짜 인증서를 무제한으로 발급할 수 있거든요. 이걸 진작 알았더라면…”