全部博文(2065)
分类: 系统运维
2010-01-20 11:13:44
nginx+php+php-fpm安装配置文档
[整理人:hkebao#126.com
整理时间:
简介:
1、 目前各种服务器HTTP Server对PHP的支持共三种
A. 通过HTTPServer内置的模块来实现。例如Apache的mod_php5类似于apache里面的mod_perl可以对perl支持。
B. 通过CGI来实现,缺点就是性能差另外也不太安全所以很少用。
C. 最新的一种方法就是FastCGI。就是对CGI的一种改进。它一般采用C/S结构,一般脚本处理器会启动一个或多个daemon进程,每次HTTPServer遇到脚本的时候直接交给FastCGI的进程来执行。然后将结果返回给浏览器。
说明: 这种方法的问题存在一个小问题就是当遇到大流量的时候,脚本处理器的守护进程可能会超负荷从而变慢。甚至发生内存泄漏。
比起第一种方法来讲这种方法性能上要高很多。实现了服务器专心进行静态文件响应而将动态脚本丢给守护进程处理。
2、使用FastCGI方式实现有两种常见的stack: lighttpd+spawn-fcgi;另外一种是nginx+php-FPM(也可以是spawn-fcgi).
说明: 两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,因此安装了lighttpd一般就会使用spawn-fcgi对 php支持,但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP 脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。
另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三方的FastCGI 处理器(必须要手工安装第三方的处理器)才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在 nginx.conf中很容易设置)。
nginx可以使用spwan-fcgi(需要一同安装lighttpd(自带的就包含了这个插件),但是需要为nginx避开端口),但是 由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用nginx+spawn-fcgi组合了。
由于spawn-fcgi的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHP core中)的PHP的FastCGI处理器,叫做PHP-FPM。它和spawn-fcgi比较起来有如下优点:
由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php core中了,因此在性能方面要优秀一些;(这就是为什么要在安装的时候将patch一下了。将其打进来补丁中去)
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。
因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM 。
总结:
目前在HTTPServer这块基本可以看到有三种stack比较流行:
>Apache+mod_php5
>lighttp+spawn-fcgi
>nginx+PHP-FPM (目前主流的配置)
三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。
所以现在网络术语LEMP(Linux+EngineX(nginx)+MySQL+PHP,慢慢要代替经典很多年的LAMP 。
安装篇
下面整理一下有关LEMP安装步骤。其中的MYSQL安装略过.先安装PHP
#tar
jxvf php-
#wget
PS: 下载补丁包
#gzip
-cd php-
#cd
php-
#./configure –-prefix=/usr/local/php --enable-fpm
--with-config-file-path=/usr/local/php/etc/ --disable-all --with-mysqli=/data/mysql/bin/mysql_config
PS:
--enable-fpm 表示支持PHP-FPM选项
--with-mysqli=/data/mysql/bin/mysql_config 相当于编译php的MYSQL扩展到PHP内核中。这样就可以使用mysqli库访问MYSQL
另外要注意:这里面不能设置--with-apxs2=/usr/local/apache2/bin/apxs
如果设置了此选项编译安装之后Apache就无法启动了。这就是说如果打算用PHP-FPM的方式来支持FastCGI的话,基本上就不能和Apache一起使用了。如果打算跑LEMP的话就不能与Apache一块用。
如果非还想要使用,那可以另外编译安装一个PHP,编译的时候在./configure的时候设置--with-apxs2=/usr/local/apache2/bin/apxs,而且不要打PHP-FPM的补丁。
另外,如果该步骤出现错误,通常是缺乏依赖包,请按照错误信息安装依赖包即可。
#Make
all && make install
PS: 在此尽量用make all 而不要用make
#cp
php.ini-production /usr/local/lib/php.ini
#ln
-s /usr/local/lib/php.ini /etc/php/php.ini
#ln
-s /usr/local/etc/php-fpm.conf /etc/php/php-fpm.conf
#cd
/usr/local/php/bin
#php
–v
输出:
PH
Copyright
(c) 1997-2009 The PHP Group
Zend
Engine v
至此PHP的安装已经成功完成!
以下是其简单的配置
A、配置php.ini文件 需要依据具体的需求而定制
B、指定PHP文件存放的目录。
比如我们现在打算将其放置在:/var/www/html 目录下面
C、创建用户与用户组
groupadd
www -g 48
useradd
-u 48 -g www www
chmod
+w /var/www/html
chown
-R www:www /var/www/html/
创建了用户与用户组www 现在开始配置FPM配置文件
vi
/usr/local/php/etc/php-fpm.conf
该文件是一个xml文件,只需要修改:
Unix user of processes
Unix group of processes
注意去掉两边的注释,否则之后php-fpm启动不了;
D.
配置完之后,就可以启动PHP-FPM:
$/usr/local/php/sbin/php-fpm start
启来之后查看一下9000端口是否存活:
netstat
-tlnp|grep 9000|awk '{print $7}'|awk -F '/' '{print $1}'
至此PHP的安装与配置工作完成了。开始安装配置Nginx
第二步: 安装nginx
2.1
安装之前先作一些优化Ngnix
1、 减小nginx编译后的文件大小
默认的nginx编译选项里面居然是用debug模型(-g)的。Debug模式会插入很多的跟踪和ASSERT之类,编译以后一个nginx有好几M的。去掉nginx的debug模式编译,编译以后就会只有几百K。
在auto/cc/gcc
最后几行有:
#debug
CFLAGS=”$CFLAGS
-g”
….
注释掉这几行或删掉重新编译即可。
(完整的如下)
# debug
#CFLAGS="$CFLAGS
-g"
# DragonFly's gcc3 generates
DWARF
#CFLAGS="$CFLAGS -g
-gstabs"
#if [ ".$CPP" =
"." ]; then
#
CPP="$CC -E"
#fi
将其全部注释掉即可!
2、修改nginx的header伪装服务器
2.1 修改nginx.h (文件位置在:nginx-
默认为:
#define
NGINX_VERSION "
#define
NGINX_VER
"nginx/" NGINX_VERSION
#define
NGINX_VAR
"NGINX"
#define
NGX_OLDPID_EXT ".oldbin"
修改成
#define
NGINX_VERSION "
#define
NGINX_VER
"LTWS/" NGINX_VERSION
#define
NGINX_VAR
"NGINX"
#define
NGX_OLDPID_EXT ".oldbin"
2.2 修改nginx_http_header_filter_module
#vi
src/http/ngx_http_header_filter_module.c
将
static char
ngx_http_server_string[] = "Server: nginx" CRLF;
修改为:
static char
ngx_http_server_string[] = "Server: LTWS" CRLF;
a>
修改nginx_http_header_filter_module
#vi
src/http/ngx_http_special_response.c
将
static u_char
ngx_http_error_full_tail[] =
"
"
"
CRLF
"