上一篇: 架构设计:负载均衡层设计方案(1)——负载场景和解决方式

下一篇:开启nginx cache后导致内存几乎100%问题

nginx proxy cache不能进行304响应

昨天在整合某些系统的nginx配置时,出现了当使用nginx cache时无法返回304响应的情况,出问题的响应头

Content-Type:text/html; charset=gb2312
Date:Mon, 05 Jan 2015 01:58:05 GMT
Expires:Mon, 05 Jan 15 02:03:00 GMT
Last-Modified:Mon, 05 Jan 15 01:58:00 GMT

对于这个日期格式 nginx是不认识的,nginx能识别的日期格式:

no = 0,
rfc822, /* Tue, 10 Nov 2002 23:50:13 */
rfc850, /* Tuesday, 10-Dec-02 23:50:13 */
isoc /* Tue Dec 10 23:50:13 2002 */

这是因为Expires和Last-Modified是通过如下方式设置的:

header('Last-Modified: ' . gmdate('D, d M y H:i:s', $now_time) . ' GMT');
header('Expires: ' . gmdate('D, d M y H:i:s', $now_time + $max_age) . ' GMT');

这样生成的年是两位而不是四位,把小写y改成大写Y即可。 不过对于如上内容,浏览器和CDN端能正常识别该日期,并能正确的返回304。

另外在测试时发现,在使用Chrome浏览器时,假设第一次请求时响应内容是:

Status Code:200 OK
Age:20
Cache-Control:max-age=300
Connection:keep-alive
Content-Encoding:gzip
Content-Length:14412
Content-Type:text/html; charset=gbk
Date:Mon, 05 Jan 2015 02:10:56 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Last-Modified:Mon, 05 Jan 2015 02:10:55 GMT
Vary:Accept-Encoding

当按F5时,会发现返回了304:

Status Code:304 Not Modified
Cache-Control:max-age=300
Connection:keep-alive
Date:Mon, 05 Jan 2015 02:12:11 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Vary:Accept-Encoding

如果再次按F5时,会发现

Status Code:200 OK
Age:4
Cache-Control:max-age=300
Connection:keep-alive
Content-Encoding:gzip
Content-Length:14412
Content-Type:text/html; charset=gbk
Date:Mon, 05 Jan 2015 02:10:56 GMT
Expires:Mon, 05 Jan 2015 02:15:55 GMT
Last-Modified:Mon, 05 Jan 2015 02:10:55 GMT
Vary:Accept-Encoding

如果按F5时时再带上Last-Modified,那么还是会出现304, 目前测试几个浏览器中只有Chrome是这种情况。 如果那种预售秒杀商品,是会频繁刷新的。

上一篇: 架构设计:负载均衡层设计方案(1)——负载场景和解决方式

下一篇:开启nginx cache后导致内存几乎100%问题