关键在于Nginx配置、系统权限、网络控制和进程管理四层隔离:独立Unix socket文件+专属用户运行FastCGI进程,按域名/端口硬切流量,日志与资源物理分离,启用定制systemd服务并强制校验。
在单台物理机上用 Nginx + FastCGI 部署生产服务,关键不是“能不能跑”,而是“如何不串、不扰、不出错”。FastCGI 本身是进程级协议(通过 socket 或端口通信),它天然不带环境边界,所以隔离必须靠外部机制——Nginx 配置、系统权限、网络控制和进程管理四层叠加,缺一不可。
每个环境的 FastCGI 应用(如 PHP-FPM 实例、自研 C/C++ FastCGI 服务)必须使用专属 Unix socket 文件,并以不同系统用户运行:
Nginx 的 fastcgi_pass 必须指向对应 socket 路径,且配置中显式指定 fastcgi_param SCRIPT_FILENAME 和 fastcgi_param DOCUMENT_ROOT,避免路径解析越界。
Nginx 不靠注释或命名约定来区分环境,而靠不可绕过的匹配规则:
server_name app.example.com,fastcgi_pass unix:/run/php-fpm-prod.sock
listen 443 ssl + 独立证书,fastcgi_pass 指向 test socket127.0.0.1:8080,不绑定公网 IP,防火墙 DROP 所有非本地访问禁止在任意 server 块中使用 server_name _ 或空 host,防止未匹配请求落入默认实例。
FastCGI 进程本身不记录 HTTP 层日志,但 Nginx 和后端应用的日志必须物理隔离:
access.log 和 slowlog 分别存到 /var/log/php-fpm/prod/ 目录640,禁止其他用户读取/var/www/prod/、/var/www/test/、/var/www/dev/,Nginx root 指令不得使用变量或软链跳转不用 systemctl start php7.4-fpm 这类全局服务,改用定制化 systemd unit:
php-fpm-prod.service:指定 User=www-data、RuntimeDirectory=php-fpm-prod、ExecStart=/usr/sbin/php-fpm7.4 -y /etc/php/7.4/fpm-prod.conf
include /etc/nginx/sites-enabled/prod.conf,该文件只 include 生产相关 server 块nginx -t && systemctl list-units --state=running | grep -q 'php-fpm-prod',任一失败即中止不依赖人工判断,靠配置路径、用户、socket 文件名、日志路径四重哈希锁定生产上下文。