2

我在生产中有几个 Web 应用程序,它们利用 NFS 挂载在 Web 头之间共享资源(通常是静态资产文件)。如果 NFS 挂载不可用,Apache 将挂起无法访问的请求文件,内核将记录:

Nov 2 14:21:20 server2 kernel: nfs: server server1 not responding, still trying

我重现了运行 NFS v3 和 Apache 2.2.3 的 RHEL5 中的行为:

  1. 在 Server1 上创建 NFS 挂载(我的 /etc/exports 的内容)

    /srv/test_share server2(rw)

  2. 在 Server2 上挂载 NFS 共享(我的 /etc/fstab 的内容)

    server1:/srv/test_share /mnt/test_share nfs defaults 0 0

  3. 在 Apache 中设置一个虚拟主机,其中包含一个简单的 HTML 文件,该文件引用存储在 NFS 共享上的图像文件

  4. 加载网站,html和图片文件都返回200

  5. 卸载 NFS 共享,加载页面为引用的图像返回 404

  6. 重新挂载 NFS 共享

  7. 通过在 Server1 上关闭 NFS 来模拟 NFS 崩溃 - 重新加载站点会挂起检索引用的文件。

到目前为止,互联网搜索还没有找到一个好的解决方案。基本上,所需的行为是 Web 服务器返回 404,并且在 NFS 挂载恢复之前不会挂起。

干杯,

4

2 回答 2

2

几个选项:

  • get your nfs mount options right, you need to do a soft mount so nfs access can be interupted. try soft,intr,timeo=10 instead of default
  • sync your document roots with something else like rsync, or script yourself a semi-atomatic checkout/export from your SCM, if you use one. SCM use is recommended anyway, gives you the possibility to revert to the last working version, for instance
  • use a real distributed filesystem (preferably fault tolerant like coda) or even a distributed block device system like drdb

option 2 and 3 give you disconnected operation and are therefore much more robust than nfs. drdb is sexy, but my advice would be option 2 with somwething like git or svn, simple and robust

于 2009-11-02T23:10:02.327 回答
0

我不会直接从 NFS 挂载提供服务,而是从您的本地文件系统提供服务。

设置一个每隔几分钟将 NFS 挂载同步到本地文件系统的 cron 作业并不难。Apache 将从那里提供其内容,而不依赖于 NFS 挂载。如果挂载失败,Apache 仍然能够为资产提供服务,尽管在 NFS 挂载恢复之前它们可能已经过时。

于 2009-11-02T22:31:55.370 回答