Linux 중급: 정적·동적 리소스 분리(Static-Dynamic Separation) 실전 가이드

정적·동적 리소스 분리 기본 개념

정적·동적 리소스 분리는 웹 서버(Nginx)를 중간에 두고 동적 요청(예: PHP, JSP)과 정적 요청(예: 이미지, CSS, JS)을 분리하여 처리하는 방식입니다. 이렇게 하면 불필요한 요청 오버헤드를 줄이고 응답 지연 시간을 낮출 수 있습니다. 가장 큰 장점은 동적 서비스가 중단되더라도 정적 리소스는 영향을 받지 않아 사이트의 일부 기능을 계속 사용할 수 있다는 점입니다.

단일 서버에서 정적·동적 리소스 분리 (Tomcat + Nginx)

다음은 한 대의 서버에서 Nginx가 Tomcat의 동적 요청을 처리하고, 정적 파일은 직접 제공하도록 설정하는 과정입니다.

1. Tomcat 설치 및 실행

# Tomcat 9 다운로드
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.113/bin/apache-tomcat-9.0.113.tar.gz --no-check-certificate

# 압축 해제
tar xf apache-tomcat-9.0.113.tar.gz -C /usr/local/

# 심볼릭 링크 생성
ln -s /usr/local/apache-tomcat-9.0.113/ /usr/local/tomcat

# Java 설치 (Tomcat 실행 환경)
yum -y install java

# Tomcat 시작
sh /usr/local/tomcat/bin/startup.sh

# 8080 포트 확인
ss -tlnp | grep 8080

2. Nginx로 Tomcat 프록시 및 정적 리소스 분리

Nginx 설정 파일 (예: proxy8080.conf)에 다음 내용을 작성합니다.

server {
    listen 80;
    server_name example.com;

    # 정적 리소스 요청: 이미지, SVG 파일 등
    location ~* \.(png|jpg|svg|gif|ico)$ {
        root /code/images;
        gzip on;
        gzip_types image/png image/jpeg image/svg+xml;
        expires 30d;
    }

    # 동적 요청: Tomcat으로 전달
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

설정 파일 문법 확인 후 Nginx 재시작:

nginx -t
systemctl reload nginx

3. 정적 파일 복사 및 권한 설정

Tomcat의 기본 정적 파일(예: 이미지)을 Nginx가 서비스할 디렉터리로 복사합니다.

cp /usr/local/tomcat/webapps/ROOT/*.png /usr/local/tomcat/webapps/ROOT/*.svg /code/images/

권한 문제로 접근이 거부될 경우, Nginx 사용자(예: nginx)가 해당 디렉터리를 읽을 수 있도록 설정합니다.

chown -R nginx:nginx /code/images

이제 http://example.com/bg-middle.png 같은 요청은 Nginx가 직접 처리하고, http://example.com/test.jsp 같은 동적 요청은 Tomcat으로 전달됩니다.

로드 밸런서를 통한 정적·동적 리소스 분리

여러 대의 서버를 사용할 때는 한 서버(web01)는 정적 리소스 전용, 다른 서버(web02)는 동적 리소스(Tomcat) 전용으로 구성하고, 로드 밸런서에서 요청을 분기합니다.

1. 정적 서버(web01) 구성

Nginx 설정 파일 (static.conf):

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

    root /code;
    location / {
        try_files $uri $uri/ =404;
    }
}

테스트용 이미지 생성:

mkdir -p /code/images
touch /code/images/a.png

Nginx 재시작 후 http://static.example.com/a.png 접속 확인.

2. 동적 서버(web02) 구성

Tomcat 설치 및 실행 (web01과 동일한 방법).

테스트 JSP 파일 생성 (/usr/local/tomcat/webapps/ROOT/test.jsp):

<html>
<body>
<h1>Random Number: <%= Math.random() %></h1>
</body>
</html>

Tomcat 포트 8080이 열려 있는지 확인.

3. 로드 밸런서(LB) 설정

로드 밸런서 역할을 할 서버의 Nginx 설정 (lb.conf):

upstream static_backend {
    server 10.0.0.7:80;   # web01 정적 서버
}

upstream dynamic_backend {
    server 10.0.0.8:8080; # web02 Tomcat 서버
}

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

    # 정적 리소스는 web01로
    location ~* \.(png|jpg|svg|gif|ico|css|js)$ {
        proxy_pass http://static_backend;
    }

    # 동적 요청은 web02의 Tomcat으로
    location / {
        proxy_pass http://dynamic_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

로컬 hosts 파일에 integrated.example.com을 LB 서버 IP로 매핑한 후 접속하면, web01의 정적 이미지와 web02의 동적 난수 페이지가 함께 표시됩니다.

4. 장애 격리 테스트

  • web01의 Nginx를 중단하면 정적 이미지가 표시되지 않지만, 동적 페이지는 정상 작동합니다.
  • web02의 Tomcat을 중단하면 동적 콘텐츠(난수)가 표시되지 않지만, 정적 이미지는 여전히 로드됩니다.

이를 통해 정적·동적 리소스 분리가 서비스 가용성에 긍정적인 영향을 미치는 것을 확인할 수 있습니다.

태그: nginx Tomcat 정적동적분리 로드밸런싱 linux

8월 19일 09:32에 게시됨