使用 vagrant + virturalbox + docker-ce 这套组合搭建的开发环境,但开发过程中会发现,过一段时间站点就无法访问。

怀疑过一切,包括是不是 IDE 读写代码到内存,导致共享文件夹不稳定。测试关闭 IDE,然后什么都不做,几分钟,十几分种这个问题就复现了。

前面都在确定问题,到了差不多一个月,终于确定了特征情况。站点无法访问只是表象,实际是虚拟机和容器对于站点目录 /var/lib/xxx 都无法访问,本地倒是正常。情况这么一串联,明眼人都能意识到是共享文件夹出问题了。

描述给 deepseek,好家伙,给了我好几个答案,惊喜~

使用 mount 和 umount 定时切换挂载状态 (推荐)

创建自动化脚本 /usr/local/bin/fix_nfs.sh

#!/bin/bash
UMOUNT_CMD="sudo umount -fl /var/lib/xx"
MOUNT_CMD="sudo mount -t nfs -o vers=3,rsize=65536,wsize=65536,hard,intr,timeo=300 192.168.33.1:/Users/jasonli/Code/xx /var/lib/xx"

$UMOUNT_CMD 2>/dev/null
sleep 1
$MOUNT_CMD

然后添加定时监控(每5分钟检查):

(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/fix_nfs.sh") | crontab -
测试有两个问题,一个是权限,当前的用户为 xx ,需要 sudo 提权;另一个是 5 分钟可能也太久了,换成 1 分钟可能差不多。

更换性能更好的驱动 Virtio-FS

config.vm.synced_folder "./xx", "/var/lib/xx", 
  type: "virtiofs",
  owner: "www-data",  # 指定虚拟机内所有者
  group: "www-data"   # 指定组

重载 Vagrantfile 结果报错,提示没有找到个驱动类型,需要安装

vagrant plugin install vagrant-virtiofs
测试安装最后,失败了,提示要重新安装 vagrant 等内容。并且 vagrant up 启动还报错,删都删不掉。但通过 virturalbox 无界面启动,绕过了这个问题。

优化 nfs 参数

config.vm.synced_folder "./xx", "/var/lib/xx",
  type: "nfs",
  nfs_udp: false,      # 强制TCP协议
  nfs_version: 3,      # 明确版本
  mount_options: [     # 关键参数优化
    "rw",
    "noatime",
    "nodiratime",
    "actimeo=2",       # 属性缓存2秒
    "rsize=32768",     # 降低读写块大小
    "wsize=32768",
    "hard",
    "intr",
    "timeo=50"         # 5秒超时(单位0.1秒)
  ]

总结

主要测试了一、二两种方法,如果是一开始的时候,我会毫不犹豫地选择干掉当前的环境,重新安装。但现在已经装好的了的开发环境舍弃掉,有点不舍得。

第一种方式开着有点投机取巧,也不高端,也没有从根本上解决问题。但,它管用~