我的博客是用wordpress搭建的,服务器使用的是nginx。
使用wordpress就务必要是用PHP语言,而nginx自己是无法处理PHP请求的,因此解决方案是使用PHP-FPM来搭建一个过渡的桥梁。
我遇到的问题是:wordpress的页面打开的速度越来越慢,而与此同时,我的一些静态页面打开仍然相应非常迅速。
我的关注一下子集中在内存上。由于我的云主机只有1G CPU和1G内存,所以我对内存和CPU的使用率非常敏感。
top查看了一下,发现除了Aliyun自己的一些进程外,php-fpm吃内存吃得特别凶。每个php-fpm要吃掉350+M的虚存,而且php-fpm的数量有14个之多。
系统可用内存只剩50+M……
很奇怪,为什么会有这么多php-fpm?另一个问题是,我的博客站点需要这么多php-fpm进程来响应吗?
要回答这些问题,首先要明确php-fpm究竟干什么用的。
php-fpm (FastCGI Process Manager) ,从字面上理解就是管理PHP FastCGI的。
那什么是FastCGI呢?FastCGI是提高CGI程序性能的。一般情况下,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
那继续问,什么是CGI呢?CGI就好像是解析器,比如PHP的CGI就是解析*.php文件的。
这样基本可以理解了。启动了那么多php-fpm,其实就是预先启动好很多个worker,然后等着外边连接。那么问题又来了,我需要十几个worker等着外面来连接吗?
(更多解释请参照这篇文章《FastCgi与PHP-fpm之间是个什么样的关系》)
我查了最近一段时间的访问数据,每天的访问量在两位数(甚至更低),所以根本不用担心并发之类的问题。那么启用十几个worker是根本没有必要的。于是下一个任务就是优化php-fpm。
一开始我以为这个优化需要在nginx里做,可是转念一想,不对啊,php-fpm应该有自己的配置文件啊。果然,/etc/php-fpm.d/www.conf
对于修改参数,我参照了一片文章:《Nginx and PHP-FPM Configuration and Optimizing Tips and Tricks》
重点参数如下:
pm.max_children = 5
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 200
最后执行重启php-fpm生效:/etc/rc.d/init.d/php-fpm restart
修改过后,php-fpm的进程只剩下5个,一下子多释放出200+M的内存。
测试访问和撰写文章,之前的卡顿也消失了。
两天前,我一直认为是否应该给云主机多加1G内存。我很高兴我多想了一步,不但是省下一笔费用,更是因为我找到了问题根源而不是望梅解渴。
