You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署PHP7-fpm与Nginx生产环境无法访问故障问询

故障排查结果

以下是配置中存在的问题及对应修复方案:

  • Nginx配置规则不全:现有配置仅对.php后缀的请求做了FastCGI转发,没有配置根路径匹配、静态文件处理规则,直接访问站点根目录或静态资源会直接返回404。
  • 容器存在异常重启:从docker ps输出可见两个容器创建于27分钟前,但实际运行时长仅16秒,属于典型的崩溃重启循环。你看到的"日志无异常"只是当前次启动的暂态输出,没有捕获到之前进程崩溃的报错信息。
  • 挂载目录权限风险:如果宿主机是开启SELinux的RHEL/CentOS/Rocky等发行版,或者../company/site目录权限配置过严,容器内Nginx(运行用户UID为101)、PHP-FPM(运行用户UID为33)没有目录读取权限,会导致请求返回403,甚至进程启动失败反复重启。
  • 访问匹配存在隐患:配置中server_name仅填写了example.com,如果你直接用服务器IP+8080端口访问,未携带对应Host请求头,部分Nginx版本会出现虚拟主机匹配异常。
  • 网络访问层可能未放通:如果本地curl测试正常但外部无法访问,大概率是服务器防火墙、云平台安全组没有开放8080端口的入站规则,这是生产环境最常见的访问不通诱因。
修复操作步骤
  1. 修正docker-compose.prod.yml配置
    固定镜像版本避免latest标签带来的不可预期兼容问题,补充显式网络配置、重启策略、SELinux适配标签,调整后配置如下:
version: '3.8'
services:
  web:
    image: nginx:1.25-alpine
    ports:
      - "8080:80"
    volumes:
      - ../company/site:/code:z
      - ./site.prod.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    restart: always
    networks:
      - site-net

  php:
    image: php:7.4-fpm-alpine
    volumes:
      - ../company/site:/code:z
    restart: always
    networks:
      - site-net

networks:
  site-net:
    driver: bridge

说明:挂载参数末尾的:z用于适配SELinux环境,自动给目录打容器可访问的标签;配置文件挂载加:ro设为只读,避免容器内进程误改配置。原php:7-fpm镜像已停止官方维护,存在已知兼容漏洞,固定使用7.4稳定版更可靠。

  1. 修正Nginx站点配置site.prod.conf
    补全根路径转发、静态文件处理规则,标记为默认虚拟主机避免Host匹配问题,临时开启debug日志方便定位问题,调整后配置如下:
server {
    listen 80 default_server;
    index index.php index.html;
    server_name example.com _;
    error_log  /var/log/nginx/error.log debug;
    access_log /var/log/nginx/access.log;
    root /code;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_connect_timeout 300;
            fastcgi_send_timeout 300;
            fastcgi_read_timeout 300;
        }
}
  1. 调整宿主机目录权限
    执行以下命令给容器运行用户开放站点目录读取权限,生产环境可按需收紧权限:
chmod -R 755 ../company/site
# 生产环境建议把目录属主调整为对应运行用户,避免权限过宽
# chown -R 33:101 ../company/site
  1. 重启服务并校验状态
# 停止旧服务
docker compose -f docker-compose.prod.yml down
# 后台启动新服务
docker compose -f docker-compose.prod.yml up -d
# 查看服务日志确认无报错
docker logs --tail 100 example_code-web-1
docker logs --tail 100 example_code-php-1
# 服务器本地测试访问
curl -v http://127.0.0.1:8080

如果本地curl返回正常内容但外部访问不通,直接检查服务器防火墙、云安全组是否放通8080端口入站规则即可。

内容的提问来源于stack exchange,提问作者ViaTech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:48:22