nginx 与 php-fpm 通信的两种方式

简述

在linux中,nginx 服务器和 php-fpm 可以通过 tcp socketunix socket 两种方式实现。

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

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

windows系统只能使用tcp socket的通信方式

配置方法

tcp socket

tcp socket 通信方式,需要在 nginx 配置文件中填写 php-fpm 运行的 ip地址 和 端口号 。

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
}

unix socket

unix socket 通信方式,需要在 nginx 配置文件中填写 php-fpm 运行的 pid文件地址。

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
}
  • php-fpm运行端口号socket文件的地址 都是在 php-fpm.conf 中配置的。
  • php-fpm.conf 文件在php安装文件的 /etc 目录下,比如你的php安装在 /opt/php 目录,则应该是 /opt/php/php-fpm.conf
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all IPv4 addresses on a
;                            specific port;
;   '[::]:port'            - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
listen = /run/php/php7.2-fpm.sock

通过注释可以看到,php-fpmlisten 指令可以通过五种方式处理 FastCGI 请求,分别是:

  1. ipv4:端口号
  2. ipv6:端口号
  3. port相当于 0.0.0.0:port,本机所有ipv4对应的端口号
  4. [::]:port,包括ipv4和ipv6
  5. unix socket文件

直接配置使用unix socket文件之后,会遇到access deny的问题,由于socket文件本质上还是一个文件,存在权限控制问题,默认由 root 用户创建,因此 nginx 进程无权限访问,应该配置如下命令:

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

可以配置 nginxphp-fpm 都是用 www 用户,这样就不会存在权限问题,当然也可以创建不同的用户,然后加入同一个组,便于分配权限。

nginx与php-fpm通信的两种方式

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22