让我们假设我们有一个提供10个文件的静态文件服务器(Nginx + Linux)。几乎与服务器可以处理的文件一样频繁地读取文件。但是,某些文件需要替换为新版本,因此文件名和URL地址保持不变。如何安全地替换文件而不必担心某些读取失败或成为两个版本的混合?
我知道这是一个相当基本的操作系统问题,与重命名,符号链接和文件大小有关。但是,我没有找到明确的参考或讨论,我希望我们可以在这里建立一个。
答案 0 :(得分:1)
使用rsync
。通常我选择rsync -av src dst
,但选择YMMV。
对于rsync来说,最重要的是,除了在很少或没有改变时基本上没有成本时,它使用原子重命名。因此,在文件传输过程中,“。fooNNNNN”临时文件变得越来越大。完成后,rsync将关闭该文件并将其重命名为“foo”。因此,网络客户端可以看到所有旧文件或所有新文件。请注意,范围下载(例如从错误后重新启动)不是原子的,会使此类客户端暴露于丢失状态,尤其是在文件开头附近插入字节时。 SHA1不会验证这样的客户端,他将不得不从头开始重新下载。顺便说一句,如果这些是“大”文件,请告诉nginx使用零拷贝sendfile()
。