最近一直在捣鼓Nginx,在接手一台新的服务器时,我萌生了向Nginx移植的想法,并且很快开始实施了。中间遇到了若干问题,特记录,以备以后查找。
首先搭建了一台Centos 5的虚机练手,当然,Nginx的安装简单的很,即便是编译安装,也就是眨眼间的事,关键是php的安装。在网上看到很多人选择用lighttpd中附带的spawn-fcgi来启动php-cgi,不过再三权衡,还是选择了php-fpm,它相当于一个php的补丁插件,可以做到无缝连接,而且很有可能,以后会包含在php发行版中。php-fpm还有很多特性,这点在其官网上有介绍。
php-fpm的安装有两种方式,一种是以补丁方式嵌入到php中,整合后编译安装,适合于php的全新安装;如果php已经安装好了,又不想再重新编译,则可以选择第2种,独立安装php-fpm。
这里说说第一种方式,帮助文档中很详细:
export PHP_VER=5.2.10
wget "http://launchpad.net/php-fpm/master/0.6/+download/php-fpm-0.6-$PHP_VER.tar.gz"
tar -zxvf "php-fpm-0.6-$PHP_VER.tar.gz"
"php-fpm-0.6-$PHP_VER/generate-fpm-patch"
上面一条命令就是生成补丁文件,然后下载php文件,解压。
wget "http://us.php.net/get/php-$PHP_VER.tar.gz/from/us.php.net/mirror"
tar xvfz "php-$PHP_VER.tar.gz"
cd "php-$PHP_VER"
打补丁,然后编译:
patch -p1 < ../fpm.patch
./buildconf --force
mkdir fpm-build && cd fpm-build
../configure --with-fpm --with-libevent="$LIBEVENT_SEARCH_PATH" && make
实际安装中,我选择的是php 5.2.11版本,服务器的系统为centos 4.x,运行buildconf命令更新配置文件时,提示autoconf的版本太高。Google的结果是php的开发者偏好autoconf 2.13这一颇古老版本,于是降级autoconf,执行成功。
执行configure时,还要根据选择,把常用的库带上,比如gd,curl,sockets,mysql,zip,mbstring等等。当然,前提是相关软件比如gd,libpng,jpeg,zip,zlib,mhash,mysql等等都已装好,以下是我的:
../configure --with-fpm --prefix=/usr/local/php --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/lib --with-freetype-dir --with-gd=/usr/local/gd2 --enable-gd-native-ttf --with-mysql --enable-sockets --enable-force-cgi-redirect --enable-mbstring --enable-ftp --with-mcrypt --with-mhash --with-curl --with-openssl --with-curlwrappers --enable-soap --enable-inline-optimization --with-zip --with-zlib-dir CFLAGS=-liconv
第一次安装时,没有带上gd库,后来想通过模块方式单独编译gd库,结果倒是可以用,但死活不支持jpg,直接编译,却成功了,个中原因,尚待分析。
强烈建议在编译时加上--prefix选项,这样方便以后卸载、升级。另CFLAGS=-liconv,是为了防止出现liconv致之类的错误, php官网上很多人指出这个长久以来的bug,但一直没有修复,总之不加就是编译不过去。
最后就是 make && make install了,编译结束后给出了一串提示。php相关文件都被装到/usr/local/php下了,同时,还自动生成了php-fpm的启动脚本,/etc/init.d/php-fpm,用法:
service php-fpm start|stop|restart ....
再配合nginx,就完工了。