我使用 Django 作为 Web 框架,然后分别使用 Apache 和 Lighttpd 作为 Web 服务器和静态媒体服务器。Lighty 很好地服务于我所有的静态内容,但我需要对其进行配置以服务于用户上传的新文件。Lighttpd 运行在与 Apache(Django) 不同的机器上。我创建目录然后创建图像文件的 django 代码在我的 Apache 机器上执行,使其当前保存在同一台机器本身中。我希望这个目录和文件创建发生在我的静态媒体服务器上,然后应该由媒体服务器本身提供服务。我分别使用 os.mkdir 和 urllib.urlretrieve 函数在 Django(Apache)机器上创建目录和保存文件。
2 回答
最简单的答案是用户上传到两个 Web 服务器都可以访问的共享目录。然后它立即可用。如果您使用的是 unix(听起来很像),那么 NFS 是一个可能的解决方案。如果您认为您的站点将像 flickr 一样扩展到多个服务器,那么使用 rsync 推送到多个边缘服务器,甚至可能实施分片方案是另一种解决方案。
小心点。根据您的应用程序,您必须考虑许多安全问题。
如果所有文件都进入可公开访问的目录,则用户可能会猜测其他人文件的名称并下载它们。在这种情况下,您将希望从 Django 为它们提供服务,并在顶部提供一层薄薄的安全性。
永远不要相信你的用户!验证他们上传的内容是否在某个允许的范围内。在任何情况下,您都不应允许他们上传他们想要的任何内容。当然,除非您的用户是值得信赖的少数人。即使那样你也应该做一些检查。他们可能不应该为一个上传 .php 文件。您想要给他们的最后一件事是能够在您的服务器上运行任意脚本。至少将目录配置为仅提供文件而不执行任何操作。
祝你好运
这就是我使用 rsync 的那种东西。在主服务器上做任何你喜欢的事情,然后定期(或按需)rsync 推送到静态服务器。Rsync 比你可以通过快速 hack 生成的任何东西都更快(并且功能更丰富)。
正因为我偏执,所以我每小时将我所有的客户站点同步到 2 台备份服务器,其中一台在我的车库里。我刚刚对一个 1.7GB 的客户站点(没有任何更改)计时了一个“rsync -a”,它花费了 9.92 秒的挂钟时间,包括用于 rsync 3 个不同目录的 3 次网络握手。有任何改变,presto-bango,它已经完成,带有时间戳,所有者/组等。
当您开始真正的、多机、无人参与的备份工作时,您对服务器故障会变得多么无所谓,这真是令人惊讶。我睡得很好。