설정은 nginx에서 제공되는 정적 컨텐츠의 헤더를 만료합니다


96

정적 콘텐츠를 서버에 저장하기 위해 nginx를 사용하고 있는데 특정 규칙을 충족하는 모든 파일에 대해 만료 헤더를 설정할 수 있습니까? 예를 들어 확장자가 '.css'인 모든 파일에 대해 expires 헤더를 설정할 수 있습니까?

답변:


126

더 많은 파일 확장자 외에도 더 완벽한 캐시 헤더를 선호합니다. '?' 접두사는 '비 캡쳐'마크이며 nginx는 $ 1을 만들지 않습니다. 불필요한 부하를 줄이는 데 도움이됩니다.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

7
추가 한 후 모든 정적 파일을 찾을 수 없습니다.
— Jürgen Paul

@ JackSpairow : 그것이 항상 나를 위해 일한 것처럼 왜 그런 일이 일어 났는지 설명 할 수 없습니다. add_header 제공 모듈이 누락 된 Nginx를 실행 중입니까? 이런 종류의 것은 실제로 범위가 제한되어 있습니다. 다른 감속이 문제가되지 않습니까?
— JM Becker

24
다른 블록에 정적 파일에 대한 정의가있을 root수 있습니다.이 경우 해당 블록에 지시문을 추가해야합니다. (이것은 2 년 늦었지만 미래의 시민을위한
— 것임을 알고 있습니다

1
필자는 원래 게시물 이후 오랫동안 표시되기 때문에 특히 미래의 검색 자에게 명확하게 설명해 주셔서 감사합니다. +1 : P
— JM Becker

이것을 사용하면 내 워드 프레스 웹 사이트가 완전히 엉망이됩니다. CSS와 이미지가 표시되지 않습니다. 어딘가에 다른 갈등이 있습니까?
— user1641443


17

허용되는 답변으로 인해 파일이 더 이상 표시되지 않는 이유에 대해 언급 할만한 평판이 충분하지 않지만 알아 낸 후 도와 드리겠습니다.

짧은 버전 :

전역 디렉토리 세트가없는 경우 이미지에서 위치 블록에 대해 지정된 루트 디렉토리가 있는지 확인하십시오!

아래 긴 버전 :


우선,이 솔루션을 구현하는 방법은 실제로이 답변 과 비슷 합니다. 허용 된 답변에서와 같이 규칙을 작성하십시오.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

img-cache.conf 파일로

그런 다음 해당 파일을 server {...}지시문에 포함시킵니다.

내 사이트 사용 가능 폴더에있는 somesite.com의 예 :

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

이렇게하면 실행중인 여러 사이트에 이미지 캐싱 위치 블록을 추가 할 수 있습니다.


둘째, 내 / var / www /에 public_html로 허용되는 두 개의 폴더 (보안 및 교육)가 포함되어있는 상황이 발생하므로 사이트의 서버 지시문에서 특정 폴더를 지정하여 특정 위치 블록을 만들어야합니다.

따라서 전역 루트 디렉토리가 설정되어 있지 않습니다 .

따라서 이미지 위치 블록을 만들 때 이미지 를 찾을 루트 디렉토리 를 제공하지 않을 수 있습니다 !

내 솔루션은 다음과 같습니다.

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

1
이것을 재사용 할 수있게 해주는 +1 .conf. 에 해당 폴더가 nginx/1.14.0 (Ubuntu)될 것으로 보인다 /etc/nginx/snippets/.
— Jan Werkhoven

9

만료를 최대로 설정할 수도 있습니다. 다음은 CSS와 js에 사용하는 지시문입니다.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}

1
서버 {} 블록에서만 루트 지시문을 사용합니다. 하위 위치에서 사용하면 예기치 않은 결과가 발생합니다. 휴식이 필요 없습니다. if {} 블록에 있지 않기 때문에
— Dave Cheney

네 말이 맞아 이것을 정리하는 것을 잊었다. 이것을 반영하도록 수정되었습니다.
— Jauder Ho

4

위에서 언급 한 모든 솔루션은 다른 경로에 대해 다른 별칭을 가질 가능성을 거부합니다. 또한 한곳에서 모든 다른 캐시 만료를 위해 다음과 같은 방식으로 nginx 맵을 사용해야합니다.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Off캐싱을 비활성화하고 epoch(유닉스 시대의 경우) 항상 리소스를 다시 가져 오며 max날짜를 브라우저 최대 값으로 설정합니다.

~ image /는 모든 이미지 유형과 일치합니다.

nginx 맵에 대한 자세한 내용은 http://nginx.org/en/docs/http/ngx_http_map_module.html 에서 확인 하십시오 .


경우 참고 $sent_http_content_type입니다 "text/css;charset=UTF-8"위의 표현은 실패합니다.
— pachanka

2

모든 정적 파일이있는 곳이 있으면 다음과 같이됩니다.

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

수락 된 답변으로 인해 nginx가 내 정적 파일을 찾지 못했습니다. 왜 그런지 잘 모르겠지만 이것은 간단한 대안입니다.


나는 이것에 투표했지만 /static별명 끝에 ( .../files예에서 바로 뒤에) 폴더 (위치에 설정 한 것) 를 추가했는지 확인하십시오 .
— Miro J.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.