Nginx fastcgi_cache 的坑

这两天迁移完后发现一个奇怪的问题:我nginx里配置了两个vhost,分别是博客(www.repfaststart.com)和图床(tu.repfaststart.com),然后有时候,当我访问图床时,打开来的结果是博客。

遇到这种问题,第一印象是我nginx配置文件写错了?检查了下,没错啊,server_name 配置的明明白白,清清楚楚的。看日志,抓包,两个结果都是相同的,显示直接返回的200状态码。而nginx的日志,我两个vhosts的日志是分开记录的,当出现上诉情况时,tu.log里会记录一条200,然后在www.log里记录了其他页面元素的记录。

在排除了CDN配置和php-fpm错误的可能性后,我又想到了日志里那条诡异的200日志,之前没注意看,现在看发现这条日志没有upstream,也就是说没经过php-fpm处理,那可以肯定,还是nginx自己的问题了。

又重新审视了下nginx的配置文件,终于找到了原因,下面是图床(tu.repfaststart.com)配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fastcgi_cache_path /data/cache/tu levels=1:2 keys_zone=tu:10m;
#省略无关配置
server {
listen 443 ssl http2;
server_name tu.repfaststart.com;
#省略无关配置
location ~ \.php$ {
fastcgi_pass unix:/dev/shm/php-cgi.sock;
include /app/nginx/conf/fastcgi.conf;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri =404;

expires -1;
#下面这行就是根源所在
fastcgi_cache www;
fastcgi_cache_key $request_uri;
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_valid 200;
add_header X-Cache $upstream_cache_status;
}
}

可以看到,我这里配置了fastcgi_cache,然后我这个配置文件是拷贝博客(www.repfaststart.com)的配置文件修改的,下面的fastcgi_cache的keys_zone没有更改过来,因此两个网站使用了共同的缓存,而缓存是用request_uri做主键的,所以当直访问/这个两者共有的请求时,fastcgi_cache会直接把缓存的内容返回给客户端,就出现了这次的症状。

知道了问题根源,那就很好办了,修改完配置文件,重载nginx,至此问题解决。这次还是粗心大意导致的问题,还好是自己的网站,如果是公司业务,那麻烦可就大咯。

作者

Frog Rain

发布于

2020-02-12

更新于

2025-04-08

许可协议