欢迎各位兄弟 发布技术文章
这里的技术是共享的
nginx默认安装就会带有反向代理的功能,但想要更好的使用,还得配备frickle.com的ngx_cache_purge模块,用于清除指定URL的缓存。ngx_cache_purge在安装的nginx的时候一起编译进去了,缓存功能一直正常。
文件地址:www.abc.com/includes/templates/zcen/buttons/english/button_in_cart.gif
如下图:
但是清理缓存的时候竟然会404
地址:www.abc.com/purge/includes/templates/zcen/buttons/english/button_in_cart.gif
百思不得其解,网上遇到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调到前面就正常了。
博主,这个是location块匹配顺序的问题吧。啥时候开坛做法?
嗯。 优先级也要考虑下。 这个其实可以把purge优先级弄高。参见:http://www.ttlsa.com/nginx/nginx-location-configure/
@默北 我有个小问题尤其不理解。希望你能抽空帮我解惑。先说下架构吧。代理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; }
}
Pingback: nginx教程从入门到精通 | learsu
楼主,尼玛就一COPY党,路径不要搞错了好不,搞得半天cache都是404错误。
确实,好文章!