설정은 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.