因此这里也就意味着,我们编译PHP以PHP-FPM的方式来支持FastCGI的话,基本上就不能和Apache一起使用了,也就是说我们决定使用nginx+PHP+PHP-FPM的话,这里的PHP就没法和Apache一起使用了。
如果非还想要使用,那可以另外编译安装一个PHP,编译的时候在./configure的时候设置--with-apxs2=/usr/local/apache2/bin/apxs,而且不要打PHP-FPM的补丁。
另外,如果该步骤出现错误,通常是缺乏依赖包,请按照错误信息安装依赖包即可。 d. 编译:
$make all
注意这里尽量使用make all,而不要仅仅是make e. 安装:
$make install f. 拷贝php.ini文件:
$sudo cp php.ini-dist /usr/local/php/lib/php.ini
将php.ini文件拷贝到如上位置;
如果安装都成功的话,我们的以PHP-FPM方式支持FastCGI的PHP就被安装到了/usr/local/php目录下了。
3) 配置PHP和PHP-FPM:
首先可用到/usr/local/php/bin目录下执行一下php -v,看PHP是否work。 a. 配置php.ini:
位于/usr/local/php/lib下
这里一般没有严格需要配置什么,可以按照自己要求进行配置。 b. 配置PHP-FPM这个PHP解析器:
我们上面说过PHP-FPM解析器是C/S结构,它的配置文件位于/usr/local/php/etc/php-fpm.conf。
$cd /usr/local/php/etc
$sudo vi php-fpm.conf
该文件是一个xml文件,只需要修改:
Unix user of processes
www-data
Unix group of processes
www-data
注意去掉两边的注释,否则之后php-fpm启动不了; c. 配置完之后,就可以启动PHP-FPM:
$/usr/local/php/sbin/php-fpm start
我们上面介绍了FastCGI模式区别于CGI模式,它需要一个daemon进程一直运行在后台对php请求做出解析,这里的PHP-FPM就是这个daemon进程,在配置文件php-fpm.conf中可以设置它侦听的IP和端口,默认为127.0.0.1:9000。也就是它侦听9000端口的数据请求,然后会将其进行解析然后返回给请求端。
这个和我们之前介绍的FastCGI的思想相吻合。HTTPServer服务器和FastCGI模式的PHP解析器相分离(这里就是PHP-FPM),HTTPServer遇到PHP请求的时候,就会传递给PHP-FPM,后者解析并返回。实现HTTPServer和PHP解析器完全分离,缓解了Server的负担,Server有更多资源来处理并发请求。其实这也是nginx优于apache的一个原因。 d. 检查php-fpm是否运行正常:
$ps ax|grep fpm 4)安装和配置nginx:
之前文章我们介绍了nginx的安装和使用nginx作为reverser server的进行负载均衡配置了,感兴趣的可以参看。 a. nginx的安装很简单:
从官网下载安装包:nginx-0.7.61.tar.gz
$tar xzvf nginx-0.7.61.tar.gz
$cd nginx-0.7.61
$./configure
默认安装路径为/usr/local/nginx,如果不放心自己可以使用--prefix=/usr/local/nginx配置一下
$make
$sudo make install b. 思想:
我们之前的文章介绍了nginx的使用非常灵活,有人比喻其为server领域的瑞士军刀,其实确实是:性能好,而且使用方法多。
各种使用方法都是通过配置文件来实现,因此掌握nginx的使用,除了掌握各种架构的思想之外,还要掌握如何对nginx.conf进行相应的配置。
我们这里着重对nginx.conf配置,实现通过php-fpm的fastcgi对php的处理。其实nginx本身并不会对PHP进行解析,这个要区别于Apache(Apache通过内置模块实现了对PHP的解析),nginx其实是将对php页面的请求交给了后台在127.0.0.1:9000侦听的php-fpm,后者具有解析php的功能。 因此如果把php-fpm看做一个app server的话,其实nginx这里的作用还是一个反向代理服务器。和我们之前介绍的使用location配置将php请求proxypass给后台侦听的Apache服务器,在思想上几乎一样。
c. 配置位于/usr/local/nginx/conf目录下的nginx.conf和fastcgi.params >nginx.conf配置:
$cd /usr/local/nginx/conf
$sudo vi nginx.conf 从上往下对默认的配置文件进行修改:
1. user www-data; 这里需要和php-fpm中定义的用户一致;
2. worker_processes 2; 可以设置更多,这个选项和之后的worker_connections 1024;
一起来定义每个进程并发相应的最大连接数,因此这里可以达到2*1024的并发请求;
3. 在server {
listen 8080;
如果自己已经安装了Apache并且占用了80端口,这里修改为别的8080,负责启动不了;
4. 如上面所述,我们其实设置nginx将PHP请求转发给后台的php-fpm server即可,后者有解析php功能。
其实还是充当反向代理的作用;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME html/$fastcgi_script_name;
include fastcgi_params;
} 注意fastcgi_param SCRIPT_FILENAME html/$fastcgi_script_name;
之后需要设置为放置php脚本的位置,这里我们举例在/usr/local/nginx/html目录下创建一个phpinfo.php文件
包含代码
$sudo vi fastcgi.params
配置fastcgi参数文件,具体可以参考http://wiki.nginx.org/NginxFcgiExample
基本上可以使用默认的该文件,不需要修改。 5) 运行nginx:
$sudo /usr/local/nginx/sbin/nginx
然后在浏览器中查看http://localhost
> 默认会显示/usr/local/nginx/html目录下的index.html页面: Welcome to Nginx!
>然后查看http://localhost/phpinfo.php,相当于访问html目录下的phpinfo.php页面,
如果正常,会显示phpinfo的页面。其中可以看到Server API一项包含:CGI/FastCGI,表示FastCGI方式运行。
如果以上步骤出现错误,通常都是因为nginx.conf配置不正确,可以google寻找解决方法,一般都可以找得到(英文)。然后重新修改nginx.conf文件。
之后需要重启nginx,可以执行:
$sudo kill `cat /usr/local/nginx/logs/nginx.pid` 表示关闭nginx
$sudo /usr/local/nginx/sbin/nginx 再次启动nginx
6)设置开机自启动:
在Ubuntu下,如果希望添加到/etc/init.d实现开机重启的话,可以Google寻找nginx和php-fpm的init script(php-fpm本身就是init script不需要寻找了),然后拷贝到/etc/init.d目录下。 简单的方法,设置rc.local:
$sudo vi /etc/rc.local
在exit 0之前添加:
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx
这样开机自动启动nginx和php-fpm。 7) 使用nginx和php-fpm实现server cluster: 和nginx对多台app server代理实现负载均衡类似,我们可以实现nginx对多台php-fpm实现负载均衡:
To configure Nginx to load balance multiple FastCgi servers use this type of configuration:
upstream fastcgiServers {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 198.192.0.1:9000;
server 198.192.0.2:9000;
server 198.192.0.3:9000;
}
location ~ \.php$ {
fastcgi_pass fastcgiServers; fastcgi_index stream.app;
fastcgi_param SCRIPT_FILENAME /var/www/htdocs$fastcgi_script_name;
include /etc/nginx/fastcgi.conf;
} 4. 总结: 三种常用模式: Apache+mod_php5;
lightppd+spawn-fcgi;
nginx+PHP-FPM 我们可以使用到生产环境中的:
0) 如果不是server cluster的话:
可以使用以上任一种,不过有各种测试表明nginx+PHP-FPM性能优越,但是Apache+mod_php5很经典模块多,比如对.htaccess等的支持。
如果构建server cluster的话: 1) nginx作为反向代理服务器,后台多台Apache+mod_php5。
nginx处理静态文件,及对php并发请求对后台多台app server的负载均衡; 2) nginx作为反向代理器,后台多台PHP-FPM
nginx处理静态文件及将php并发请求发送到后台php-fpm来解析;
另外:关于如何更好使用nginx这个轻量级高性能的瑞士军刀,主要是如何配置nginx.conf,更多参看:
http://wiki.nginx.org/Main
另外,关于PHP支持的各种缓存等这里没有安装,感兴趣可以另行安装。
更多参考资料:
http://www.php.net/manual/en/install.unix.apache2.php
http://www.softwareprojects.com/resources/programming/t-installing-nginx-web-server-w-php-and-ssl-1474.html
http://php-fpm.org/Main_Page
http://www.softwareprojects.com/resources/programming/t-how-to-install-php-fpm-spawn-fcgi-replacement-1602.html
http://wiki.nginx.org/NginxFcgiExample
有可能以后会将PHP-FPM直接添加到PHP内核中一起进行发布
Will there be a PHP-FPM is included in the official PHP?
http://php-fpm.org/FAQ#Will_there_be_a_PHP-FPM_is_included_in_the_official_PHP.3F
http://bookmarks.honewatson.com/2008/04/24/multiple-fastcgi-php-servers-nginx-load-balancing/
http://www.wikivs.com/wiki/Lighttpd_vs_nginx
http://en.wikipedia.org/wiki/Reverse_proxy
http://sameerparwani.com/posts/nginx-as-a-front-end-to-apache/
http://blog.kovyrin.net/2006/04/17/typical-nginx-configurations/
http://www.yawn.it/2008/04/30/nginx-php-php-fpm-on-debian-etch-40/
http://howtoforge.org/installing-nginx-with-php5-and-mysql-support-on-ubuntu-8.10