정적·동적 리소스 분리 기본 개념
정적·동적 리소스 분리는 웹 서버(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을 중단하면 동적 콘텐츠(난수)가 표시되지 않지만, 정적 이미지는 여전히 로드됩니다.
이를 통해 정적·동적 리소스 분리가 서비스 가용성에 긍정적인 영향을 미치는 것을 확인할 수 있습니다.