nginx를 웹 캐시로 사용하는 올바른 방법

nginx를 웹 캐시로 사용하는 올바른 방법

nginx를 웹 캐시로 사용하려고 하는데 실패했습니다.

내 시스템은 nginx가 gunicorn 웹 서버(Django 애플리케이션)의 역방향 프록시인 Ubuntu 16.04 서버입니다.

웹 캐싱을 구성하기 위해 파일 상단 virtual host( 에 있는 줄 sites-available)에 다음 줄을 추가했습니다.

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=90m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

다음으로 기본 server범위 내에는 다음 코드 조각이 있습니다(캐싱 지시문을 삽입한 위치).

location @https_proxy_to_app {
    proxy_cache static_cache;
    proxy_cache_bypass $http_cache_control;
    add_header X-Proxy-Cache $upstream_cache_status;

    proxy_set_header X-Forwarded-Proto https;
    # additional proxy parameters
    include proxy_params;

    proxy_redirect off;
    proxy_pass http://app_server;
}

정적 자산 URI를 컬링하려고 할 때 캐시 HITS 또는 MISSES가 발생하지 않습니다(캐시가 작동하는지 여부를 테스트하는 유일한 방법입니다). 따라서 캐싱이 작동하지 않습니다. 내가 의미하는 바는 다음과 같습니다.

시도 curl -X GET -I https://example.com/static/css/my_app.css결과:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 22 Jan 2020 08:05:37 GMT
Content-Type: text/css
Content-Length: 26597
Last-Modified: Fri, 03 Jan 2020 14:23:59 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5e0f4e7f-67e5"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Accept-Ranges: bytes

이는 X-Proxy-Cache: HIT또는 를 포함해야 했기 때문에 문제가 됩니다 X-Proxy-Cache: MISS. 문제를 진단하는 데 도움을 주세요.


다음은 내 모든 location블록입니다(나타나는 순서대로):

location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$ {

    root /home/ubuntu/app/myproj/;
    access_log off;
    error_log off;

}

# shows number of connections at https://example.com/status_nginx
location /status_nginx {
    stub_status on;
    allow 127.0.0.1;
    deny all;
}

location / {

    limit_conn conn_limit_per_ip 20;
    limit_req zone=req_limit_per_ip burst=10 nodelay;

    limit_req_log_level warn;

    #proxy_pass_request_headers on;
    proxy_buffering on;
    proxy_buffers 24 4k;
    proxy_buffer_size 2k;
    proxy_busy_buffers_size 8k;

    try_files $uri @https_proxy_to_app;
}

location @https_proxy_to_app {

    proxy_cache static_cache;
    proxy_cache_bypass $http_cache_control;
    add_header X-Proxy-Cache $upstream_cache_status;

    proxy_set_header X-Forwarded-Proto https;
    # additional proxy parameters
    include proxy_params;

    proxy_redirect off;
    proxy_pass http://app_server;
}

답변1

파일 .css은 구성에서 다음 블록을 사용하여 제공됩니다.

location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$
    root /home/ubuntu/app/myproj/;
    access_log off;
    error_log off;
}

이는 nginx가 요청을 처리하기 위해 업스트림 서버를 사용하지 않고 파일을 직접 보내고 있음을 의미합니다. 이는 캐싱이 수행되지 않음을 의미합니다.

.css목록에서 확장자를 제거하고 이 CSS 파일을 찾을 수 있는 디렉터리를 가리키지 않으면 요청이 업스트림 서버로 root이동합니다 .proxy_pass

그런 다음 업스트림 서버가 적절한 HTTP 캐시 헤더를 설정하면 응답이 캐시됩니다.

관련 정보