Nginx缓存来自不同应用程序的静态文件

时间:2017-02-27 18:15:01

标签: caching nginx

我使用WordPress作为主页(mysite.com)和其余的Django(mysite.com/pages)。我有两个nginx配置文件,它的工作正常。而且,它们位于一个server块中。

以下是我配置的部分内容:

server {
    ...
    root /var/www/wordpress;
    ...
    location /static/ {
        alias  /home/username/Env/virtenv/mysite/static/;
    }
}

这样就可以提供WordPress和Django静态文件。 现在我想在浏览器中缓存所有静态文件7天。如果我再加上这个:

location ~*  \.(jpg|jpeg|png|svg|gif|ico|css|js)$ {
    expires 7d;
}

然后正确缓存了WordPress静态文件,但是甚至没有提供Django的静态文件。

我知道这是因为永远不会到达/static/位置,然后Nginx在root指令中搜索Django的文件,该指令位于server块级别,并且指向WordPress位置。

我可以删除缓存位置,并在/ static / expires 7d;中添加location。这将只在相反的缓存中只有Django的静态文件。

但是如何让这两个静态资源缓存一周呢?

1 个答案:

答案 0 :(得分:0)

最后,我能够缓存Wordpress和Django的静态文件。 对于以/static/开头的请求,我找到了一种方法可以让Nginx使用/static/ location而不是常规静态文件location,其目的只是为了缓存Wordpress静态文件。

非常简单:只需使用位置修饰符^~即可。

正如DigitalOcean这篇精彩的文章所说:

  

块修饰符^~表示如果选择此块作为最佳非正则表达式匹配,则不会进行正则表达式匹配。

以下是两个位置块的工作版本:

location ~*  \.(?:jpg|jpeg|png|svg|gif|ico|css|js)$ {
    # Cache Wordpress or any other public static files
    # of those types for a week in the browser
    expires 7d;
}

location ^~ /static/ {
    alias  /home/username/Env/virtenv/mysite/static/;
    # Cache Django's static files for a week in the browser
    expires 7d;
}

mysite.com/static/...的所有请求都将与/ static / location匹配,并且不会继续到任何其他正则表达位置。

例如mysite.com/wp-content/themes/a-theme/style.css?ver=4.7.2的请求 将匹配正则表达式位置。