Nginx 和 PHP-FPM 的进程间通信有两种方式,一种是TCP,一种是 UNIX Domain Socket。其中 TCP 是 IP 加端口,可以跨服务器.而 UNIX Domain Socket 不经过网络,只能用于 Nginx 跟 PHP-FPM 都在同一服务器的场景,而 IP Socket 则可以跨服务器或者通过 127.0.0.1 本地回环2种方式来实现同一服务器使用场景。

本文主要记录 MacOS 如何修改默认 brew 安装的 Nginx 与 PHP-FPM 之间的通讯方式。

创建 Socket 文件

cd /var/run
touch php-fpm.sock
chown bigface:staff php-fpm.sock
chmod 777 php-fpm.sock

修改 PHP-FPM 配置

vi /usr/local/etc/php/7.1/php-fpm.d/www.conf
# 第36行找到 listen = 127.0.0.1:9000 改为
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
listen.owner = bigface
listen.group = staff
# 保存

如果 「www.conf」 文件下没有找到 「listen」,去 「php-fpm.conf」 文件找

修改 Nginx server 配置

vi /usr/local/etc/nginx/nginx.conf
# 找到 fastcgi_pass   127.0.0.1:9000 改为
#fastcgi_pass   127.0.0.1:9000;
fastcgi_pass   unix:/var/run/php-fpm.sock;

测试

顺手修改了下 「Nginx」 的用户组,结果报错了

nginx -t
# 报错
nginx: [emerg] getgrnam("bigface") failed in /usr/local/etc/nginx/nginx.conf:2
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

whoami # 查看用户
id -g -n $whoami # 查看用户组

# 查看 Nginx 文档,修改 nginx.conf 用户为
user  bigface staff;

重启 Nginx PHP-FPM

brew services restart nginx # 重启 Nginx
ps aux | grep php-fpm # 查看 php-fpm 进程
kill 你的 php-fpm pid
sudo php-fpm # 启动 php-fpm

参考

Nginx官方文档