Skip to content

Latest commit

 

History

History
109 lines (80 loc) · 3.35 KB

03-rewrite-priority.md

File metadata and controls

109 lines (80 loc) · 3.35 KB

03. Step 2 — Rewrite 우선순위

Apache의 Rewrite는 JkUnMount보다 먼저 동작한다. 이 사실을 모르면 Step 1의 효과가 무력화될 수 있다.

처리 순서

Apache 요청 처리 단계 (간략):

1. URL 정규화
2. mod_rewrite 적용 (RewriteRule)
3. <Location> / <Directory> 매칭
4. JkMount / JkUnMount 평가
5. 실제 처리 (Tomcat 또는 Apache 직접)

mod_rewrite가 2단계, JkMount/JkUnMount가 4단계. 즉 Rewrite가 /resources/...를 /ott/resources/...로 바꿔버리면, 4단계에 도착할 때는 이미 다른 경로다. JkUnMount의 /resources/* 패턴은 더 이상 매칭되지 않는다.

문제 상황 코드

# Step 1만 적용한 상태
Alias /resources /srv/webapp/your-app/static
JkUnMount /resources/* worker1
JkMount /* worker1

# 그런데 사이트 진입 처리용 Rewrite가 있다
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/ott
RewriteRule "^(.*)$" "/ott/$1" [R,L]

/resources/css/main.css 요청이 들어오면:

  1. Rewrite 평가: /resources/css/main.css가 /ott/...로 시작 안 함 → 룰 적용
  2. 변환: /ott/resources/css/main.css로 리라이트 + 301 리다이렉트
  3. 클라이언트가 새 URL로 재요청: /ott/resources/css/main.css
  4. JkUnMount 평가: 이 URL은 /resources/* 패턴 매칭 안 됨 → Tomcat으로 감

결국 정적 리소스가 다시 Tomcat을 거치게 됨.

해결 — RewriteCond 추가

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/ott
RewriteCond %{REQUEST_URI} !^/resources    # 추가
RewriteCond %{REQUEST_URI} !^/files        # 추가
RewriteRule "^(.*)$" "/ott/$1" [R,L]

!^/resources = "URI가 /resources로 시작하지 않을 때만 룰 적용". 조건이 누적되어 정적 경로는 Rewrite가 건너뛴다.

검증

# RewriteLog 활성화 (임시)
# httpd.conf 또는 vhost
LogLevel rewrite:trace3
# 재기동 후 정적 리소스 요청
curl -I https://your-domain.example/resources/css/main.css

# error_log에 다음 패턴이 보이면 정상
tail -f /usr/local/httpd/logs/error_log
# "RewriteCond: input='/resources/css/main.css' pattern='!^/resources' => not-matched"
# "RewriteRule: ... not applied"

not applied가 보이면 Step 2 성공. 정적 경로는 더 이상 Rewrite가 건드리지 않는다.

추가 패턴이 있는 경우

운영 환경에 따라 여러 Rewrite 룰이 있을 수 있다. 정적 경로를 건드릴 가능성이 있는 룰을 모두 점검.

# 예 - 사용자 도메인 / 어드민 도메인 분리
<VirtualHost *:443>
    ServerName www.example.com

    RewriteCond %{REQUEST_URI} !^/ott
    RewriteCond %{REQUEST_URI} !^/resources
    RewriteCond %{REQUEST_URI} !^/files
    RewriteRule "^(.*)$" "/ott/$1" [R,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName admin.example.com

    # 어드민 도메인은 다른 Rewrite (있다면)
    RewriteCond %{REQUEST_URI} !^/admin
    RewriteCond %{REQUEST_URI} !^/resources    # 동일하게 추가
    RewriteRule "^(.*)$" "/admin/$1" [R,L]
</VirtualHost>

VirtualHost 각각의 Rewrite를 모두 보호.

효과만 검증한 결과 (Step 1 + Step 2)

Step 1과 합쳐서 본인 환경에서 정적 응답이 0.07초 → 0.045초 수준으로 개선. 나머지는 Step 3·4에서 "더 끌어올리는" 영역.

다음 단계 → 04-ajp-thread-pool.md