Rocky Linux Nginx 리버스 프록시 설정: 3000번 포트 앱을 도메인에 연결하기

하루하나 · 서버 운영 노트

이번 글에서 연결할 구조

방문자 → Nginx의 80번 포트 → 같은 서버의 127.0.0.1:3000 앱

앱은 실행 중인데 도메인으로 접속되지 않는다면, 앱 자체와 Nginx 연결을 나누어 확인하면 됩니다. 아래 예제는 HTTP 연결 확인용이며, 공개 서비스에는 HTTPS 설정을 별도로 추가해야 합니다.

Nginx 설치까지 끝났다면 다음은 앱 연결입니다. 먼저 Rocky 서버에 Nginx 설치하기를 확인한 뒤 진행하세요. 여기서는 앱이 같은 서버의 3000번 포트에서 실행된다고 가정합니다.

1. 앱이 먼저 응답하는지 확인

curl -i http://127.0.0.1:3000/
ss -ltn

첫 명령은 Nginx를 거치지 않고 앱에 직접 요청합니다. 연결 거부가 나오면 앱 프로세스와 포트부터 확인하세요. 404가 나와도 HTTP 응답은 받은 것이므로, 연결 실패와는 구분해야 합니다. 서비스가 제공하는 실제 경로로도 요청해 보세요.

앱이 Docker 안에 있다면 호스트에서 해당 포트에 접근할 수 있는지 먼저 확인해야 합니다. Nginx도 다른 컨테이너 안에 있다면 그 안의 127.0.0.1은 앱 컨테이너가 아닙니다. 이 글의 예제는 호스트에서 실행하는 Nginx 기준입니다.

2. 앱으로 전달할 server 블록 작성

기존 설정을 복사해 보관하고, /etc/nginx/nginx.conf에서 conf.d/*.conf를 포함하는지 확인하세요. 포함한다면 /etc/nginx/conf.d/myapp.conf 같은 새 파일에 다음 예제를 넣을 수 있습니다. 동일한 도메인의 server 블록을 중복해서 만들지 마세요.

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

app.example.com은 실제 도메인으로, 3000은 앱의 포트로 바꿉니다. 위 예제의 proxy_pass에는 별도 URI를 붙이지 않았습니다. 경로 접두사를 제거하는 설정은 동작이 달라지므로 그대로 섞어 쓰지 마세요.

3. 문법 검사 후 적용

sudo nginx -t
# 위 검사가 성공했을 때만 실행
sudo systemctl reload nginx
curl -i -H 'Host: app.example.com' http://127.0.0.1/

마지막 요청은 DNS 변경 전에도 지정한 도메인의 server 블록을 확인하는 방법입니다. 앱 직접 요청은 성공하는데 이 요청이 실패하면 Nginx 설정 또는 Nginx에서 앱으로 가는 연결을 살펴봅니다.

4. Rocky Linux에서 추가로 볼 부분

SELinux가 enforcing 상태이고 오류 로그에 연결 권한 거부가 보인다면 관련 정책을 확인합니다. RHEL 공식 문서는 Nginx 리버스 프록시에 httpd_can_network_connect 설정을 안내합니다. 이 설정은 HTTP 서비스의 네트워크 연결 범위를 넓히므로 서버의 운영 정책을 확인한 뒤 적용하세요.

getenforce
getsebool httpd_can_network_connect
# 리버스 프록시 연결을 허용하기로 결정한 경우
sudo setsebool -P httpd_can_network_connect on

로컬에서는 되는데 외부에서만 접속되지 않으면 도메인의 DNS, 서버 방화벽, 클라우드 보안 그룹을 확인하세요. 같은 서버의 Nginx가 앱에 연결하는 구조라면 앱의 3000번 포트를 인터넷에 공개할 필요는 없습니다.

문제가 생겼을 때 확인 순서

  1. 앱 직접 요청: 127.0.0.1:3000이 응답하는지 확인
  2. 설정 검사: nginx -t 오류와 중복 server_name 확인
  3. Nginx 경유 요청: Host 헤더를 넣은 로컬 요청 확인
  4. 로그 확인: 실제 설정의 error_log 경로에서 원인 확인
  5. 외부 연결: DNS와 80·443 포트 접근 정책 확인

502라는 상태 코드만으로 원인을 정할 수는 없습니다. 연결 거부인지, 권한 거부인지, 앱이 응답을 끝내기 전에 연결을 닫았는지 로그 메시지를 함께 확인하세요.

작성·확인 범위

작성: 하루하나 편집 초안 · 문서 확인: 2026-09-11. 공식 Nginx 및 RHEL 9 문서와 대조한 설명용 예제입니다. Rocky Linux 실서버에서 실행 검증한 결과는 아니며 배포판·패키지에 따라 설정 경로와 정책이 다를 수 있습니다.

출처: Nginx 프록시 모듈 공식 문서 · RHEL 9 Nginx 구성 문서