符号链接文档时,NFS分区上的Apache 404错误

时间:2012-04-26 09:34:15

标签: apache2 symlink nfs performance

我有apache virtualhost:

<VirtualHost IP_WAN:80>
  ServerName test.localnet
  DocumentRoot /srv/http/localnet/test/trunk/docroot
  <Directory /srv/http/localnet/test/trunk/docroot>
    Options Indexes
  </Directory>
</VirtualHost>

partition / srv是NFS3挂载的文件系统:

172.16.0.2:/srv /srv nfs    nodev 0 0

在服务器端,它通过以下方式导出:

/srv    172.16.0.0/255.255.255.240(rw,sync,no_subtree_check,no_root_squash)

目录/ srv / http / localnet / test / trunk是/ srv / http / localnet / test / exports / trunk-v2的绝对符号链接

在/ srv / http / localnet / test / exports中我导出了SVN树(trunk-v1,trunk-v2,trunk-v3)

当我向apache询问http://test.localnet时,它提供200 OK并且索引来自/ srv / http / localnet / test / exports / trunk-v2 / docroot

BUT:

如果我删除symlink / srv / http / localnet / test / trunk并为另一个版本创建一个新的(ln -s / srv / http / localnet / test / exports / trunk-v3 / srv / http / localnet / test / trunk),apache给了我404 Not Found。它需要大约几秒钟/分钟,然后一切都恢复正常。

如果我在这种情况下执行ls -la / srv / http / localnet / test / trunk /,它会立即恢复正常。我认为NFS缓存存在一些问题,但我无法找到问题的确切位置以及如何防止它。符号链接占用与前一个相同的inode,两个目标(旧的和新的)都存在。

在服务器端,我以这种方式安装了/ srv分区:

/dev/xvda7 on /srv type xfs (rw,nosuid,nodev)

我也使用这个参数:

echo 262144 >/proc/sys/net/core/rmem_max
echo 262144 >/proc/sys/net/core/rmem_default
echo 262144 >/proc/sys/net/core/wmem_max
echo 262144 >/proc/sys/net/core/wmem_default
echo noop >/sys/block/xvda7/queue/scheduler
echo 0 >/sys/block/xvda7/queue/read_ahead_kb

我也试图将网络接口的MTU调整到9000,但没有成功。

有谁知道,问题是什么?为什么apache在“手动”刷新目录结构(ls)之前找不到符号链接?非常感谢

Ondra

1 个答案:

答案 0 :(得分:0)

解决方案似乎是: http://publib.boulder.ibm.com/httpserv/manual70/mod/core.html#enablemmap

“使用NFS挂载的DocumentRoot,如果文件被删除或截断,httpd可能会因为内存映射而被删除或截断,因此httpd可能会崩溃”

这正是在删除页面路径中的符号链接时的情况。 希望它能帮助别人: - )