Nginx和php-fpm结合

Nginx不只有处理http请求的功能,还能做反向代理。
Nginx通过反向代理功能将动态请求转向后端Php-fpm。

在 Linux 上,nginx 与 php-fpm 的通信有 tcp socket 和 unix socket 两种方式。

  • tcp socket 的优点是可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式。
  • Unix socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信,这种方式需要在 nginx配置文件中填写 php-fpm 的 socket 文件位置。

两种方式的数据传输过程如下图所示:
40ef8c1f5cb07d102bc9b37368a786e5

二者的不同:

由于 Unix socket 不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。所以其效率比 tcp socket 的方式要高,可减少不必要的 tcp 开销。不过,unix socket 高并发时不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。而 tcp 这样的面向连接的协议,可以更好的保证通信的正确性和完整性。

下面我们来配置一个全新的Nginx+Php-fpm

  1. 配置nginx.conf文件
    进入nginx目录下,编辑nginx.conf文件。
    如图,在nginx.conf最后一行,添加include文件
    d1e54053831e3288467bad22e8ebaeb5

  2. 添加对应的server
    进入上面的include的路径,添加一个server
    dc5882516f01acc2bca56dea6c685fa7
    unix socket 方式 修改fastcgi_pass如下
    fastcgi_pass unix:/usr/run/php-fpm.sock

下面我们解释下配置项的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #就是网站地址
root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
#路由到网站根目录www.example.com时候的处理
location / {
index index.php; #跳转到www.example.com/index.php
autoindex on;
}

#当请求网站下php文件的时候,反向代理到php-fpm
location ~ \.php$ {
include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
# fasrcgi_pass /usr/run/php-fpm.sock #unix socket 连接方式
}
}

下面我们启用php的php-fpm来处理这个请求
打开php-fpm.conf文件,我们看到如下配置:
ab60dcdb0f77e985dc233cd54e0b2fb8
unix socket 方式 修改php-fpm.conf如下
listen = /usr/run/php-fpm.sock

即:php-fpm模块监听127.0.0.1:9000端口 或者 php-fpm.sock文件,等待请求到来去处理。

注意:在使用 unix socket 方式连接时,由于 socket 文件本质上是一个文件,存在权限控制的问题,所以需要注意 nginx 进程的权限与 php-fpm 的权限问题,不然会提示无权限访问。(在各自的配置文件里设置用户)