nginx purge更新缓存404错误

凉白开 Nginx1624,1534字数 1459阅读4分51秒阅读模式

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文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

nginx 404

nginx purge 清理缓存失败

百思不得其解,网上遇到nginx清理缓存出现404的用户不在少数,网上一共有如下3中情况:
1、  ngx_cache_purge版本与nginx版本不匹配
换了一个版本的purge,发现依旧无效文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

2、  nginx启动方法不对
很多人安装完nginx,仅仅reload一次nginx,实际上应该stop之后在start。这不是我的解决方法。文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

3、  purge未编译到nginx中
肯定不是这个问题,nginx –V能查看编译参数文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

因为有其他事情,这个事情暂且搁置了,一天闲来无事,看着nginx的配置文件发呆,突然发现自己犯了一个很大的错误:purge的location放错了位置。文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

错误配置文件:文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

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;
}

正确配置文件:文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

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调到前面就正常了。文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/

文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/文章源自运维生存时间-https://www.ttlsa.com/nginx/nginx-purge-404-error/
weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
凉白开
  • 本文由 发表于 25/02/2012 19:44:28
  • 转载请务必保留本文链接:https://www.ttlsa.com/nginx/nginx-purge-404-error/
  • nginx 404
  • nginx purge模块
  • nginx缓存更新失败
  • ngx_cache_purge 404
  • pure 404
  • purge缓存404
评论  16  访客  12
    • Aceslup
      Aceslup 9

      博主,这个是location块匹配顺序的问题吧。啥时候开坛做法?

        • 默北
          默北 6

          @ Aceslup 嗯。 优先级也要考虑下。 这个其实可以把purge优先级弄高。参见:http://www.ttlsa.com/nginx/nginx-location-configure/

            • Aceslup
              Aceslup 9

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

                • 默北
                  默北 6

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

                    • Aceslup
                      Aceslup 9

                      @ 默北 @默北
                      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; }
                      }

              • 尼玛坑爹货
                尼玛坑爹货 9

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

                • 细节决定成败!
                  细节决定成败! 9

                  确实,好文章!

                  • iSeeUFO网
                    iSeeUFO网 0

                    图看不到了

                      • 邓贇
                        邓贇 7

                        @ iSeeUFO网 图片再一次迁移过程中丢失了, 其实没有图片关系也不大.

                      • tt
                        tt 9

                        就你这文章靠谱,如果是的位置不对,nginx直接将purge发送到源站请求,删除失败

                          • 尼玛坑爹货
                            尼玛坑爹货 9

                            @ tt 他妈的楼主就一copy党,错误的路径怎么可能删除到缓存。

                          • dev
                            dev 9

                            多谢

                          评论已关闭!