location ~* \.(js|css|png|jpg|jpeg|svg|woff2?)$ {
expires 7d; # 7일간 캐시
add_header Cache-Control "public, max-age=604800";
}
expires 7d;add_header Cache-Control "public, max-age=604800";public: 공유 캐시(CDN 등)도 리소스를 저장할 수 있게 허용max-age=604800: 초 단위(7일×24h×3600s)로 유효 기간 지정문제: 브라우저가 7일간 캐시를 사용하면서, 파일을 업데이트해도 클라이언트가 구버전을 계속 볼 수 있음
대처: 파일명에 해시(bundle.abc123.js) 적용
→ 파일이 변경될 때마다 새로운이름으로 배포
파일명 해시 적용
//webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
// [name]: 진입점 이름, [contenthash]: 파일 내용 기반 해시
filename: '[name].[contenthash].js',
clean: true, // 배포 전 dist 폴더 정리
publicPath: '/',
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
// 스크립트 태그에 자동으로 해시된 파일명 삽입
}),
],
mode: 'production',
};
add_header Cache-Control "public, max-age=604800, immutable";
기존: public, max-age=604800 → 7일 동안 재검증 없이 캐시
그러나 일부 브라우저/CDN은 만료 전에도 ETag/Last-Modified 조건 요청을 보낼 수 있음
immutable 추가 시:“이 리소스는 절대 변경되지 않는다” 고 강력히 선언
브라우저/프록시는 만료 기간 내내 (max-age 동안) 절대
서버에 조건부 요청(If-None-Match/If-Modified-Since)도 보내지 않습니다
결과적으로 네트워크 왕복(왕복 시간) 완전 제거
→ 캐시 적중률·성능 최상. 오직 파일명이 바뀔 때(해시 변경)만 새 리소스를 요청
⚠️ 주의:
1. 해시 전략과 함께 사용해야 안전합니다.
2. 파일 내용이 바뀌어도 이름이 같다면, 브라우저는 갱신하지 않습니다!
# 오직 js, css, 이미지 파일만 7일간 캐싱
location ~* \.(?:js|css|png|jpg|jpeg|svg|woff2?)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800, immutable";
}
# 예: API 응답(JSON/XML) 또는 HTML 조각
location ~* \.(?:json|xml|html)$ {
# 1) 브라우저에 캐시 저장은 허용하되 매 요청마다 서버 재검증
add_header Cache-Control "no-cache, must-revalidate";
# 또는
# add_header Cache-Control "no-store";
# 실제 파일 서빙 시
root /var/www/myapp/data;
}
# 또는 API 엔드포인트 전체
location /api/ {
proxy_pass http://backend;
add_header Cache-Control "no-cache, must-revalidate";
}
no-cache: 로컬 저장은 가능하나, 매번 ETag/Last-Modified 로 조건부 GET 재검증must-revalidate: 서버가 캐시 만료 후 반드시 유효성 확인no-store: 어떤 상황에도 저장 금지(가장 강력)Gzip 압축
http {
gzip on;
gzip_min_length 1024;
gzip_types text/plain application/javascript text/css application/json;
gzip_proxied any;
}
1️⃣ gzip on;
2️⃣ gzip_min_length 1024;
3️⃣ gzip_types …
4️⃣ gzip_proxied any;
5️⃣ 효과