새소식

기타

Nginx - Nginx Proxy Manager Stream 설정

  • -

개요

최근 GCP 프리티어 VM이 너무 느린 것 같아 Oracle Cloud Infrastructure(OCI)의 프리티어로 서버를 옮기게 되었다. OCI는 상상 이상으로 쾌적하게 잘 작동했지만, 인스턴스 간 네트워크 구성에서 예상치 못한 문제가 발생했다.
OCI에서는 프리티어 기준으로 VM 인스턴스를 2개까지 생성 가능하지만, Public IP는 1개만 예약 가능하다.
그리하여 아래와 같이 구성했다.

  • main-instance: 실제 서비스 운영 (Nginx, 백엔드 API 등), Public IP 보유
  • db-instance: MySQL DB만 운영, 사설 IP만 존재

하지만 위 구조로 진행 중 DB 툴(MySQL Workbench, DBeaver 등)에서 MySQL에 접속하려고 할 때 문제가 발생했다.


원인

처음엔 단순히 main-instance의 Nginx Proxy Manager를 통해 프록시 설정을 하면 해결될 줄 알았다. 실제로 HTTP 프록시 기능을 이용해 여러 서비스들을 잘 연동하고 있었기 때문에 MySQL도 비슷할 거라고 생각했다.

하지만 문제는 MySQL은 HTTP 기반이 아닌 TCP 기반의 독자적인 프로토콜을 사용하는 서비스라는 점이었다. 기존 HTTP 프록시 설정으로는 전혀 동작하지 않았다.

이건 결국 OSI 7계층의 차이에서 비롯된 문제였다.

구분HTTP Proxy (기본 프록시)Stream Proxy (TCP/UDP)

계층 7계층 (Application Layer) 4계층 (Transport Layer)
사용 프로토콜 HTTP, HTTPS TCP, UDP
사용 용도 웹 서비스, 리버스 프록시 DB 연결, SSH, 커스텀 포트
대표 예시 Web → Nginx Proxy MySQL, Redis, SSH

해결

문제를 해결하기 위해 Nginx Proxy Manager의 고급 기능 중 하나인 stream 프록시를 사용했다. 이 기능은 HTTP가 아닌 TCP 또는 UDP 기반의 트래픽을 프록시해주는 기능이다.

✅ 설정 방법

  1. Nginx Proxy Manager 대시보드 접속
  2. "Streams" 메뉴 > Add Stream
  3. 다음과 같이 설정:
  • Incoming Port: 로컬 PC에서 접근할 포트(예: 3306)
  • Forward Host: db-instance의 Private IP (예: 10.0.0.5)
  • Forward Port: db-instance에서 접근할 포트(예: 3306)
  • TCP Forwarding: true

  1. 설정 저장 후, 로컬 PC에서 main-instance의 Public IP:3306으로 접속하면 MySQL에 정상적으로 연결된다.

로컬 PC - MySQL 접속 구조

[로컬 PC] --- TCP 3306 --> [main-instance (Public IP)]  
                                         |  
                                         | [Stream 프록시: 3306]  
                                         |  
                              [db-instance (사설 IP)]  
                                       MySQL

후기

아주 먼 옛날 고등학교 정보 시간에 배웠던 계층에 대한 내용을 실제 개발을 하며 마주하니 감회가 새로웠다.

단순히 구현만 잘하는 개발자보다는 폭 넓은 지식으로 다양한 시각으로 문제를 바라볼 수 있는 개발자가 되기 위해 꾸준히 노력해야겠다.

반응형
Contents

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

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