微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

怎么用php-fpm搭建Nginx+PHP的生产环境

这篇文章主要介绍了怎么用PHP-fpm搭建Nginx+PHP的生产环境的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用PHP-fpm搭建Nginx+PHP的生产环境文章都会有所收获,下面我们一起来看看吧。

一、编译安装PHP-fpm

什么是PHP-fpm

PHP-fpm是一个PHP fastcgi管理器,是只用于PHP的,可以在 http://PHP-fpm.org/download下载得到.

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 http://cn2.PHP.net/distributions/PHP-5.4.7.tar.gz
tar zvxf PHP-5.4.7.tar.gz
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搭建Nginx+PHP的生产环境

以上就完成了PHP-fpm的安装。

下面是对PHP-fpm运行用户进行设置

cd /usr/local/PHP
cp etc/PHP-fpm.conf.default etc/PHP-fpm.conf
vi etc/PHP-fpm.conf

修改

user = www-data
group = www-data

如果www-data用户不存在,那么先添加www-data用户

groupadd www-data
useradd -g www-data www-data

二、编译安装Nginx

然后按照http://www.Nginx.cn/install 安装Nginx

三、修改Nginx配置文件支持PHP-fpm

Nginx安装完成后,修改Nginx配置文件为,Nginx.conf

其中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文件

在/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关闭重启见文章结尾

六、浏览器访问

访问http://你的服务器ip/index.PHP,皆可以见到PHP信息了。

怎么用php-fpm搭建Nginx+PHP的生产环境

七、错误解决
在使用Nginx时,经常会碰到502 bad gateway和504 gateway time-out错误,下面以Nginx+PHP-fpm来分析下这两种常见错误的原因和解决方案。

1.502 bad gateway错误

PHP.ini和PHP-fpm.conf中分别有这样两个配置项: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.com, request: "post /index.PHP http/1.1", upstream: "fastcgi://unix:/dev/shm/PHP-fcgi.sock:", 
   host: "test.com", referrer: "http://test.com/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.com, request: "post /index.PHP http/1.1", upstream: "fastcgi://unix:/dev/shm/PHP-fcgi.sock:", 
   host: "test.com", referrer: "http://test.com/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.com;
        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.com$fastcgi_script_name;
   }

关于“怎么用PHP-fpm搭建Nginx+PHP的生产环境”这篇文章内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用PHP-fpm搭建Nginx+PHP的生产环境”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐