Physical Address
South Korea
Physical Address
South Korea

WEB, WAS 서버에서 각각 독립된 도메인을 사용할수 있도록 WAS 서버에 nginx 를 활용하여 리버스 프록시 설정을 해보았습니다. 도메인 분리시 구성 및 관리 복잡성은 있지만 어플리케이션 관점에서 서비스 확장성 및 편의성 등의 장점이 있어 도메인 분리를 위한 구성입니다. 도메인 분리시 WEB 서버 reverse proxy 구성이 필요합니다.
웹 서비스를 운영하거나 서버 아키텍처를 공부하다 보면 반드시 마주치게 되는 용어가 바로 ‘리버스 프록시(Reverse Proxy)’입니다. 특히 고성능 웹 서버인 Nginx와 WAS(Web Application Server)인 Tomcat을 연동할 때 필수적으로 등장하는 개념이죠.
오늘은 리버스 프록시의 정확한 개념과 왜 수많은 기업이 이 구조를 채택하는지 그 핵심 장점 4가지를 상세히 알아보겠습니다.

일반적인 ‘프록시(Forward Proxy)’가 클라이언트(사용자) 측에서 요청을 대신 전달하는 역할을 한다면, 리버스 프록시는 서버 측의 최전방에서 활동합니다.
쉽게 설명하자면, 리버스 프록시는 클라이언트와 백엔드 서버(Tomcat, Node.js 등) 사이의 중개자입니다. 사용자가 웹사이트 주소를 입력하면 요청이 실제 서버로 바로 가는 것이 아니라, 리버스 프록시 서버(주로 Nginx)가 이를 먼저 받습니다. 그 후 리버스 프록시가 내부 네트워크에 있는 적절한 백엔드 서버로 요청을 전달하고, 서버의 응답을 다시 받아 클라이언트에게 전달하는 구조입니다.
단순히 중간에 서버를 하나 더 두는 것이 번거로워 보일 수 있지만, 인프라 설계 측면에서 리버스 프록시는 다음과 같은 압도적인 이점을 제공합니다.
가장 큰 장점은 내부 서버의 정보를 숨길 수 있다는 점입니다. 리버스 프록시를 설정하면 외부 사용자에게는 프록시 서버의 IP만 노출됩니다. 실제 서비스가 구동되는 백엔드 서버의 IP와 포트 번호를 외부에 드러내지 않으므로, 해커의 직접적인 공격으로부터 내부 자원을 보호하는 강력한 방어막 역할을 합니다.
최근 웹사이트에서 HTTPS(SSL/TLS) 적용은 필수입니다. 하지만 암호화 및 복호화 과정은 서버 자원을 꽤 많이 소모합니다. 리버스 프록시(Nginx)가 이 SSL 인증 처리를 전담하게 함으로써, 백엔드 서버는 비즈니스 로직 처리에만 집중할 수 있게 하여 전체적인 시스템 부하를 줄여줍니다.
서비스 규모가 커지면 단일 서버로는 트래픽을 감당하기 어렵습니다. 이때 리버스 프록시 뒤에 여러 대의 백엔드 서버를 배치하면, 프록시 서버가 요청을 각 서버에 골고루 분산해 줍니다. 이를 통해 특정 서버에 과부하가 걸리는 것을 방지하고 서비스의 가용성을 극대화할 수 있습니다.
이미지(PNG, JPG), CSS, 자바스크립트(JS)와 같은 정적 콘텐츠는 내용이 변하지 않습니다. 이를 매번 Tomcat 같은 WAS가 처리하게 하면 효율이 떨어집니다. 리버스 프록시인 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) 상태가 확인된다면 설치가 성공적으로 완료된 것입니다.
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 기본 페이지가 보인다면 네트워크 설정이 완료된 것입니다.
이제 핵심 단계인 리버스 프록시 설정입니다. 클라이언트가 80번 포트로 접속하면, Nginx가 내부의 8080 포트(Tomcat)로 요청을 전달하는 구조를 만듭니다.
설정의 가독성과 관리를 위해 /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;
}
}
많은 입문자가 가장 당황하는 부분이 설정은 완벽한데 502 Bad Gateway 에러가 발생하는 것입니다. RHEL 계열(CentOS, AlmaLinux, Rocky 포함)에서는 SELinux가 Nginx의 외부 네트워크 소켓 연결을 기본적으로 차단하기 때문입니다.
이 문제를 해결하기 위해 Nginx가 네트워크 연결을 수행할 수 있도록 부울(Boolean) 값을 변경해야 합니다.
Bash
# Nginx의 네트워크 연결 허용 (영구 적용)
sudo setsebool -P httpd_can_network_connect 1
이 명령어 하나로 SELinux가 리버스 프록시 통신을 허용하게 되어 에러가 해결됩니다.
설정을 마쳤다면 실제 백엔드가 요청을 받을 준비가 되었는지 확인하고 Nginx를 재시작합니다.
Tomcat이 8080 포트에서 정상적으로 Listen 상태인지 확인합니다.
Bash
# 8080 포트 활성화 여부 확인
ss -tlpn | grep 8080
파일 수정 후 바로 재시작하는 것보다 문법적 오류가 없는지 먼저 검사하는 습관이 중요합니다.
Bash
# 설정 파일 문법 검사
sudo nginx -t
syntax is ok와 test is successful이라는 문구가 나오면, 서비스를 재시작하여 설정을 적용합니다.
Bash
# Nginx 재시작
sudo systemctl restart nginx
이번 가이드를 통해 RHEL 9에서 Nginx와 Tomcat을 연동하는 전 과정을 살펴보았습니다. 이렇게 구성된 리버스 프록시 환경은 다음과 같은 이점을 제공합니다.
이제 여러분의 서버는 더욱 견고하고 효율적인 구조로 탈바꿈했습니다. 추가적인 보안 강화를 원하신다면 Let’s Encrypt를 통한 SSL/TLS 적용 가이드도 함께 살펴보시는 것을 추천드립니다.
RHEL 9 환경에서 Nginx를 리버스 프록시로 설정하는 과정은 복잡해 보일 수 있지만, 핵심적인 단계를 체계적으로 정리하면 운영 중 발생할 수 있는 장애를 미연에 방지할 수 있습니다. 설정을 마친 후, 서비스가 정상적으로 운영되는지 아래 체크리스트를 통해 최종 점검해 보시기 바랍니다.
가장 먼저 기반이 되는 Nginx가 시스템에 올바르게 설치되고 활성화되었는지 확인해야 합니다.
sudo dnf install nginx -y를 통해 설치했는지 확인합니다.systemctl is-enabled nginx 명령어를 통해 서버 재부팅 시에도 자동으로 실행되는지 체크하세요.systemctl status nginx를 입력했을 때 Active: active (running) 상태가 표시되어야 합니다.프록시 설정의 핵심은 클라이언트의 요청을 백엔드 서버(Tomcat)로 얼마나 정확하게 전달하느냐에 있습니다.
/etc/nginx/conf.d/proxy.conf 파일 내에 proxy_pass http://127.0.0.1:8080;이 정확히 기입되었는지 확인합니다. (포트 번호 유의)proxy_set_header 관련 설정들이 누락되지 않았는지 점검하세요.sudo nginx -t를 실행하여 오타나 설정 오류가 없는지 확인해야 합니다.RHEL 계열 운영체제에서 가장 빈번하게 발생하는 502 Bad Gateway 에러의 원인은 대부분 보안 정책인 SELinux에 있습니다.
sudo setsebool -P httpd_can_network_connect 1 명령어를 실행했는지 확인하세요. 이 설정이 누락되면 Nginx가 내부 포트(8080)에 접근하는 것이 차단됩니다.-P 옵션을 사용하여 재부팅 후에도 정책이 유지되도록 설정했는지 체크가 필요합니다.서버 내부에서 서비스가 잘 돌아가더라도 외부 사용자가 접속할 수 없다면 의미가 없습니다.
firewall-cmd --list-services 명령어를 통해 http와 https 서비스가 목록에 포함되어 있는지 확인합니다.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를 위한 활용 가이드]
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy