지난 포스팅들을 통해 우리는 가성비 좋은 VPS 서버를 장만하고 도커 위에 n8n을 성공적으로 설치했습니다. 하지만 지금 상태는 마치 현관문도 없고 잠금장치도 없는 집에 귀중품을 보관하고 있는 것과 같습니다. IP 주소와 포트 번호(예: 123.456.78.9:5678)로 접속하는 방식은 보안에 취약할 뿐만 아니라, 기억하기도 어렵습니다. 무엇보다 n8n의 핵심 기능인 웹훅(Webhook)을 제대로 사용하고 다른 서비스와 안전하게 데이터를 주고받기 위해서는 보안 연결인 HTTPS 설정이 필수입니다. 오늘은 복잡한 리눅스 명령어 없이, 그래픽 인터페이스만으로 이 모든 문제를 해결해 주는 Nginx Proxy Manager(이하 NPM) 설치와 설정 방법을 아주 상세하게 알아보겠습니다.
리버스 프록시(Reverse Proxy)
우선 리버스 프록시(Reverse Proxy)라는 개념을 이해하고 넘어가야 합니다. 이름이 어렵게 느껴질 수 있지만, 호텔의 프런트 데스크 직원을 상상하면 쉽습니다. 손님(외부 사용자)이 호텔(서버)에 도착했을 때, 몇 호실에 누가 묵고 있는지 직접 찾아다니는 것이 아니라 프런트 직원에게 묻습니다. 그러면 직원은 손님의 목적에 따라 101호(n8n)로 안내하거나 102호(포르테이너)로 연결해 줍니다. 여기서 NPM이 바로 그 프런트 데스크 직원 역할을 합니다. 80번(HTTP)이나 443번(HTTPS) 포트로 들어오는 모든 요청을 받아서, 도메인 주소를 확인한 뒤 내부의 적절한 컨테이너로 교통 정리를 해주는 것입니다. 이렇게 하면 우리는 포트 번호를 일일이 외울 필요 없이 깔끔한 도메인 주소만으로 서비스에 접속할 수 있게 됩니다.

도메인 설정
가장 먼저 해야 할 작업은 도메인 설정입니다. 호스팅KR이나 가비아 같은 도메인 관리 사이트에 접속해서 DNS 설정 메뉴를 엽니다. 우리는 메인 도메인 외에 서브 도메인을 활용할 것입니다. 이때 레코드 타입은 CNAME을 사용하는 것이 유리합니다. CNAME은 별칭을 지정하는 것으로, 목적지에 내 도메인 주소를 입력해 두면 추후 서버 IP가 바뀌더라도 메인 도메인의 IP만 수정하면 모든 서브 도메인이 자동으로 따라가기 때문에 관리가 훨씬 수월해집니다.
이제 서버에 NPM을 설치할 차례입니다. 지난 시간에 설치한 포르테이너나 터미널을 통해 도커 컴포즈 파일을 작성합니다. NPM은 기본적으로 80번과 443번 포트를 사용하여 웹 트래픽을 받고, 81번 포트를 통해 관리자 페이지를 제공합니다. 설치가 완료되고 웹브라우저 주소창에 내 서버 IP와 81번 포트를 입력하면 NPM 로그인 화면이 나타납니다. 초기 아이디와 비밀번호로 로그인한 뒤, 즉시 관리자 정보를 변경하여 보안을 강화해 줍니다.
SSL 인증, Proxy Host 등록
NPM이 정상적으로 구동된다면 이제 SSL 인증서를 발급받아 초록색 자물쇠 아이콘을 달아줄 차례입니다. NPM의 가장 큰 장점이 바로 여기 있습니다. 복잡한 인증서 발급 명령어를 칠 필요 없이, 메뉴에서 도메인 이름을 입력하고 Let’s Encrypt 인증서 발급 버튼만 누르면 됩니다. 이때 Force SSL, HTTP/2 Support, HSTS 같은 보안 옵션들을 모두 체크해 주는 것이 좋습니다. 이렇게 하면 사용자가 실수로 http로 접속하더라도 자동으로 안전한 https 경로로 안내해 줍니다.
인증서 준비가 끝났다면 프록시 호스트(Proxy Host)를 등록합니다. 들어오는 요청을 내부의 n8n 컨테이너 포트인 5678번으로 전달하도록 설정하는 것입니다. 여기서 중요한 점은 도커 네트워크입니다. NPM과 n8n이 서로 다른 도커 네트워크에 있다면 서로의 존재를 찾지 못합니다. 따라서 두 컨테이너를 하나의 외부 네트워크(External Network)로 묶어주거나, 내부 IP 주소를 정확히 입력해야 합니다. 관리 편의성을 위해 저는 같은 네트워크로 묶는 방식을 추천합니다. 그러면 IP 주소 대신 컨테이너 이름인 n8n만 입력해도 통신이 가능합니다.
n8n 보안 설정, Connection lost
하지만 n8n은 보안 설정이 까다로워서 단순히 연결만 하면 Connection lost라는 붉은색 에러 메시지를 뿜으며 정상 작동하지 않을 수 있습니다. 이는 n8n이 실시간 통신을 위해 사용하는 웹소켓 방식이 프록시를 거치면서 끊어지기 때문입니다. 이를 해결하기 위해 우리는 두 가지 조치를 취해야 합니다.
첫째, NPM의 설정에서 고급 탭으로 이동하여 웹소켓 지원 옵션을 켜고, 커스텀 로케이션 설정에 헤더 정보를 추가해 주어야 합니다. X-Forwarded-Host와 같은 헤더들이 제대로 전달되어야 n8n이 자신이 어떤 도메인 뒤에 숨어있는지 인지할 수 있습니다.
둘째, n8n의 도커 컴포즈 환경 변수 설정도 수정해야 합니다. N8N_PUSH_BACKEND라는 변수 값을 sse(Server-Sent Events)로 설정해 줍니다. 웹소켓보다 프록시 환경에서 훨씬 안정적으로 작동하는 방식입니다. 또한 WEBHOOK_URL 환경 변수에 실제 접속할 https 도메인 주소를 입력해야 워크플로우 내에서 생성되는 웹훅 URL이 내부 IP가 아닌 정상적인 도메인으로 표시됩니다.
마지막으로 N8N_ALLOWED_ORIGINS 변수에는 CORS 오류 방지를 위해 사용하게 될 도메인을 명시해 주는 것이 좋습니다.
모든 설정이 끝나고 n8n 컨테이너를 재시작한 뒤, 브라우저에 https가 적용된 도메인을 입력해 봅니다. 주소창 옆에 안전함을 뜻하는 자물쇠 아이콘이 뜨고, n8n의 로딩 화면이 에러 없이 나타난다면 성공입니다.
마무리
이제 서버는 외부의 위협으로부터 한층 안전해졌으며, 어디서든 기억하기 쉬운 주소로 접속하여 업무를 자동화할 수 있는 준비를 마쳤습니다. 처음에는 용어들이 낯설고 과정이 복잡해 보일 수 있지만, 한 번 구축해 두면 3개월마다 자동으로 인증서를 갱신해 주는 NPM 덕분에 신경 쓸 일이 거의 없습니다. 이제 안전한 보안 환경 위에서 자동화를 구축하면 됩니다.