RHEL 9.6: Nginx - Tomcat 리버스 프록시구성

RHEL 9.6: Nginx – Tomcat 리버스 프록시 구성

RHEL 9.6: Nginx – Tomcat 리버스 프록시구성

WEB, WAS 서버에서 각각 독립된 도메인을 사용할수 있도록 WAS 서버에 nginx 를 활용하여 리버스 프록시 설정을 해보았습니다. 도메인 분리시 구성 및 관리 복잡성은 있지만 어플리케이션 관점에서 서비스 확장성 및 편의성 등의 장점이 있어 도메인 분리를 위한 구성입니다. 도메인 분리시 WEB 서버 reverse proxy 구성이 필요합니다.

웹 서비스를 운영하거나 서버 아키텍처를 공부하다 보면 반드시 마주치게 되는 용어가 바로 ‘리버스 프록시(Reverse Proxy)’입니다. 특히 고성능 웹 서버인 Nginx와 WAS(Web Application Server)인 Tomcat을 연동할 때 필수적으로 등장하는 개념이죠.

오늘은 리버스 프록시의 정확한 개념과 왜 수많은 기업이 이 구조를 채택하는지 그 핵심 장점 4가지를 상세히 알아보겠습니다.

RHEL 9.6: Nginx - Tomcat 리버스 프록시구성
RHEL 9.6: Nginx – Tomcat 리버스 프록시구성

리버스 프록시(Reverse Proxy)의 개념

일반적인 ‘프록시(Forward Proxy)’가 클라이언트(사용자) 측에서 요청을 대신 전달하는 역할을 한다면, 리버스 프록시는 서버 측의 최전방에서 활동합니다.

쉽게 설명하자면, 리버스 프록시는 클라이언트와 백엔드 서버(Tomcat, Node.js 등) 사이의 중개자입니다. 사용자가 웹사이트 주소를 입력하면 요청이 실제 서버로 바로 가는 것이 아니라, 리버스 프록시 서버(주로 Nginx)가 이를 먼저 받습니다. 그 후 리버스 프록시가 내부 네트워크에 있는 적절한 백엔드 서버로 요청을 전달하고, 서버의 응답을 다시 받아 클라이언트에게 전달하는 구조입니다.

리버스 프록시를 사용하는 이유 (4가지 핵심 장점)

단순히 중간에 서버를 하나 더 두는 것이 번거로워 보일 수 있지만, 인프라 설계 측면에서 리버스 프록시는 다음과 같은 압도적인 이점을 제공합니다.

① 보안 강화 (Security)

가장 큰 장점은 내부 서버의 정보를 숨길 수 있다는 점입니다. 리버스 프록시를 설정하면 외부 사용자에게는 프록시 서버의 IP만 노출됩니다. 실제 서비스가 구동되는 백엔드 서버의 IP와 포트 번호를 외부에 드러내지 않으므로, 해커의 직접적인 공격으로부터 내부 자원을 보호하는 강력한 방어막 역할을 합니다.

② SSL 종단점 처리 (SSL Termination)

최근 웹사이트에서 HTTPS(SSL/TLS) 적용은 필수입니다. 하지만 암호화 및 복호화 과정은 서버 자원을 꽤 많이 소모합니다. 리버스 프록시(Nginx)가 이 SSL 인증 처리를 전담하게 함으로써, 백엔드 서버는 비즈니스 로직 처리에만 집중할 수 있게 하여 전체적인 시스템 부하를 줄여줍니다.

③ 로드 밸런싱 (Load Balancing)

서비스 규모가 커지면 단일 서버로는 트래픽을 감당하기 어렵습니다. 이때 리버스 프록시 뒤에 여러 대의 백엔드 서버를 배치하면, 프록시 서버가 요청을 각 서버에 골고루 분산해 줍니다. 이를 통해 특정 서버에 과부하가 걸리는 것을 방지하고 서비스의 가용성을 극대화할 수 있습니다.

④ 정적 콘텐츠 처리 효율화

이미지(PNG, JPG), CSS, 자바스크립트(JS)와 같은 정적 콘텐츠는 내용이 변하지 않습니다. 이를 매번 Tomcat 같은 WAS가 처리하게 하면 효율이 떨어집니다. 리버스 프록시인 Nginx는 이러한 정적 파일을 매우 빠르게 서빙하는 데 특화되어 있습니다. 정적 파일은 Nginx가 직접 응답하고, 데이터베이스 조회가 필요한 동적 요청만 백엔드로 넘겨주면 전체 서비스 속도가 비약적으로 향상됩니다.

리버스 프록시는 단순한 중개 서버를 넘어 보안, 속도, 확장성을 모두 잡을 수 있는 핵심 기술입니다. Nginx와 같은 강력한 도구를 활용해 리버스 프록시 환경을 구축한다면, 훨씬 더 안정적이고 전문적인 웹 서비스를 운영할 수 있습니다.

리버스 프록시 개념

Nginx 설치 및 서비스 활성화

RHEL 9은 최신 패키지를 안정적으로 제공하는 AppStream 저장소를 사용합니다. 복잡한 소스 컴파일 없이 dnf 패키지 관리자를 통해 쉽고 빠르게 설치할 수 있습니다.

최신 패키지 업데이트 및 설치

먼저 시스템의 패키지 목록을 최신 상태로 업데이트한 후 Nginx를 설치합니다.

Bash

# 시스템 패키지 업데이트
sudo dnf update -y

# Nginx 설치
sudo dnf install nginx -y

서비스 활성화 및 상태 확인

설치가 완료되면 시스템이 재부팅되더라도 Nginx가 자동으로 실행되도록 설정해야 합니다.

Bash

# 서비스 시작 및 부팅 시 자동 시작 등록
sudo systemctl enable --now nginx

# 서비스 상태 확인
sudo systemctl status nginx

active (running) 상태가 확인된다면 설치가 성공적으로 완료된 것입니다.


웹 접속을 위한 방화벽(Firewall) 설정

RHEL 시스템은 보안을 위해 기본적으로 대부분의 포트를 차단합니다. 웹 서비스 운영을 위해서는 HTTP(80)와 HTTPS(443) 포트를 반드시 개방해야 합니다.

포트 개방 및 적용

firewall-cmd 도구를 사용하여 영구적으로 서비스를 허용합니다.

Bash

# 80(HTTP) 및 443(HTTPS) 서비스 허용
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 변경 사항 적용을 위한 리로드
sudo firewall-cmd --reload

이제 외부 브라우저에서 서버의 IP 주소로 접속했을 때 Nginx 기본 페이지가 보인다면 네트워크 설정이 완료된 것입니다.


리버스 프록시 구성 (Nginx – Tomcat 연동)

이제 핵심 단계인 리버스 프록시 설정입니다. 클라이언트가 80번 포트로 접속하면, Nginx가 내부의 8080 포트(Tomcat)로 요청을 전달하는 구조를 만듭니다.

Nginx 설정 파일 생성

설정의 가독성과 관리를 위해 /etc/nginx/conf.d/ 디렉토리에 별도의 설정 파일을 생성하는 것을 추천합니다.

Bash

sudo vi /etc/nginx/conf.d/proxy.conf

파일 내부에 아래의 내용을 작성합니다. 이 설정은 단순 전달을 넘어, 클라이언트의 실제 정보를 백엔드 서버에 정확히 전달하기 위한 헤더 설정을 포함하고 있습니다.

Nginx

server {
    listen       80;
    server_name  example.com; # 실제 도메인 또는 서버 IP를 입력하세요.

    location / {
        # 동일 서버 내 Tomcat 주소로 요청 전달
        proxy_pass http://127.0.0.1:8080;

        # 프록시 헤더 설정: 클라이언트의 IP와 호스트 정보를 보존
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 타임아웃 설정: 대용량 처리나 느린 네트워크 대응을 위해 90초로 설정
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
    }
}

핵심 설정 헤더 설명

  • Host: 클라이언트가 요청한 원래 호스트 이름을 전달합니다.
  • X-Forwarded-For: 프록시를 거치기 전 클라이언트의 실제 IP 주소를 전달합니다. (로그 분석 시 필수)
  • X-Forwarded-Proto: 클라이언트가 접속할 때 사용한 프로토콜(HTTP/HTTPS)을 전달합니다.

SELinux 보안 정책 설정 (필수 단계)

많은 입문자가 가장 당황하는 부분이 설정은 완벽한데 502 Bad Gateway 에러가 발생하는 것입니다. RHEL 계열(CentOS, AlmaLinux, Rocky 포함)에서는 SELinux가 Nginx의 외부 네트워크 소켓 연결을 기본적으로 차단하기 때문입니다.

이 문제를 해결하기 위해 Nginx가 네트워크 연결을 수행할 수 있도록 부울(Boolean) 값을 변경해야 합니다.

Bash

# Nginx의 네트워크 연결 허용 (영구 적용)
sudo setsebool -P httpd_can_network_connect 1

이 명령어 하나로 SELinux가 리버스 프록시 통신을 허용하게 되어 에러가 해결됩니다.

백엔드(Tomcat) 연동 확인 및 최종 적용

설정을 마쳤다면 실제 백엔드가 요청을 받을 준비가 되었는지 확인하고 Nginx를 재시작합니다.

Tomcat 포트 상태 확인

Tomcat이 8080 포트에서 정상적으로 Listen 상태인지 확인합니다.

Bash

# 8080 포트 활성화 여부 확인
ss -tlpn | grep 8080

Nginx 설정 검사 및 재시작

파일 수정 후 바로 재시작하는 것보다 문법적 오류가 없는지 먼저 검사하는 습관이 중요합니다.

Bash

# 설정 파일 문법 검사
sudo nginx -t

syntax is oktest is successful이라는 문구가 나오면, 서비스를 재시작하여 설정을 적용합니다.

Bash

# Nginx 재시작
sudo systemctl restart nginx

왜 Nginx 리버스 프록시인가?

이번 가이드를 통해 RHEL 9에서 Nginx와 Tomcat을 연동하는 전 과정을 살펴보았습니다. 이렇게 구성된 리버스 프록시 환경은 다음과 같은 이점을 제공합니다.

  1. 보안: Tomcat의 직접적인 노출을 막아줍니다.
  2. 성능: Nginx가 정적 콘텐츠를 처리하고, SSL 종단점 역할을 수행하여 백엔드 부하를 줄입니다.
  3. 유연성: 추후 로드 밸런싱을 통해 여러 대의 Tomcat으로 확장하기 매우 용이합니다.

이제 여러분의 서버는 더욱 견고하고 효율적인 구조로 탈바꿈했습니다. 추가적인 보안 강화를 원하신다면 Let’s Encrypt를 통한 SSL/TLS 적용 가이드도 함께 살펴보시는 것을 추천드립니다.

리버스 프록시 구축 완료를 위한 최종 체크리스트 (Nginx-Tomcat)

RHEL 9 환경에서 Nginx를 리버스 프록시로 설정하는 과정은 복잡해 보일 수 있지만, 핵심적인 단계를 체계적으로 정리하면 운영 중 발생할 수 있는 장애를 미연에 방지할 수 있습니다. 설정을 마친 후, 서비스가 정상적으로 운영되는지 아래 체크리스트를 통해 최종 점검해 보시기 바랍니다.

1. Nginx 설치 및 서비스 상태 확인

가장 먼저 기반이 되는 Nginx가 시스템에 올바르게 설치되고 활성화되었는지 확인해야 합니다.

  • 설치 명령어: sudo dnf install nginx -y를 통해 설치했는지 확인합니다.
  • 서비스 활성화: systemctl is-enabled nginx 명령어를 통해 서버 재부팅 시에도 자동으로 실행되는지 체크하세요.
  • 상태 점검: systemctl status nginx를 입력했을 때 Active: active (running) 상태가 표시되어야 합니다.

2. 리버스 프록시(Reverse Proxy) 핵심 설정

프록시 설정의 핵심은 클라이언트의 요청을 백엔드 서버(Tomcat)로 얼마나 정확하게 전달하느냐에 있습니다.

  • proxy_pass 경로: /etc/nginx/conf.d/proxy.conf 파일 내에 proxy_pass http://127.0.0.1:8080;이 정확히 기입되었는지 확인합니다. (포트 번호 유의)
  • 헤더 정보 보존: 클라이언트의 실제 IP 주소를 백엔드 로그에 남기기 위해 proxy_set_header 관련 설정들이 누락되지 않았는지 점검하세요.
  • 문법 검사: 설정 변경 후에는 반드시 sudo nginx -t를 실행하여 오타나 설정 오류가 없는지 확인해야 합니다.

3. 필수 보안 및 시스템 권한 설정 (SELinux)

RHEL 계열 운영체제에서 가장 빈번하게 발생하는 502 Bad Gateway 에러의 원인은 대부분 보안 정책인 SELinux에 있습니다.

  • 네트워크 연결 허용: sudo setsebool -P httpd_can_network_connect 1 명령어를 실행했는지 확인하세요. 이 설정이 누락되면 Nginx가 내부 포트(8080)에 접근하는 것이 차단됩니다.
  • 영구 적용 확인: -P 옵션을 사용하여 재부팅 후에도 정책이 유지되도록 설정했는지 체크가 필요합니다.

4. 네트워크 방화벽(Firewall) 개방 여부

서버 내부에서 서비스가 잘 돌아가더라도 외부 사용자가 접속할 수 없다면 의미가 없습니다.

  • 80(HTTP) & 443(HTTPS) 포트: firewall-cmd --list-services 명령어를 통해 httphttps 서비스가 목록에 포함되어 있는지 확인합니다.
  • Reload 실행: 방화벽 규칙 추가 후 firewall-cmd --reload를 실행하여 변경 사항을 실제 네트워크 정책에 반영했는지 점검하세요.

🏁 최종 요약표: 이것만은 꼭 확인하세요!

항목점검 내용확인 명령어
설치Nginx 패키지 설치 여부dnf list installed nginx
통신Nginx-Tomcat 연동 설정cat /etc/nginx/conf.d/proxy.conf
보안SELinux 네트워크 권한getsebool httpd_can_network_connect
접속방화벽 포트 개방firewall-cmd --list-all

마무리하며

위의 4가지 핵심 체크리스트를 모두 통과했다면, 여러분의 서버는 보안성과 효율성을 갖춘 리버스 프록시 환경 구축에 성공한 것입니다. 이러한 구조는 추후 트래픽이 증가했을 때 로드 밸런싱을 도입하거나, SSL 인증서를 적용하여 HTTPS 보안을 강화하는 데 매우 유리한 기반이 됩니다.

문제가 발생한다면 가장 먼저 nginx -t 결과와 SELinux 설정 값을 다시 한번 살펴보는 것을 잊지 마세요!

전문가의 인사이트 : 함께 읽어 보세요.

[RHEL 9.6 환경에서 OpenVPN 서버 구축 및 DBA를 위한 활용 가이드]

참조 및 출처 URL:

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy