Traefik代理Docker环境下Nginx出现Primary script unknown交替报错问题
问题根因分析
首先明确两个核心问题指向,结合交替报错的特征,原因分为两类:
- Nginx 配置逻辑冲突:
api域名的/路径块同时配置了proxy_pass http://app:9000和try_files规则,而app容器的 9000 端口运行的是 PHP-FPM 服务,仅支持 FastCGI 协议,不支持 HTTP 协议,配置本身存在逻辑错误。 - Traefik 路由多后端冲突:交替出现正常/报错的最典型诱因是同一条 Traefik 路由绑定了多个后端服务,流量按负载均衡策略轮询分发到不同容器,其中一个容器配置正常,另一个配置错误/版本不匹配。
排查解决步骤
第一步:修复 Nginx 配置错误
api 域名的 / 路径下不需要配置反向代理到 PHP-FPM 端口,删掉所有 proxy_ 开头的冗余配置,修改后如下:
location / { try_files $uri /index.php?$query_string; proxy_cache_bypass $http_upgrade; gzip_static on; }
修改配置后重启 Nginx 容器:
docker restart tef-nginx
第二步:排查 Traefik 多后端问题
- 检查当前运行的容器,确认是否有冗余的同业务 Nginx/PHP 容器:
docker ps | grep tef
如果存在多余的旧版本容器,直接删除:
docker rm -f <旧容器ID>
- 确认 Traefik 路由绑定的后端数量:
访问 Traefik 自带的 Dashboard,查看tefm-nginx路由器对应的Service下的后端实例,确认仅存在一个tef-nginx容器实例。如果存在多个实例,清理旧容器后刷新 Traefik 配置即可。
第三步:验证 PHP 路径与权限
如果上述步骤执行后仍存在 Primary script unknown 报错,验证路径与权限配置:
- 确认 PHP 容器内存在入口文件:
docker exec tefm-app ls /usr/share/nginx/html/webapp/public/index.php
如果返回文件不存在,检查 docker-compose 中 app 服务的 volumes 挂载配置是否正确。
2. 确认 PHP-FPM 运行用户有文件读取权限:
# 查看PHP-FPM运行用户 docker exec tefm-app ps aux | grep php-fpm # 查看文件权限 docker exec tefm-app ls -l /usr/share/nginx/html/webapp/public/index.php
如果权限不匹配,修改文件权限或者调整 PHP-FPM 运行用户即可。
内容的提问来源于stack exchange,提问作者Neto Braghetto
相关产品推荐
相关产品推荐

