首页 » LANMP » nginx » 正文

nginx结合php-fpm和php勾结的速配方法

增加PHP的fpm支持
Nginx 和PHP是完全不认识的。目前他们之间的沟通需要PHP-FPM支持。
Apache和PHP也是不认识的。但是由于某些“缘分”原因,apache可以把PHP编译成自己的模块(吃到肚子里)

nginx

CGI规范(nginx把数据按规范按格式传出去) -> PHP(php-cgi)
又演化成了FastCGI进程管理器
官方吸收演化成PHP-FPM
 
 

重新编译PHP

cd 解压后的目录

编译好后

进入php安装目录下的sbin(注意不是bin)

会有一个 php-fpm 文件 并且需要配置文件

在php安装目录下的etc下有个配置文件(php-fpm.conf.default 模板文件)
拷贝一份出来

还有一个是www.conf (这里是配置进程池的)
 
 

改几个重要参数

以下配置在www.conf下

如果要在fpm中开启php的出错信息,还需以下配置
1.在php-fpm.d/www.conf(pool.d目录)中开启

2.修改php.ini中配置,没有则增加

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


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

 
 

启动FPM

进入sbin目录

接下来是修改Nginx的配置文件
打开上次修改过的文件,加入

重启nginx
很重要
进入nginx的sbin 目录
执行

业务性的系统一般使用apache
 
 

将fpm与nginx的通信改为unix socket方式

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

Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。

1.先在/var/run/里创建php-fpm.sock文件

2.修改php-fpm配置文件/usr/local/php/etc/php-fpm.d/www.conf
将listen参数修改为/var/run/php-fpm.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

3.修改nginx站点配置文件
将fastcgi_pass参数修改为 ,像这样:

4.第四步,修改/etc/sysctl.conf 文件,提高内核级别的并发连接数
5.重启nginx和php-fpm服务(最好先重启php-fpm再重启nginx)。

两种通信方式的分析和总结:
unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高。

tcp socket的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。

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

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

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

说说我的选择:
其实,如果nginx做要做负载均衡的话,根本也不要考虑unix socket的方式了,只能采用TCP的方式。现在我的小站没有那么高的并发量,所以就用unix socket了,以后如果有了高并发业务,再进行一些参数调整即可应付,如果真要是无法支撑,那只能做负载均衡了,到时候自然会选择TCP方式。

 
 

Nginx PHP-FPM增加PHP后缀解析

在很多情况下,我们需要把.html也使用php解析。更改nginx配置文件

这个时候访问这些后缀的时候会报403错误,原因是php-fpm限制了后缀的解析

2016/08/04 11:03:35 [error] 6225#0: *65 FastCGI sent in stderr: “Access to the script ‘/var/www/html/index.aspx’ has been denied (see security.limit_extensions)” while reading response header from upstream, client: 127.0.0.1, server: www.abc.com, request: “HEAD /index.aspx HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “127.0.0.1”

更改php-fpm.d/www.conf配置文件
在pool池[www]里写入 (不在pool池里写入,会报错:unknown entry ‘security.limit_extensions’)

重启php-fpm服务即可

 
 

fpm脚本

发表评论

正在加载验证码......

请先完成验证