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只能监听一个端口。

本文参考了以下资料:

https://bugs.launchpad.net/php-fpm/+bug/527911

标签: ,

更新时间: