DocumentRoot可指向NFS挂载点,但须确保挂载就绪、权限一致、启动顺序可控;需配置\_netdev选项、systemd依赖、同步更新Directory块,并禁用AllowOverride与ETag以避免不一致。

DocumentRoot 可以直接指向 NFS 挂载点,但必须确保挂载就绪、权限一致、服务启动顺序可控——这不是简单改个路径就能跑通的事。
DocumentRoot 必须设为 NFS 挂载目录本身
例如,NFS 服务端共享了 /shares/webapp,客户端挂载到 /var/www/myapp,那么 Apache 配置中应写:
- DocumentRoot "/var/www/myapp"(不是 /shares/webapp,那是服务端路径)
- 对应
块需同步更新,不能沿用本地默认的 /var/www/html - 挂载点必须在 httpd 启动前就绪;否则 Apache 启动时读不到目录,会静默降级或报 403/500
挂载必须可靠且带 _netdev 选项
NFS 是网络存储,系统启动时网卡可能还没起来,Apache 就先抢着读挂载点,必然失败。解决方法:
- /etc/fstab 中挂载项必须含 _netdev 参数,例如:
server0:/shares/webapp /var/www/myapp nfs defaults,_netdev 0 0 - 添加 systemd 依赖:让 httpd 服务明确等待网络和挂载完成,可加如下单元文件覆盖:
After=network-online.target remote-fs.target - 验证挂载是否生效:mount | grep myapp 和 ls -l /var/www/myapp 看是否有内容且属主匹配
权限与用户上下文要对齐
Apache 进程(通常是 apache 或 www-data 用户)必须能读取 NFS 上的文件,且对动态内容(如 PHP 写日志、上传目录)有写权限:
- 服务端导出时建议加 no_root_squash(仅内网可信环境),或统一用普通 UID/GID(如都设为 48:48)
- 客户端挂载后执行:chown -R apache:apache /var/www/myapp(若 NFS 支持 chown)
- PHP 应用若需写入,确保 /var/www/myapp/storage 或 /var/www/myapp/public/uploads 目录在挂载后仍可写(NFS 的 root_squash 默认会把 root 写转成 nfsnobody,易导致权限拒绝)
避免常见陷阱:.htaccess、缓存与构建产物一致性
用 NFS 共享 DocumentRoot 时,以下三点极易出问题:
-
禁用 AllowOverride:NFS 上无法保证 .htaccess 原子写入,且多节点并发修改会导致不一致,
中必须设 AllowOverride None - 关闭 ETag:NFS 文件的 inode 在不同客户端可能不同,导致 ETag 不稳定,加配置 FileETag None 防止缓存错乱
- 构建产物需推送到 NFS 服务端:CI/CD 流水线不应往客户端部署,而应将 dist/public 目录同步到 NFS 服务端的共享源目录(如 rsync 到 /shares/webapp),所有 Web 节点挂载同一份,天然一致


















