欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

2)nginx purge更新缓存404错误

2012年2月25日
 

nginx默认安装就会带有反向代理的功能,但想要更好的使用,还得配备frickle.com的ngx_cache_purge模块,用于清除指定URL的缓存。ngx_cache_purge在安装的nginx的时候一起编译进去了,缓存功能一直正常。
文件地址:www.abc.com/includes/templates/zcen/buttons/english/button_in_cart.gif
如下图:

nginx 404

nginx purge 清理缓存失败

但是清理缓存的时候竟然会404
地址:www.abc.com/purge/includes/templates/zcen/buttons/english/button_in_cart.gif

nginx 404

nginx purge 清理缓存失败

百思不得其解,网上遇到nginx清理缓存出现404的用户不在少数,网上一共有如下3中情况:
1、  ngx_cache_purge版本与nginx版本不匹配
换了一个版本的purge,发现依旧无效

2、  nginx启动方法不对
很多人安装完nginx,仅仅reload一次nginx,实际上应该stop之后在start。这不是我的解决方法。

3、  purge未编译到nginx中
肯定不是这个问题,nginx –V能查看编译参数

因为有其他事情,这个事情暂且搁置了,一天闲来无事,看着nginx的配置文件发呆,突然发现自己犯了一个很大的错误:purge的location放错了位置。

错误配置文件:

location /
{

proxy_pass http://xxx.ttlsa.com;
include proxy.conf;

}

location ~ .*\.(png|jpg|gif|GIF|jpeg|JPG|PNG|bmp|BMP|JPEG)?$
{
include proxy.conf;
proxy_pass http://xxx.ttlsa.com;
expires      1h;
access_log off;
}

location ~ /purge(/.*)
{
allow            127.0.0.1;
allow            192.168.12.0/24;
proxy_cache_purge    cache_one   $host$1$is_args$args;
}

正确配置文件:

location /
{

proxy_pass http://xxx.ttlsa.com;
include proxy.conf;

}

location ~ /purge(/.*)
{
allow            127.0.0.1;
allow            192.168.12.0/24;
proxy_cache_purge    cache_one   $host$1$is_args$args;
}

location ~ .*\.(png|jpg|gif|GIF|jpeg|JPG|PNG|bmp|BMP|JPEG)?$
{
include proxy.conf;
proxy_pass http://xxx.ttlsa.com;
expires      1h;
access_log off;
}

细心的兄弟很快能发现我把purge的位置放错了,每次更新图片缓存的时候它都只匹配到了图片后缀的location,接着就返回了404,根本没有匹配到purge这个location的机会。把purge调到前面就正常了。

 

版权说明

文章标题: nginx purge更新缓存404错误
本文地址: http://www.ttlsa.com/nginx/nginx-purge-404-error/
除非注明,博客文章均为"运维生存时间"原创,转载请标明本文地址
交流群:①群39514058(满)、②群6690706(满)、③群168085569(新)

关注微博

 
 
      • @默北 我有个小问题尤其不理解。希望你能抽空帮我解惑。先说下架构吧。代理nginx,后端应用php+nginx。
        经常在网上看到这样的配置。location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; }。有很多解释。一些称为缓存在客户端浏览器。一些称为缓存到前端代理,不经过php应用。so,那么问题来了:
        1、这个location块应该放在代理nginx,还是后端应用的nginx。(假如是我这个架构)
        2、就是网上的解释哪个正确。
        3、这些gif,jpg…在哪个位置。(因为有时候做自定义页面跳转时经常读不到图片,虽然能正常跳转了)
        不知道这些问题是否很低级,但总算是我的一个学习过程。希望@默北或大伙能帮我解惑。在这谢谢大家了。

        • 配置在后端好。
          上面解释的也对。
          非源服务器不管前面有多少层代理,你都可以把代理当成浏览器来看待。

          • @默北
            1、测试时这个jpg的location放置在后端。但在前端代理中,gif|jpg|jpeg|png|bmp|swf这些文件缓存在哪呢?
            2、另外,在做jpg的location时如果只简单的写expires,这些图片的去读的根路径默认是从server块下root根还是nginx默认的html根?(测试时.php的location下有指定root /images,图片在/images下。在server块上加root /images能访问到图片。去掉server块下的root指令,图片404。)
            3、当然,我在考虑是否是因为.jpg的请求发现没有匹配的location块所以图片出现404。最后添加一个默认的location / { root /images; },发现还是图片404。这下有些醉了。
            具体配置如下(这个是能正常访问图片的):
            server {
            listen 80;
            server_name web1.com;
            index index.php index.htm index.html;
            root /images;
            #location / {
            # root /images;
            #}
            location ~ .php$ {
            # root /images;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            }
            location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; }
            location ~ .*.(js|css)?$ { expires 12h; }
            }

  1. Pingback: nginx教程从入门到精通 | learsu

  2. 楼主,尼玛就一COPY党,路径不要搞错了好不,搞得半天cache都是404错误。

普通分类: