最近有一个小伙伴找到搬主题,说自己的VPS主机文件出现了一些莫名其妙的问题,比如安装不了任何程序包,WordPress程序莫名其妙出错,PHP进程占CPU很高等等。搬主题经过仔细观察后发现是sessi…
最近有一个小伙伴找到IT168资讯,说自己的VPS主机文件出现了一些莫名其妙的问题,比如安装不了任何程序包,WordPress程序莫名其妙出错,PHP进程占CPU很高等等。IT168资讯经过仔细观察后发现是session会话的问题,捣鼓了后终于解决这个问题,顺便分享一下这个解决过程。
一、问题分析
IT168资讯登陆该主机后一看,安装程序包出错,WordPress经常登陆不上,用top
命令查看CPU情况,发现直接占用接近100%。于是IT168资讯第一感觉那就是被攻击了。查看目前的并发连接后,发现并没有多少连接,带宽也使用正常,那为什么会出现CPU接近100%的情况呢。将其网站的主题换成默认的,插件全部禁用后,问题依然没有解决。
观察了站点的进程占用几分钟后发现,因为其用的环境是OpenLiteSpeed的,其中lsphp虽然才几个进程,但是基本占用了90%以上的CPU资源。那说明问题出在了lsphp上面。
之前以为是没有开缓存,于是查看Memcached的运行情况,发现服务正常。最后想到会不会是空间不够了,于是用下面的命令查看
//查询目前的硬盘占用情况 df -h
基本没有占满的情况呢,硬盘的容量还有很大的剩余呢。再用另外一个命令查看
//显示inode信息 df -i
结果发现问题了,其中 /dev/vda1
竟然已经100%了。其实储存文件元信息的区域就叫做inode,目前为100%,那说明小文件太多,需要清理了。
然后IT168资讯就开始进行空间清理的过程
二、进行主机硬盘空间的清理
如果确定哪些文件占用目前的硬盘空间呢,这里我们可以先登陆SSH,先进入根文件夹。
cd /
然后输入如下命令
du -sh *
发现其中usr文件夹竟然占了恐怖的8G容量,于是进入usr文件夹,再次用 du -sh *
命令查看。里面除了swap交换文件,剩下的就是local文件夹了。
再次进入local文件夹,一个文件一个文件夹的去分析。最后发现里面的logs文件夹直接占了1G,这个文件夹主要是存放平时的错误日志、访问日志等等。接下来就是清空logs日志文件夹。
比如IT168资讯有开启防火墙,里面有auditmodsec.log的日志占得很大。在这里建议不要直接用rm删除,可以用如下命令
//当前目录下的auditmodsec.log文件清空 echo "">auditmodsec.log
然后再次用 du -sh *
命令查看文件大小,这些日志占用的空间已经回来了。
再次查看小文件的占用情况,发现 /dev/vda1
竟然还有90%,CPU还是居高不下。只能再次查找相应的文件夹的文件占用情况。找到了session文件夹。该文件夹的绝对位置为/var/lib/php/session/,重点是里面竟然有接近百万个session小文件,用ls命令都卡死半天无法列出来。
什么是session?
在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
简单来说,Session就是存储访问用户的信息的。目前存在硬盘上极度占用空间,需要先删除Session文件。
这里说到删除Session文件,可是有接近百万个,用传统的rm命令估计要删上几个小时了。这里IT168资讯就用了rsync命令进行删除。具体操作如下
1、先安装rsync:
yum install rsync
2、建立一个空的文件夹:
mkdir /tmp/blank
3、用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /tmp/blank/ /var/lib/php/session/
这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也很快。
选项说明:
–delete-before 接收者在传输之前进行删除操作
–progress 在传输时显示传输过程
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式 –stats 给出某些文件的传输状态
删除完这些session文件就花了2分钟左右就删除完了。删除完后,系统也恢复正常了,cpu也恢复正常负载。
本次问题的分析:应该是某个时间段主机被攻击,然后造成很多session访问存在硬盘上没有自动清除,每次PHP进行会话时要查找,导致默认的lsphp进程极度占用CPU资源。
这里IT168资讯觉得很奇怪,为什么PHP的session会话要保存在硬盘上呢,不是安装了缓存吗,应该存储在缓存内才对啊。
接下来就是将lsphp进程session会话存储在Memcached的过程。
三、在BT宝塔面板中设置
如果使用的是BT宝塔面板,这就很简单了,直接在后台的PHP的设置里面,选择session的会话储存位置为Memcached或者Redis里即可。
四、在OpenLiteSpeed环境中设置
对于使用OpenLiteSpeed环境的小伙伴,或者安装了CyberPanel面板的小伙伴,需要修改默认的php.ini文件。
比如你站点使用过的是PHP 7.4的,那么就要对应修改其PHP 7.4下的php.ini文件。
查找代码:
session.save_handler
如下,其是默认保存在file,也就是硬盘文件中
将其改为
session.save_handler = 'memcached'
然后查找
session.save_path
发现其中保存在/var/lib/php/session文件夹下。修改为
session.save_path = '127.0.0.1:11211'
然后保存,再重启PHP。
原理:PHP 默认的会话处理程序会拖慢大型应用,因为这个处理程序会把会话数据存储在硬盘中,需要创建不必要的磁盘 I/O,浪费时间。我们应该把会话数据保存在内存中,例如可以使用 Memcached 或 Redis。这么做还有个额外好处 —— 以后便于伸缩。如果会话数据存储在硬盘中,不便于增加额外的服务器,如果把会话数据存放在 Memcached 或 Redis 里,任何一台分布式 PHP-FPM 服务器都能访问会话数据。
修改后,站点以后的session会话数据都保存在Memcached里了。这样查找起来速度也加快了。实现了将lsphp进程session会话存储在Memcached中加快WordPress网站访问。
原文来自:IT168资讯
原创文章,作者:admin,如若转载,请注明出处:https://www.it168.online/webtech/4044/