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端口的入站规则,这是生产环境最常见的访问不通诱因。
修复操作步骤
- 修正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稳定版更可靠。
- 修正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; } }
- 调整宿主机目录权限
执行以下命令给容器运行用户开放站点目录读取权限,生产环境可按需收紧权限:
chmod -R 755 ../company/site # 生产环境建议把目录属主调整为对应运行用户,避免权限过宽 # chown -R 33:101 ../company/site
- 重启服务并校验状态
# 停止旧服务 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
相关产品推荐
相关产品推荐

