我在 生产环境 中有几个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中的行为:
- 在Server1上创建NFS挂载(我的/ etc / exports的内容)
/srv/test_share server2(rw)
- 在Server2上挂载NFS共享(我的/ etc / fstab的内容)
server1:/srv/test_share /mnt/test_share nfs defaults 0 0
-
在Apache中设置虚拟主机,其中包含一个简单的HTML文件,引用存储在NFS sharen上的图像文件
-
加载网站,html和图像文件全部返回200
-
卸载NFS共享,加载页面返回引用图像的404s
-
重新安装NFS共享
-
通过在Server1上关闭NFS来模拟NFS崩溃 - 重新加载站点会挂起检索引用的文件 .
到目前为止,互联网搜索还没有成为一个好的解决方案基本上,期望的行为是Web服务器返回404并且在NFS挂载恢复之前不会挂起 .
干杯,
本
2 回答
几种选择:
正确获取您的nfs挂载选项,您需要进行软挂载,以便可以中断nfs访问 . 试试
soft,intr,timeo=10
而不是default
将您的文档根与rsync等其他内容同步,或者从SCM中自行编写半自动结帐/导出脚本(如果您使用的话) . 无论如何,建议使用SCM,例如,您可以恢复到上一个工作版本
使用真正的分布式文件系统(最好是容错像coda),甚至是像drdb这样的分布式块设备系统
选项2和3为您提供断开连接的操作,因此比nfs更强大 . drdb是性感的,但我的建议是选择2与sitwething像git或svn,简单而强大
我不会直接从NFS挂载服务,而是从本地文件系统 .
每隔几分钟设置一个将NFS挂载同步到本地文件系统的cron作业就不会太难了 . Apache将从那里提供其内容,而不依赖于NFS安装 . 如果挂载发生故障,Apache仍然可以提供资产,尽管它们可能已经过时,直到NFS挂载恢复 .