最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中 PHP-FPM 如何配置 Unix socket 代替 TCP 提升本地通信性能
时间:2026-08-29 11:05:49 编辑:袖梨 来源:一聚教程网
Unix socket替代TCP可减少协议栈开销、提升性能与安全性;需同步修改PHP-FPM的listen路径及权限(listen.owner/group/mode),并严格匹配Nginx中fastcgi_pass的unix:前缀路径,最后重启服务验证socket文件权限与状态。
同一台服务器上运行 Nginx 和 PHP-FPM 时,用 Unix socket 替代 TCP(如 127.0.0.1:9000)能减少网络协议栈开销、避免端口争用、提升响应速度,同时权限更可控、更安全。
修改 PHP-FPM 的监听配置
编辑对应版本的 pool 配置文件(通常是 /etc/php/*/fpm/pool.d/www.conf),找到 listen 行并替换为 Unix socket 路径:
- 将
listen = 127.0.0.1:9000改为listen = /run/php/php8.2-fpm.sock(路径建议用/run/php/,它是 tmpfs,重启自动清理,比/tmp/更可靠) - 必须补充三行权限设置,确保 Nginx worker 进程可访问:
listen.owner = www-datalisten.group = www-datalisten.mode = 0660 - 确认
/run/php/目录存在且属主属组为www-data,否则 PHP-FPM 启动时无法创建 socket 文件
同步更新 Nginx 的 fastcgi_pass 指令
在站点 server 块或 location ~ .php$ 中,把原来的 TCP 地址换成对应的 Unix socket 路径:
- 将
fastcgi_pass 127.0.0.1:9000;改为fastcgi_pass unix:/run/php/php8.2-fpm.sock; - 注意路径要和 PHP-FPM 的
listen值完全一致,包括前缀unix:和斜杠位置 - 无需修改
fastcgi_param SCRIPT_FILENAME等其他参数,它们与通信方式无关
验证与权限检查
配置完成后需完整重启服务,并确认 socket 文件状态:
- 先重启 PHP-FPM(不是 reload):
sudo systemctl restart php8.2-fpm - 再重启 Nginx:
sudo systemctl restart nginx - 检查 socket 是否生成:
ls -l /run/php/php8.2-fpm.sock,应显示类似srw-rw---- 1 www-data www-data - 常见报错
Permission denied多因listen.owner/group与 Nginx 运行用户不一致,可用ps aux | grep nginx查看 USER 列确认
高并发场景下的稳定性增强(可选)
若并发量常超 500,Unix socket 可能出现 Resource temporarily unavailable,可通过以下方式缓解:
- 调大内核参数:
net.core.somaxconn=4096、net.unix.max_dgram_qlen=4096 - 在 Nginx server 块中增加
listen 80 backlog=1024; - 在 PHP-FPM pool 配置中设置
listen.backlog = 1024(默认仅 128) - 对极致性能要求场景,可将 socket 放在
/dev/shm/(内存文件系统),但需确保权限和生命周期管理