VestaCP面板载入响应缓慢问题解决

02/03/2018

今天小伙伴向Kaijia反映万年没有动的VestaCP面板突然间响应缓慢,Kaijia登录检查发现每次点击VestaCP面板中任意功能,均需要等待3~5秒时间才能响应,而同时间服务器并无高负载、高IO情况,VestaCP管理下的网页亦可飞速打开。

为了找到延时原因,Kaijia在/usr/local/vesta/php/etc/php-fpm.conf开启了VestaCP的慢执行日志(slow log),获得以下记录:

[03-Feb-2018 23:00:54]  [pool www] pid 2721
script_filename = /usr/local/vesta/web//list/web/index.php
[0x00007f8ead529798] exec() /usr/local/vesta/web/list/web/index.php:9

[03-Feb-2018 23:01:03]  [pool www] pid 2721
script_filename = /usr/local/vesta/web//list/web/index.php
[0x00007f8ead529708] shell_exec() /usr/local/vesta/web/list/web/index.php:12

再返回查看代码,显示所有的慢执行均发生在exec()shell_exec()函数调用VestaCP CLI管理脚本时。

调用问题代码简化为 shell_exec(VESTA_CMD."v-list-web-domains $user json");,其中 define('VESTA_CMD', '/usr/bin/sudo /usr/local/vesta/bin/');。即VestaCP通过PHP运行了 /usr/bin/sudo /usr/local/vesta/bin/v-list-web-domains,而造成响应缓慢的问题便出在此处。

VestaCP面板的网页进程以admin用户运行,然而要执行VestaCP CLI命令管理系统必须拥有root,因此每当调用CLI时,必会像上例中所示,使用sudo提升权限。然而sudo设计支持利用主机名(hostname)指定权限(详见/etc/sudoers),因此每次运行sudo实际上产生了一次DNS查询。通常情况下,主机名会存在于/etc/hosts中,因此并不会产生延误,但是当/etc/hosts无主机名记录时,查询便会转发给DNS服务器,从而使sudo命令产生延迟。

以前Kaijia并没有在意到这一点,直到今天DNS系统抽风每次查询均要3~5秒时间响应,因此对exec()执行的sudo产生了可感觉的延误,在界面上反映成响应缓慢。因此解决方法非常简单——将VestaCP使用的域名添加到/etc/hosts即可。