安装配置php-fpm来搭建Nginx+PHP的⽣产环境
nginx本⾝不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。
nginx⼀般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi⼦进程处理结果并返回被nginx
本⽂以php-fpm为例介绍如何使nginx⽀持PHP
⼀、编译安装php-fpm
什么是PHP-FPM
PHP-FPM其实是PHP源代码的⼀个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使⽤。
新版PHP已经集成php-fpm了,不再是第三⽅的包了,推荐使⽤。PHP-FPM提供了更好的PHP进程管理⽅式,可以有效控制内存和进程、可以平滑重载PHP配置,⽐spawn-fcgi具有更多优点,所以被PHP官⽅收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM,其它参数都是配置php的,具体选项含义可以查看这⾥。
安装前准备
centos下执⾏
yum -y install gcc automake autoconf libtool make
yum -y install gcc gcc-c++ glibc
yum -y install libmcrypt-devel mhash-devel libxslt-devel
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel
zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel
krb5 krb5-devel libidn libidn-devel openssl openssl-devel
新版php-fpm安装(推荐安装⽅式)
wget cn2.php/distributions/php-5.4.
tar zvxf php-5.4.
cd php-5.4.7
./configure --prefix=/usr/local/php --enable-fpm --with-mcrypt
--enable-mbstring --disable-pdo --with-curl --disable-debug --disable-rpath
--enable-inline-optimization --with-bz2 --with-zlib --enable-sockets
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli
--with-gd --with-jpeg-dir
make all install
以上两种⽅式都可以安装php-fpm,安装后内容放在/usr/local/php⽬录下
以上就完成了php-fpm的安装。
下⾯是对php-fpm运⾏⽤户进⾏设置
cd /usr/local/php
cp f.default f
vi f
修改
user = www-data
group = www-data
如果www-data⽤户不存在,那么先添加www-data⽤户
groupadd www-data
useradd -g www-data www-data
⼆、编译安装nginx
三、修改nginx配置⽂件以⽀持php-fpm
nginx安装完成后,修改nginx配置⽂件为,f
其中server段增加如下配置,注意标红内容配置,否则会出现No input file specified.错误
# 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 $document_root$fastcgi_script_name;
include fastcgi_params;php文章管理模块实例代码
}
四、创建测试php⽂件
创建php⽂件
在/usr/local/nginx/html下创建index.php⽂件,输⼊如下内容
<?php
echo phpinfo();
>
五、启动服务
启动php-fpm和nginx
/usr/local/php/sbin/php-fpm
#⼿动打补丁的启动⽅式/usr/local/php/sbin/php-fpm start
sudo /usr/local/nginx/nginx
php-fpm关闭重启见⽂章结尾
六、浏览器访问
七、错误解决
在使⽤Nginx时,经常会碰到502 Bad Gateway和504 Gateway Time-out错误,下⾯以Nginx+PHP-FPM来分析下这两种常见错误的原因和解决⽅案。
1.502 Bad Gateway错误
在php.ini和f中分别有这样两个配置项:max_execution_time和request_terminate_timeout。
这两项都是⽤来配置⼀个PHP脚本的最⼤执⾏时间的。当超过这个时间时,PHP-FPM不只会终⽌脚本
的执⾏,
还会终⽌执⾏脚本的Worker进程。所以Nginx会发现与⾃⼰通信的连接断掉了,就会返回给客户端502错误。
以PHP-FPM的request_terminate_timeout=30秒时为例,报502 Bad Gateway错误的具体信息如下:
1)Nginx错误访问⽇志:
2013/09/19 01:09:00 [error] 27600#0: *78887 recv() failed (104: Connection reset by peer) while reading response header from upstream,
client: 192.168.1.101, server: test, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:",
host: "test", referrer: "test/index.php"
2)PHP-FPM报错⽇志:
WARNING: child 25708 exited on signal 15 (SIGTERM) after 21008.883410 seconds from start
所以只需将这两项的值调⼤⼀些就可以让PHP脚本不会因为执⾏时间长⽽被终⽌了。request_terminate_timeout可以覆盖max_execution_time,
所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模块中的max_fail和fail_timeout两项。有时Nginx与上游服务器(如Tomcat、FastCGI)的
通信只是偶然断掉了,
但max_fail如果设置的⽐较⼩的话,那么在接下来的fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。
所以可以将max_fail调⼤⼀些,将fail_timeout调⼩⼀些。
2.504 Gateway Time-out错误
PHP-FPM设置的脚本最⼤执⾏时间已经够长了,但执⾏耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置factcgi_connect/read/send_timeout。
以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问⽇志如下:
2013/09/19 00:55:51 [error] 27600#0: *78877 upstream timed out (110: Connection timed out) while reading response header from upstream,
client: 192.168.1.101, server: test, request: "POST /index.php HTTP/1.1", upstream: "fastcgi://unix:/dev/shm/php-fcgi.sock:",
host: "test", referrer: "test/index.php"
调⾼这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。
⽽且这三项配置可以配置在http、server级别,也可以配置在location级别。担⼼影响其他应⽤的话,就配置在⾃⼰应⽤的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI⽣效的,⽽proxy_connect/read/send_timeout是对proxy_pass⽣效的。
配置举例:
location ~ \.php$ {
root          /home/cdai/test;
include        fastcgi_params;
fastcgi_connect_timeout  180;
fastcgi_read_timeout      600;
fastcgi_send_timeout      600;
fastcgi_pass      unix:/dev/shm/php-fcgi.sock;
fastcgi_index      index.php;
fastcgi_param    SCRIPT_FILENAME /home/cdai/test$fastcgi_script_name;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。