nginx中配置php-FPM教程详解

nginx中配置php-FPM教程

nginx 可以直接调用FPM来驱动php,从此就可以放弃apache了。什么原因不多说了。
先下载php5.4的安装包。

照别人的说法

 代码如下 复制代码
./configure --enable-fastcgi --prefix=/data1/server/php-cgi --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --enable-sockets --with-curl --with-ttf --with-libxml-dir --with-config-file-path=/data1/server/php-cgi/etc --with-zlib --enable-exif --enable-ftp --with-xmlrpc --enable-zip --with-iconv-dir --with-libxml-dir --with-mcrypt --with-tidy --with-tidy --enable-fpm --enable-force-cgi-redirect

提示无法安装enable-force-cgi-redirect 等等一堆玩意儿

好的,去掉一些东西来安装

 代码如下 复制代码
./configure --prefix=/data1/server/php-cgi --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-mbstring --with-mysql --with-mysqli --with-pdo-mysql --enable-sockets --with-curl --with-libxml-dir --with-config-file-path=/data1/server/php-cgi/etc --with-zlib --enable-exif --enable-ftp --with-xmlrpc --enable-zip --with-iconv-dir --with-libxml-dir --with-mcrypt --with-tidy --with-tidy --enable-fpm

出现错误
configure: error: xml2-config not found. Please check your libxml2 installation.

 代码如下 复制代码

1.安装他
#apt-get install libxml2-dev

错误
configure: error: Please reinstall the libcurl distribution -
easy.h should be in <curl-dir>/include/curl/

2.安装他
apt-get install libcurl4-gnutls-dev

错误
configure: error: jpeglib.h not found.
3.安装他
apt-get install libjpeg-dev

错误
If configure fails try –with-vpx-dir=<DIR>
configure: error: png.h not found.
4.安装他
apt-get install libpng12-dev

错误
If configure fails try –with-xpm-dir=<DIR>
configure: error: freetype.h not found.
5.安装他
apt-get install libfreetype6-dev

错误
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
6.安装他
apt-get install libmcrypt-dev

错误
configure: error: Cannot find libtidy
7.安装他
apt-get install libtidy-dev

我一个一个测试的。大家安装的时候,可以先安装这些错误需要安装的东西,然后再执行./configure……

make
make test
make install

启动php-fpm

/data1/server/php-cgi/sbin/php-fpm

错误
[28-Mar-2012 11:15:01] ERROR: failed to open configuration file ‘/data1/server/php-cgi/etc/php-fpm.conf’: No such file or directory (2)
[28-Mar-2012 11:15:01] ERROR: failed to load configuration file ‘/data1/server/php-cgi/etc/php-fpm.conf’
[28-Mar-2012 11:15:01] ERROR: FPM initialization failed
cd /data1/server/php-cgi/etc

再次启动
/data1/server/php-cgi/sbin/php-fpm

ERROR: [pool www] cannot get gid for group ‘nobody’
好吧,我们加一个组叫nobody

#groupadd nobody

再次启动
/data1/server/php-cgi/sbin/php-fpm
成功了。

关闭php-fpm
killall php-fpm

目前还不知道有没有直接的命令来关闭它。

cannot get gid for group ‘nobody’ 其他解决方案。
————————————————————————————
or can change it in your php-fpm.conf

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
; will be used.
user = www-data
group = nobody
————————————————————————————-

集成nginx

最后的配置

 代码如下 复制代码

# cd /etc/nginx/conf.d
#vi default.conf

location ~ \.php$ {

root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;

# vi /etc/nginx/fastcgi.conf

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

/etc/init.d/nginx stop
/etc/init.d/nginx start

成功啦。

给php一个配置文件,从安装目录拷贝一个
cp php.ini-development /data1/server/php-cgi/etc/php.ini

补充:php-fpm 输出php错误日志

nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息。

nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog

原因是php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。

调试起来就很痛苦了。解决nginx下php-fpm不记录php错误日志的办法:

1.修改php-fpm.conf中配置 没有则增加
catch_workers_output = yes
error_log = log/error_log

2.修改php.ini中配置,没有则增加
log_errors = On
error_log = "/usr/local/lnmp/php/var/log/error_log"
error_reporting=E_ALL&~E_NOTICE

3.重启php-fpm,
当PHP执行错误时就能看到错误日志在"/usr/local/lnmp/php/var/log/error_log"中了

请注意:

1. php-fpm.conf 中的php_admin_value[error_log] 参数 会覆盖php.ini中的 error_log 参数
所以确保你在phpinfo()中看到的最终error_log文件具有可写权限并且没有设置php_admin_value[error_log] 参数,否则错误日志会输出到php-fpm的错误日志里。

2.找不到php.ini位置,使用php的phpinfo()结果查看

3.如何修改PHP错误日志不输出到页面或屏幕上
修改php.ini
display_errors = off //不显示错误信息(不输出到页面或屏幕上)
log_errors = on //记录错误信息(保存到日志文件中)
error_reporting = E_ALL //捕获所有错误信息
error_log = //设置日志文件名

程序中修改以上配置
ini_set("display_errors",0)
ini_set("error_reporting",E_ALL); //这个值好像是个PHP的常量
ini_set("error_log","<日志文件名>")
ini_set("log_errors",1);

4.如何将php的错误日志输出到nginx的错误日志里
在PHP 5.3.8及之前的版本中,通过FastCGI运行的PHP,在用户访问时出现错误,会首先写入到PHP的errorlog中
如果PHP的errorlog无法写入,则会将错误内容返回给FastCGI接口,然后nginx在收到FastCGI的错误返回后记录到了nginx的errorlog中
在PHP 5.3.9及之后的版本中,出现错误后PHP只尝试写入PHP的errorlog中,如果失败则不会再返回到FastCGI了,错误日志会输出到php-fpm的错误日志里。
所以如果想把php错误日志输出到nginx错误日志,需要使用php5.3.8之前的版本,并且配置文件中php的error_log对于php worker进程不可写

php-fpm内存配置问题

nginx php-fpm配置过程中最大问题是内泄漏出问题:服务器的负载不大,但是内存占用迅速增加,很快吃掉内存接着开始吃交换分区,系统很快挂掉!
google了一天,终于发现些有用的东西,其实根据官方的介绍,php-cgi不存在内存泄漏,每个请求完成后php-cgi会回收内存,但是不会释放给操作系统,这样就会导致大量内存被php-cgi占用。
官方的解决办法是降低PHP_FCGI_MAX_REQUESTS的值,我用的是php-fpm,对应的php-fpm.conf中的就是max_requests,该值的意思是发送多少个请求后会重启该线程,我们需要适当降低这个值,用以让php-fpm自动的释放内存,不是大部分网上说的51200等等,实际上还有另一个跟它有关联的值max_children,这个是每次php-fpm会建立多少个进程,这样实际上的内存消耗是max_children*max_requests*每个请求使用内存,根据这个我们可以预估一下内存的使用情况,就不用再写脚本去kill了。
下面其实是重启脚本的过程,并不是什么很严重的事情,但是我们要小心,不是说一直重启就是好的,因为重启会导致cpu的使用率飙升,系统负载巨大,所以还是平衡上面的数据比较重要。
Mar 08 16:13:33.113138 [NOTICE] fpm_got_signal(), line 48: received SIGCHLD
Mar 08 16:13:33.113202 [WARNING] fpm_children_bury(), line 215: child 23051 (pool default) exited on signal 11 SIGSEGV after 747.428492 seconds from start
Mar 08 16:13:33.113622 [NOTICE] fpm_children_make(), line 352: child 24511 (pool default) started

配置指南通信指南

TCP配置方式

TCP通信配置起来很简单,三步即可搞定

第一步,编辑 /etc/nginx/conf.d/你的站点配置文件(如果使用的默认配置文件,修改/etc/nginx/sites-available/default)

将fastcgi_pass参数修改为127.0.0.1:9000,像这样:

 代码如下 复制代码
location ~ \.php$ {
      index index.php index.html index.htm;
      include /etc/nginx/fastcgi_params;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi_params;
 }

 第二步,编辑php-fpm配置文件 /etc/php5/fpm/pool.d/www.conf

将listen参数修改为127.0.0.1:9000,像这样:

listen = 127.0.0.1:9000

 第三步,重启php-fpm,重启nginx

 unix socket配置方式

unix socket其实严格意义上应该叫unix domain socket,它是*nix系统进程间通信(IPC)的一种被广泛采用方式,以文件(一般是.sock)作为socket的唯一标识(描述符),需要通信的两个进程引用同一个socket描述符文件就可以建立通道进行通信了。

配置需要五步

第一步,决定你的socket描述符文件的存储位置。

可以放在系统的任意位置,如果想要更快的通信速度,可以放在/dev/shm下面,这个目录是所谓的tmpfs,是RAM可以直接使用的区域,所以,读写速度都会很快。

决定了文件位置,就要修改文件的权限了,要让nginx和php-fpm对它都有读写的权限,可以这样:

 代码如下 复制代码
sudo touch /dev/shm/fpm-cgi.sock
sudo chown www-data:www-data /dev/shm/fpm-cgi.sock
sudo chmod 666 /dev/shm/fpm-cgi.sock

 第二步,修改php-fpm配置文件/etc/php5/fpm/pool.d/www.conf

将listen参数修改为/dev/shm/fpm-cgi.sock,像这样:

listen = /dev/shm/fpm-cgi.sock
 将listen.backlog参数改为-1,内存压无限大,默认是128,并发高了之后就会报错

 ; Set listen(2) backlog. A value of '-1' means unlimited.
 ; Default Value: 128 (-1 on FreeBSD and OpenBSD)
 listen.backlog = -1

 第三步,修改nginx站点配置文件

将fastcgi_pass参数修改为unix:/dev/shm/fpm-cgi.sock,像这样:

 代码如下 复制代码
location ~ \.php$ {
      index index.php index.html index.htm;
      include /etc/nginx/fastcgi_params;
      fastcgi_pass unix:/dev/shm/fpm-cgi.sock;
      fastcgi_index index.php;
      include fastcgi_params;
}

第四步,修改/etc/sysctl.conf 文件,提高内核级别的并发连接数(这个系统级的配置文件我也不是特别熟悉,参考的是这篇博客:《Php-fpm TcpSocket vs UnixSocket》)

sudo echo 'net.core.somaxconn = 2048' >> /etc/sysctl.conf
sudo sysctl -p
第五步, 重启nginx和php-fpm服务(最好先重启php-fpm再重启nginx)

 两种通信方式的分析和总结

从原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。

当然还是从原理上来说,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,多少可以保证通信的正确性和完整性。

当然以上主要是半懂不懂的理论分析加主观臆测,具体的差别还是要通过测试数据来说话,以后有空,会进行这方面的测试。从网上别人博客的测试数据,我的理论分析差不多是对的。至于你选择哪种方式,我只能说“鱼和熊掌不可兼得也”,通过高超的运维和配置技巧,在性能和稳定性上做一个平衡吧。

时间: 2024-10-19 06:52:44

nginx中配置php-FPM教程详解的相关文章

PHP7+Nginx的配置与安装教程详解_php实例

系统环境:centos6.5 x64 软件版本:nginx-1.10.0 php-7.0.6 安装 Nginx Nginx官网:http://nginx.org/ 先安装编译依赖的一些组件 复制代码 代码如下: yum install pcre pcre-devel openssl openssl-devel -y 1.解压程序包 复制代码 代码如下: tar xf nginx-1.10.0.tar.gz cd nginx-1.10.0 2.预编译配置参数 复制代码 代码如下: ./config

vmware虚拟机NAT配置静态IP教程详解_VMware

一.配置虚拟机的"虚拟网络编辑器" 注意1:虚拟机局域网IP段一定不要和真实使用的IP段冲突. 二.查看本地电脑VMnet8网卡的IP段 注意2.本地电脑VMnet8网卡IP段必须与虚拟机局域网Ip端相同 三.更改虚拟机系统网卡的IP配置 vim /et/sysconfig/network-scripts/ifcfg-etho 修改为 BOOTPROTO="static" #dhcp改为static ONBOOT="yes" #开机启用本配置 I

linux中安装RHEV-M的教程详解

一.yum源配置 安装rhev-m需要配置RHEV-M.RHEV-H.Supplementary.JBoss四个源,这个实验的时候,我将其整合到了一个配置中.并将其保存到/etc/yum.repos.d/目录下.如下: [root@rhevm ~]# wget http://classroom.example.com/materials/rhevm.repo  -P /etc/yum.repos.d/ # cat /etc/yum.repos.d/rhevm.repo [RHEVMgr] nam

Nginx配置虚拟主机教程详解

nginx可以使用server块来设置多个虚拟主机,在server段中用server_name和listen指令来绑定域名和端口.例如:  代码如下 复制代码 server {  listen          80;  server_name    www.111cn.net;  location / {   root  hzhuti;   index index.html;  } } 上述配置就是指定了一个虚拟主机www.111cn.net.可能在某些nginx的版本中上述的配置并不能很好的

【图】Windows Server 2008R2配置MySQL Cluster教程详解

配置环境 VMware:(版本10.0.01) 操作系统:Windows Server 2008 R2 Enterprise VM1:192.168.220.103 管理节点(MGM),数据节点(NDBD1),SQL节点(SQL1) VM2:192.168.220.104 数据节点(NDBD2),SQL节点(SQL2) MySQL Cluster版本:7.3.7 (MSI Installer) 下载地址:http://dev.mysql.com/downloads/cluster/ 测试工具:N

LARAVEL中TRAIT的使用教程详解

看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集.Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题. Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能.Trait 不能通过它自身来实

Outlook 2010中邮件联系人导出教程详解

依次点击文件---选项---高级,即可点击"导出"按钮,然后点击导出到文件,选择逗号分隔符的文件,即可导出一个csv格式. 如下所示我们在outlook选项中点击高级选项了 之后就可以在此导入或导入联系人了,非常的简单 导入的方法更多了我们不在介绍了其实就是在高级中了,导入时数据肯定是文件,导出时我们直接可以导入对应的文件了.

Linux下负载均衡软件LVS配置(VS/TUN)教程详解

DIP:192.168.199.230 VIP:192.168.199.235 RIP:192.168.199.231(232) 负载均衡器: [root@LVS001 ~]# sysctl -w net.ipv4.ip_forward=0 net.ipv4.ip_forward = 0 [root@LVS001 ~]# ifconfig eth1:1 192.168.199.235 netmask 255.255.255.0 up [root@LVS001 ~]# ipvsadm -A -t

xampp配置https访问教程详解

网站开启了https,本地都无法访问了,使用的是XAMPP集成PHP环境,如何支持https?方法是修改D:\xampp\apache\conf\extra的httpd-vhost.conf文件,按以下格式添加针对https的支持,如端口是443. <VirtualHost *:443>     DocumentRoot "/xampp/htdocs/ddd"     ServerName www.111cn.net     ServerAlias *.111cn.net