我有两台配置几乎完全相同的服务器。一台是我的生产服务器,另一台是我的临时服务器。两台服务器上的 nginx 配置都是彼此的副本,除了服务器名称(以及我使用服务器名称的其他任何地方)
这是我的暂存服务器的配置。
server {
listen 80;
server_name *.johnvarghese.info johnvarghese.info;
return 301 https://$host$request_uri;
}
server {
listen 443;
ssl on;
ssl_certificate /etc/johnvarghese.info.ssl/star.johnvarghese.info.bundle.crt;
ssl_certificate_key /etc/johnvarghese.info.ssl/star.johnvarghese.info.key;
server_name support.johnvarghese.info;
return 301 "$scheme://johnvarghese.info/support${request_uri}";
}
server {
listen 443;
ssl on;
ssl_certificate /etc/johnvarghese.info.ssl/star.johnvarghese.info.bundle.crt;
ssl_certificate_key /etc/johnvarghese.info.ssl/star.johnvarghese.info.key;
server_name *.johnvarghese.info johnvarghese.info;
passenger_ruby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby;
passenger_enabled on;
root /var/www/johnvarghese.info/current/public;
location ~* \.(mp4|ogg|webm)$ {
expires 10d;
add_header Cache-Control "max-age=864000";
}
}
临时服务器名为 johnvarghese.info。在生产服务器上,我将所有 johnvarghese.info 实例替换为 servername.com。
我感兴趣的是配置中的最后三行 - 我只想缓存 webm 视频文件(我循环播放)。它在临时服务器上运行良好。下载视频后,我可以关闭笔记本电脑上的无线网络,视频将一直循环播放,无需进一步下载。从第二次开始,控制台中的响应代码每次都是 206。服务器不再受到影响。
在生产服务器上,每次视频循环播放时,服务器都会受到攻击。响应代码为 304(未修改)。如果我关闭笔记本电脑上的无线网络,当视频完成当前播放时,它会停止,因为它无法再次下载以进行重复播放。
为什么同样的配置
location ~* \.(mp4|ogg|webm)$ {
expires 10d;
add_header Cache-Control "max-age=864000";
}
在这些配置类似的服务器上,生产服务器的工作方式有何不同?我想让生产服务器像暂存服务器一样工作。我应该怎么做?
谢谢
答案1
您应该查看客户端浏览器收到的标头,因为缓存是在客户端浏览器而不是服务器上完成的。Nginx 可以添加自己的标头,这可能会与您的标头冲突,具体取决于您的服务器设置和添加的 Nginx 模块。
为了进一步分析,请在两种情况下添加客户端浏览器收到的标头转储,即在两种情况下,即在两种情况下,都有效。这种比较可能会给我们提供谜团的答案。
有关原因的更多想法请参阅此帖子:
Nginx add_header 和缓存控制。建议使用
模块more_set_headers
和more_clear_headers
来替换或清除标题。