我正在考虑将我的静态文件移动到多个原始服务器,但是我注意到 NGINX 为不同服务器上部署相同的文件计算不同的 Etag,这会导致下游缓存层认为文件不断变化,但实际上并没有。
我希望的是让 Etag 依赖于所提供文件本身,例如使用内容的 MD5 或其他哈希值(并且自然而然地让 NGINX 本地缓存它以提高性能)。
使用提供的静态文件服务可以实现这一点吗,还是需要我用另一种方式来解决这个问题?例如,编写我自己的“文件服务器”应用程序/脚本来计算和缓存哈希值,或者确保所有文件系统元数据(无论它使用什么)总是以某种方式相同?
可以选择使用 Apache 或者类似的软件。
答案1
如所述nginx etag 生成背后的算法,nginx使用文件的最后修改时间和内容长度来生成静态文件etag。
因此,如果您在不同的后端服务器上为相同的静态文件获取不同的 etag,则文件的时间戳可能不完全匹配(例如,因为您在不同时间使用 git 检出它们)。
我没有看到任何 nginx 设置来配置 nginx 如何计算 etag,因此您使用 nginx 的唯一机会是确保文件时间戳完全相同,例如通过使用 rsync 或在签出文件后手动设置时间戳(有关将时间戳设置为文件提交的最后时间戳的脚本,请参阅https://stackoverflow.com/questions/1964470/whats-the-equivalent-of-use-commit-times-for-git/13284229#13284229)