포트 번호를 숨기는 방법 – Nginx 리버스 프록시 설정 가이드

1. myblog.com:3000처럼 포트 번호가 보이는 게 싫다면

Node.js, Flask, Spring Boot 같은 프레임워크로 앱을 만들면 보통 특정 포트(3000, 5000, 8080 등)에서 실행됩니다. 이 상태로 외부에서 접속하려면 myblog.com:3000처럼 포트 번호까지 입력해야 합니다.

사용자 입장에서 포트 번호가 붙은 주소는 어색하고 신뢰감이 낮습니다. 보안상으로도 내부에서 어떤 포트를 사용하는지 외부에 노출되는 것은 좋지 않습니다.

Nginx 리버스 프록시를 설정하면 사용자가 그냥 myblog.com만 입력해도 내부의 3000번 포트 앱으로 연결됩니다.

2. 리버스 프록시란 무엇인가?

**리버스 프록시(Reverse Proxy)**는 외부 요청을 받아 내부 서버로 전달하는 중간 서버입니다.

쇼핑몰 고객 센터를 생각해보면 이해하기 쉽습니다. 고객(사용자)은 대표 번호 하나로 전화합니다. 상담원(Nginx)이 전화를 받아 내용에 따라 배송팀, 환불팀, 기술지원팀(각 앱 서버)으로 연결해줍니다. 고객은 각 팀의 내선 번호를 알 필요가 없습니다.

리버스 프록시는 이런 방식으로 외부에서 보이는 주소와 내부에서 실제 처리하는 주소를 분리합니다.

구분포워드 프록시리버스 프록시
위치클라이언트 앞서버 앞
누구를 위한 것클라이언트서버
역할클라이언트 대신 인터넷 접속서버 대신 요청 수신
사용 예VPN, 사내 프록시Nginx, AWS ALB

3. 리버스 프록시를 사용하는 이유

포트 번호 노출 방지: 내부 앱이 3000번, 8080번처럼 비표준 포트에서 실행되더라도 사용자에게는 80번(HTTP) 또는 443번(HTTPS)으로만 보입니다.

HTTPS 일괄 처리: Nginx에서 SSL을 처리하고, 내부 앱들은 HTTP로 통신합니다. 앱마다 SSL을 설정할 필요가 없습니다.

하나의 서버에서 여러 서비스 운영: 서브도메인별로 다른 앱으로 요청을 분기할 수 있습니다.

보안 강화: Nginx가 앞에서 요청을 필터링하기 때문에 내부 앱이 직접 외부에 노출되지 않습니다.

4. Nginx 리버스 프록시 설정 방법

Node.js 앱이 3000번 포트에서 실행 중인 상황을 예시로 설명합니다. myblog.com으로 접속하면 이 앱으로 연결되도록 Nginx를 설정합니다.

Nginx 사이트 설정 파일을 새로 만듭니다.

sudo nano /etc/nginx/sites-available/myblog

아래 내용을 입력합니다. server_name에는 본인 도메인을, proxy_pass에는 내부 앱 주소를 입력합니다.

server { listen 80; server_name myblog.com www.myblog.com;

location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

설정 파일을 sites-enabled에 링크해 활성화합니다.

sudo ln -s /etc/nginx/sites-available/myblog /etc/nginx/sites-enabled/

설정 파일 문법 오류를 검사합니다.

sudo nginx -t

오류가 없으면 Nginx를 재시작합니다.

sudo systemctl reload nginx

이제 myblog.com으로 접속하면 포트 번호 없이 3000번 앱으로 연결됩니다.

5. 서브도메인마다 다른 앱으로 연결하기

하나의 서버에 블로그, API, 관리자 페이지처럼 여러 앱이 각각 다른 포트에서 실행 중이라면, 서브도메인으로 분기할 수 있습니다.

blog.myblog.com은 3000번, api.myblog.com은 4000번으로 각각 연결하는 방법입니다.

blog 설정 파일을 만듭니다.

sudo nano /etc/nginx/sites-available/blog

아래 내용을 입력합니다.

server { listen 80; server_name blog.myblog.com;

location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

}

api 설정 파일도 같은 방식으로 만들되 server_name을 api.myblog.com으로, proxy_pass 포트를 4000으로 변경합니다. 각 파일을 sites-enabled에 링크하고 Nginx를 재시작하면 됩니다.

6. HTTPS와 리버스 프록시 함께 적용하기

Certbot으로 HTTPS를 적용하면 리버스 프록시 설정 위에 SSL이 자동으로 추가됩니다.

sudo certbot –nginx -d myblog.com -d www.myblog.com

Certbot이 Nginx 설정 파일을 자동으로 수정해 443번 포트 설정과 HTTP → HTTPS 리다이렉트를 추가합니다. 이후 http://로 접속하면 자동으로 https://로 이동합니다.

7. 자주 발생하는 문제와 해결법

502 Bad Gateway Nginx는 동작하지만 연결하려는 내부 앱(3000번 포트)이 실행되지 않고 있을 때 발생합니다. 앱이 정상 실행 중인지 먼저 확인합니다.

주소 입력했는데 아무 반응이 없는 경우 sites-available에 파일을 만들었지만 sites-enabled에 링크를 만들지 않은 경우입니다. ln -s 명령으로 심볼릭 링크를 생성했는지 확인합니다.

설정 후 변경 사항이 반영되지 않는 경우 sudo nginx -t로 문법을 확인하고 sudo systemctl reload nginx로 재시작합니다.

8. 정리 및 다음 단계

오늘 배운 핵심을 정리합니다.

  • 리버스 프록시는 외부 요청을 받아 내부 앱으로 전달하는 Nginx의 핵심 기능입니다.
  • proxy_pass 설정으로 도메인 요청을 내부 포트로 연결합니다.
  • 서브도메인별 설정 파일을 만들면 하나의 서버에서 여러 앱을 운영할 수 있습니다.
  • Certbot과 함께 사용하면 HTTPS까지 자동으로 적용됩니다.
  • 502 오류는 대부분 내부 앱이 실행되지 않아서 발생합니다.

다음 글에서는 리눅스 파일 권한 문제(chmod, chown)를 완벽하게 이해하고 해결하는 방법을 알아보겠습니다.

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.