Nginx 和 PHP 整合:TCP 与 unix socket 两种配置方式详解

拾光
拾光
发布时间:2026-08-25 | 126人浏览过
原创

前言

Nginx 处理 PHP 请求时,真正决定是否顺畅联动的,往往不是安装本身,而是 Fastcgi 通信方式选得对不对。本文把 TCP 与 unix socket 两种接法拆开说明,结合 PHP-FPM 与 Nginx 的配置位置、重载命令和验证方法,帮你快速判断在跨机器或同机部署时该怎么配。

用对比卡片展示 Nginx 与 PHP-FPM 两种通信方式的选型依据和差异
TCP 还是 unix socket,先按部把跨机器与同机部署的通信选择先讲清楚,读者更容易判断后续该看哪种配置。

Nginx 本身不能直接执行 PHP,请求通常要转给 PHP-FPM,再通过 Fastcgi 完成协作。实际部署时,关键不在于“能不能通”,而在于该选 TCP 还是 unix socket:前者更适合跨机器通信,后者更常见于同机部署。下面按安装前提、两种配置方式和验证思路展开,保留完整配置路径、命令与示例,方便你直接对照上线环境处理。

安装前提与测试文件准备

Nginx 和 PHP 的组合,本质上是通过 Fastcgi 通信。常见的通信方式有两种:

  • TCP
  • unix socket

如果 Nginx 和 PHP 部署在不同机器上,通常选择 TCP;如果部署在同一台机器上,则可以优先考虑 unix socket。而 PHP-FPM,就是 PHP 侧对 Fastcgi 的一种实现。

安装可先参考以下内容:

假设站点目录为 /wwwroot/example.com/,先创建一个最简单的测试文件 /wwwroot/example.com/public/index.php:

<?php
echo phpinfo();

这个文件的作用很直接:只要浏览器能正确显示 phpinfo() 页面,就说明 Nginx 已经成功把 PHP 请求交给了 PHP-FPM 处理。

TCP 方式如何配置

先检查 PHP-FPM 的站点配置文件 /usr/local/php/etc/php-fpm.d/www.conf,确认 listen 是否使用“IP + 端口”的形式:

listen = 127.0.0.1:9000

如果这里做过修改,需要重启 PHP-FPM 让配置生效:

service php-fpm restart

接着编辑 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf,在 http 节点内添加站点配置:

    server {
        listen       80;
        server_name  example.com;
        root /wwwroot/example.com/public;
        index index.html index.htm index.php;

        location ~ .php$ {                     
            # TCP,ip+端口的通信方式
            fastcgi_pass   127.0.0.1:9000; 
            fastcgi_index  index.php;
            include        fastcgi.conf;
        }
    }

这里最关键的是 fastcgi_pass 127.0.0.1:9000;。它表示 Nginx 会把匹配到的 PHP 请求转发给监听在 127.0.0.1:9000 的 PHP-FPM 进程。

配置完成后,重载 Nginx:

service nginx reload

如果没有报错,再把 host 绑定好,访问 http://example.com/,正常情况下就能看到 phpinfo 页面。

unix socket 方式如何配置

unix socket 是 *nix 系统里常用的一种进程间通信方式。它不是通过网络端口标识服务,而是通过一个文件来标识通信端点,常见后缀就是 .sock。只要 Nginx 和 PHP-FPM 都引用同一个 socket 文件,就可以建立通信。

展示 unix socket 配置中 PHP-FPM 与 Nginx 共用同一 sock 文件的关系及权限要点
socket 文件、权限与转发路径这一节最容易卡在 socket 路径与权限,适合用结构图把配置点一次说明白。

先修改 PHP-FPM 的站点配置文件 /usr/local/php/etc/php-fpm.d/www.conf,重点是下面三个值:

listen = /tmp/php-cgi.sock

listen.owner = www
listen.group = www

其中:

  • listen = /tmp/php-cgi.sock 表示 PHP-FPM 改为监听 socket 文件;
  • listen.owner 和 listen.group 用来设置这个 socket 文件的属主和属组,避免 Nginx 因权限问题无法访问。

修改完成后,重启 PHP-FPM:

service php-fpm restart

然后再修改 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf,同样是在 http 节点内添加或调整站点配置:

    server {
        listen       80;
        server_name  example.com;
        root /wwwroot/example.com/public;
        index index.html index.htm index.php;

        location ~ .php$ {                     
            # TCP,ip+端口的通信方式
            # fastcgi_pass   127.0.0.1:9000; 
            #  unix socket 方式
            fastcgi_pass unix:/tmp/php-cgi.sock;

            fastcgi_index  index.php;
            include        fastcgi.conf;
        }
    }

这里的核心变化是把 fastcgi_pass 从端口地址改成了 socket 文件:

  • fastcgi_pass unix:/tmp/php-cgi.sock;

配置完成后,同样重载 Nginx:

service nginx reload

如果没有报错,绑定好 host 后访问 http://example.com/,也应该可以看到 phpinfo 页面。

如何验证是否打通,以及常见排查点

无论你使用的是 TCP 还是 unix socket,验证结果都很明确:浏览器访问 http://example.com/ 后,只要能看到 phpinfo() 的输出页面,就说明 Nginx 与 PHP-FPM 已完成联动。

如果页面没有打开,排查时可以先按这几个方向看:

  • 确认 PHP-FPM 的 listen 配置与 Nginx 中的 fastcgi_pass 是否一致;
  • 确认修改配置后是否执行过 service php-fpm restart 和 service nginx reload;
  • 确认域名的 host 是否已经正确绑定;
  • 如果是端口通信不通,可检查防火墙策略。

原始环境里还给出了一条直接处理方式:如果网络不通,可以尝试为防火墙添加端口,或者临时关闭防火墙:

service firewalld stop

不过在生产环境中,是否关闭防火墙需要结合实际安全策略判断。对大多数场景来说,核心选择逻辑并不复杂:跨机器部署用 TCP,同机部署优先考虑 unix socket,然后用一个最简单的 phpinfo() 页面完成联通性验证即可。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表