我为我的一位客户构建了一个在虚拟服务器上运行的 Web 应用程序。它包括供他们上传文件的工具,但他们现在想将这些文件存储在他们办公室的服务器上。
最简单的方法是通过互联网将他们的文件系统直接挂载到虚拟服务器上。我有通过内部网络安装 NFS 的经验,但我不清楚它是否适用于这种情况。
有什么想法吗?我总是可以编写新软件来传输文件,但这很容易解决!
注:办公室的服务器是运行在windows hyper-v环境下的虚拟服务器上的Ubuntu 12服务器。带有网络应用程序的 VPS 是 Ubuntu 11.04
还没有人提到sshfs。如果您使用的是现代 linux 发行版并且可以通过 ssh 访问远程主机,那么它很简单:
性能是完全可以接受的(但如果您需要整个目录,则不如 rsync 等流式同步快)。
NFS 本质上是不安全的。通过互联网连接将是一个非常糟糕的选择。
我喜欢提到 rsync 的帖子。我希望您可以简单地从处理文件上传的代码运行 rsync 作业,而不是使用 cron 来触发传输。
上传完成后,将文件 rsync 到他们的服务器,完成。
我希望您需要与他们的服务器建立安全连接以进行传输。
如果你愿意,你可以将传入的文件放入一个列表中进行传输,在成功复制后删除名称,并为自己提供一些故障转移功能,以防连接出现问题。
正如其他人已经指出的那样,rsync 旨在处理文件组或层次结构(感谢拼写检查),因此这并不难实现。
NFS 可能天生不安全,但这不是服务的错。Telnet 和 FTP 本质上也是不安全的,但它们都已在开放的 Internet 上使用了几十年。如果建立了加密的 VPN 隧道,那么缺少 NFS 加密是无关紧要的。
此外,如果将防火墙配置为仅允许特定的远程主机地址连接到 NFS 安装点,那么裸 NFS 连接基本上不会受到黑客攻击,除了嗅探互联网流量的三字母机构,它们可以访问强大的解密功能无论如何破解你的加密远程连接。
我看到某些版本的 NFS 默认使用 UDP,这很可能是 Internet 可靠性问题的来源。如果连接拥塞,UDP 数据包可能会丢失,并且不会自动尝试重新传输。如果您想要可靠的连接,请确保您的 NFS 在 Internet 上使用(或被迫仅使用)TCP 数据包。
NFS可以通过防火墙来完成。如果您进行搜索,您会发现其他人已经尝试并成功完成了此过程,但是,它不像打开端口那样简单,而且似乎取决于正在运行的 NFS 版本。
rsync是一个很好的建议,并且具有很大的灵活性。但是,这将是一个在您的应用程序之外运行的进程。rsync 可以处理本地文件更新的同步,并保持整个目录与其他文件夹同步。
ssh将是另一个安全选项,并且只需要打开一个端口。我过去曾在 Windows 和 Linux 系统之间使用过它,并且在应用程序内部和调度过程中都取得了很好的效果。
我相信还有其他方法可以完成您正在寻找的东西,但我们需要更多关于这些文件类型的信息,以及您是否将它们链接到页面或将它们与更复杂的内容一起流式传输。
NFS 挂载可以使用 automount 完成,它会在失败时继续尝试挂载,但我考虑在管道上使用它的唯一方法是使用 vpn 或其他一些安全连接(实际上,我不会考虑它,但是你听起来很坚定)。
即使使用 automount,如果出现网络问题,并且您将他们的上传放在 NFS 挂载上,上传也可能会失败或损坏,除非您将文件存储在本地,然后在上传成功时进行复制。