가장 큰 효과가 여기서 나온다. 정적 리소스를 Apache가 직접 서빙하도록 분리.
# httpd-vhosts.conf 또는 메인 conf
# 1) Alias: URL 경로를 디스크 디렉토리에 연결
Alias /resources /srv/webapp/your-app/static
<Directory "/srv/webapp/your-app/static">
Options -Indexes
AllowOverride None
Require all granted
</Directory>
Alias /files /srv/webapp/your-app/upload
<Directory "/srv/webapp/your-app/upload">
Options -Indexes
AllowOverride None
Require all granted
</Directory>
# 2) JkUnMount: 위 경로는 Tomcat이 처리하지 않음
JkUnMount /resources/* worker1
JkUnMount /files/* worker1
# 3) JkMount: 나머지는 Tomcat
JkMount /* worker1전체 예시: configs/httpd-vhosts.conf.example
URL /resources/... 요청이 들어오면 Apache가 /srv/webapp/your-app/static/... 파일을 직접 서빙.
Tomcat을 거치지 않는다.
해당 디스크 디렉토리에 대한 권한·옵션 설정.
Options -Indexes: 디렉토리 자동 인덱싱 비활성. (보안)AllowOverride None:.htaccess무시. (성능 + 보안)Require all granted: 모든 접근 허용.
mod_jk 라우팅 테이블에서 해당 경로를 제외. JkMount가 잡은 후에 JkUnMount가 풀어준다.
JkMount /*보다 JkUnMount /resources/*가 위에 있어도 OK — mod_jk는 더 구체적인 매칭(/resources/*)을 우선한다.
다만 가독성을 위해 JkUnMount를 먼저 두는 것이 관례.
옵션 A — 운영 디렉토리 안 (전형적):
/srv/webapp/your-app/
├── static/ ← Alias 대상
├── upload/ ← Alias 대상
└── WEB-INF/ ← Tomcat 전용 (Apache가 접근하면 안 됨)
옵션 B — Tomcat webapps 내부:
/usr/local/tomcat/webapps/your-app/
├── static/ ← Tomcat과 Apache 둘 다 접근 가능 (Alias)
└── WEB-INF/
둘 다 동작하지만 옵션 A가 권장. Tomcat이 정적 파일을 신경 안 쓰게 분리하는 것이 본 가이드의 정신.
# 정적 리소스 요청
curl -I https://your-domain.example/resources/css/main.css
# Apache access_log에 찍힘
tail -1 /usr/local/httpd/logs/access_log
# Tomcat access log에는 찍히지 않아야 정상
tail -10 /usr/local/tomcat/logs/localhost_access_log.YYYY-MM-DD.log | grep main.css
# (출력 없음)Tomcat 로그에 더 이상 정적 파일이 안 보이면 Step 1 성공.
# Apache 데몬 사용자가 디렉토리를 읽을 수 있는지 확인
ls -la /srv/webapp/your-app/static
# drwxr-xr-x. daemon daemon
# 안 맞으면
sudo chown -R daemon:daemon /srv/webapp/your-app/static
sudo chmod -R 755 /srv/webapp/your-app/staticSELinux가 enforcing이면 fcontext 추가 필요:
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/webapp/your-app/static(/.*)?"
sudo restorecon -Rv /srv/webapp/your-app/static이 단계 하나만 적용해도 본인 환경에서 정적 응답이 0.133초 → 0.07~0.08초 정도로 개선되었다. 나머지 단계는 그 다음의 "마지막 한 방울"이다.
다음 단계 → 03-rewrite-priority.md