nginx+php-fpm配置
由于nginx内建没有cgi支持,一直以来这个服务器都是用nginx+spawn-fcgi+backend server的方式跑php。但是这样做的效果不算太好,虽然backend在一定程度上减小了fcgi崩溃的机会,但是spawn-fcgi的内存泄漏问题一直没解决,效率也不算太高。
最近不小心手滑把vps给清空了,幸好手里有备份,在重建服务器的时候就考虑换用php-fpm的方式跑php了。php-fpm是以php的补丁的形式发布的,功能上与spawn-fcgi相近,由于是与php一起编译,在执行效率上比spawn-fcgi稍微要高,并且对于内存泄漏的问题控制的要好得多。
php-fpm在PHP 5.3.3版中会被整合到core trunk里面,不过现在的stable release 5.3.2还是不包含的,所以必须使用svn给源码打补丁再编译。
php今天更新了……5.3.3已经整合了php-fpm,不过是experimental的。
以下操作在CentOS 5.5上进行。
首先从php官网拖5.3.2的源码包下来解压,进入解压后目录准备编译环境:
export PHP_AUTOCONF=/usr/bin/autoconf-2.13
export PHP_AUTOHEADER=/usr/bin/autoheader-2.13
autoconf必须是2.13的版本,高版本会出问题。
然后执行
buildconf -force
./configure --enable-fpm ....
make && make install
在–enable-fpm后面接其他的编译参数。
有一点比较奇怪的是我装了libiconv,但是在编译时还是会出现iconv reference failed
的消息。用ldconfig也没用。修复方法是在configure之后打开Makefile,在EXTRA_LIBS
的一行最后加上-liconv就好了。
编译完成之后打开/usr/local/etc/php-fpm.conf,修改相关参数。
由于我的vps内存小,所以没用dynamic产生子进程的方式,而是用static.max_children
设成1,这样同时只有2个php的进程运行,对于访问量小的blog基本够用。
安全起见,listen.allowed_clients
设成127.0.0.1。
然后给php-fpm写个启动脚本放到/etc/init.d,这个我偷懒直接把nginx的拿来改了用。
#!/bin/bash
# php-fpm Startup script for php-fpm, a FastCGI implementation
# this script was created by tony at 2010.07.21, based on jackbillow's nginx script.
# it is v.0.0.1 version.
# if you find any errors on this scripts,please contact tony.
# by sending mail to tonytzhou at gmail dot com.
#
# chkconfig: - 85 15
# description: php-fpm is an alternative FastCGI implementation, with some additional features useful for sites of any size, especially busier sites.
#
# processname: phpfpm
# pidfile: /usr/local/var/run/phpfpm.pid
# config: /usr/local/etc/phpfpm.conf
phpfpm=/usr/local/sbin/php-fpm
config=/usr/local/lib/php/php.ini
pid=/usr/local/var/run/php-fpm.pid
RETVAL=0
prog="phpfpm"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[${NETWORKING} = "no"] && exit 0
[-x $phpfpm] || exit 0
# Start phpfpm daemons functions.
start() {
if [-e $pid];then
echo "phpfpm is already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $phpfpm -c ${config}
RETVAL=$?
echo
[$RETVAL = 0] && touch /var/lock/subsys/phpfpm
return $RETVAL
}
# Stop phpfpm daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $phpfpm
RETVAL=$?
echo
[$RETVAL = 0] && rm -f /var/lock/subsys/phpfpm /var/run/phpfpm.pid
}
# reload phpfpm service functions.
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${pid}`
killproc $phpfpm -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
\*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
chmod 755 /etc/init.d/php-fpm
,然后chkconfig php-fpm on
使服务生效。
测试来看php-fpm对于内存控制确实强很多,用spawn-fcgi时内存使用一直在25M左右,php-fpm大概在15-20M之间,并且spawn-fcgi内存使用几乎是只增不减,这点比php-fpm差很多。稳定性来说以前用backend的方式spawn-fcgi还算将就,现在还没感觉出来有什么区别。php-fpm也可以用backend,不过需要在php-fpm.conf里面另外加一个pool,因为一个pool只能监听一个端口。
本文参考了以下资料: