2022年3月

公司UAT服务器故障,备份文件后重装了系统。将nginx配置还原并启动Gogs后,尝试拉取一个文件数多容量大的仓库时,终端报错:

error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

在国内外网站查了很久资料,基本都提示是网络问题,有建议在Git配置项中关闭压缩、增加上传缓冲区的:

git config --global http.postBuffer 524288000
git config --global core.compression 0

或是建议只拉取最近的提交的:

git clone --depth 1 <repo_URI>

成功后再补充后续数据:

git fetch --unshallow 

还有建议增加弱网优化配置或换网络的。

git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

很遗憾,这些配置均无法解决问题。但既然提示了可能是网络有关的问题,则有必要基于网络通信的全流程查看一下问题。

首先贯彻分治法的原则,先测试问题出在哪个环节。直接使用Gogs本地地址在服务器上进行仓库克隆。

git clone http://127.0.0.1:3000/xxx/xxx.git

克隆成功完成,因此即可断定,问题一定出在nginx端。在查看了nginx的error.log之后,一段很明显的错误信息指示了问题最终的原因:

2022/03/24 09:00:55 [crit] 129923#0: *12212 open() "/usr/xxx/nginx/proxy_temp/1/01/0000000011" failed (13: Permission denied) while reading upstream, client: 10.130.0.19, server: xxx.cn, request: "POST /git/xxx/xxx.git/git-upload-pack HTTP/1.1", upstream: "http://127.0.0.1:3000/xxx/xxx.git/git-upload-pack", host: "xxx.cn"

因此,问题的根源是nginx在大请求中为了保证通信效率,使用了缓冲区进行数据收发,但在使用缓冲区目录中的文件进行操作写入时,因为无权限进而导致网络请求失败。查看进程信息之后也印证了这个结果:

nobody    33361  69816  0 09:13 ?        00:00:08 nginx: worker process
root      69816      1  0 3月23 ?       00:00:00 nginx: master process sbin/nginx
root     123433  96635  0 10:56 pts/0    00:00:00 grep --color=auto nginx

后经询问,是负责处理服务器恢复的同事漏掉了配置文件的第一行:

user root;

将该配置补上并更新nginx配置再次测试,问题解决。

综上所述,别人的解决方案不一定适合自己,还需要基于自身经验从头开始全面详细的排查问题,才能找到最终的原因。

phpvirtualbox是一个使用PHP写成的可以在Web端远程管理VirtualBox虚拟机的服务。它与VirtualBox之间是通过vboxwebsrv这个进程对外提供的SOAP服务进行通信,从而做到对虚拟机的信息获取与操控的效果的。

显然,远程服务器上安装好的VirtualBox绝大多数情况都是运行在无头模式(headless)下,没有图形化界面,这给虚拟机的系统安装造成了很大不便。那么如何远程连接虚拟机的图形化界面以安装操作系统呢?

我们知道,VirtualBox提供了VRDP功能,可以通过phpvirtualbox的Settings界面对虚拟机的VRDP进行设置,打开该功能,并设置服务端口。如下图。

iShot2022-03-03 13.50.12.png

但可能是因为phpvirtualbox本身的配置没有增加监听地址这一选项,打开VRDP之后,虚拟机监听的VRDP端口是在本地环回地址(127.0.0.1或localhost)上的,导致通过远程方式连接VRDP无效。如下图。

iShot2022-03-03 14.18.24.png

解决这一问题的办法是,进入VirtualBox所在服务器,使用vboxmanage命令手工设置虚拟机的vrdeaddress属性即可。具体命令如下:

#查看虚拟机列表。
[vbox@localhost ~]$ vboxmanage list vms
"test" {befd693e-02c0-4312-b267-b357e5f38f6d}

#修改vrdeaddress属性,指定为空则允许所有地址访问。
[vbox@localhost ~]$ vboxmanage modifyvm befd693e-02c0-4312-b267-b357e5f38f6d --vrdeaddress ""

上述操作要在虚拟机关机情况下进行,否则无法修改成功。命令执行结束后可以在phpvirtualbox界面看到VRDP监听的地址已经发生变化,不再是本地环回地址了。如下图。

iShot2022-03-03 14.19.45.png

此时,通过mstsc也可以连接到虚拟机显示器,可以正常安装系统。如下图。

iShot2022-03-03 14.01.41.png