前几天刚解决了阿里云服务器因为Bash漏洞被人恶意攻击,导致服务器CPU占用率已经居高不下问题。修复后稳定运行了几天,今天早上居然又挂了。显示数据库连接失败。太郁闷了,难道又让人给黑了?
没办法,只能好好分析分析问题了,毕竟人生就是一个不断发现问题,解决问题的过程。
第一步,我们先来看看阿里云的云盾攻击日志。
看了一下没发现什么问题,一切都很正常。说明不是因为Web攻击导致的数据库异常。
第二部,看一下数据库的日志。
vi /var/log/mysql.err
vi /var/log/mysql.log
日志都是空的,也没看出啥问题来。
第三部,看一下系统日志。
vi /var/log/syslog
里面日志很多,搜一下mysql,发现问题了。
syslog日志
问题就出现在这个里面,根据描述应该是系统内存用光了,然后mysql进程被kill掉了。
想想很可能就是这个原因,因为这个服务器是2013年的时候买了,当初只买了512M的内存,也确实太少了一点。
那就花点钱,升级一下配置吧。
那么问题来了,能不能不多花钱也解决这个问题呢?那当然得试试了。那能从哪些地方来控制系统的内存使用呢?
要么是apache,要么是PHP,要么是mysql,那都优化一下吧。
对于PHP鉴于博客和其他系统都是用的开源的程序,不太好改动,如果限制PHP的内存大小,可能是引起程序的报错,也不太好优化。
对于apache呢,可以通过apache的配置文件来优化一下。
减少 php-fpm 的资源占用,可根据自身情况进行修改
pm = dynamic
如何控制子进程,选项有static和dynamic。
如果选择static,则由pm.max_children指定固定的子进程数。
如果选择dynamic,则由下开参数决定:
pm.max_children ,子进程最大数
pm.start_servers ,启动时的进程数
pm.min_spare_servers ,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers ,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
对于专用服务器,pm可以设置为static。
如果服务器是使用的nginx的话,也可以进行一些配置上的优化:
一个CPU进程,256个线程即可。
worker_processes 1;
worker_connections 256;
那接下来优化一下mysql吧,既然系统内存使用溢出,apache没有挂,mysql挂了,那说明MySQL有更大的优化空间。
1、降低数据库 InnoDB 引擎的缓冲区大小
在 /etc/my.cnf 的 mysqld 下添加下面一句:
innodb_buffer_pool_size = 64M
说明:WordPress 默认使用 InnoDB 数据库引擎;innodb_buffer_pool_size 设置的是缓冲区的大小,默认值为 128M。
鉴于个人博客访问量不会太大,因此适当降低缓冲区的大小以减轻内存压力。
2、最后重启 MySQL 使操作生效
补充说明一下:如果不需要 MySQL 的 InnoDB 引擎可以将其关闭。
default-storage-engine = MYISAM #默认数据库引擎改为MYISAM
loose-skip-innodb #关闭Innodb支持
从各个方面优化一下,感觉还不错哦。持续运行一段时间观察一下,看看还有没有问题,同时也给大家分享一下这次的优化经历。