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

自定义PHP-FPM容器与Nginx连接报502错误求助

问题:自定义Alpine PHP-FPM容器导致Nginx 502 Bad Gateway

基于Alpine制作Nginx和PHP-FPM自定义镜像并部署容器后,访问PHP文件时Nginx返回502错误,错误日志显示连接上游172.30.0.3:9000被拒绝。使用Docker Hub官方php:fpm-alpine镜像则正常,所有容器共享同一网络和卷。

Nginx错误日志

2024/04/16 15:28:29 [error] 25#25: *16 connect() failed (111: Connection refused) while connecting to upstream, client: 172.30.0.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://172.30.0.3:9000", host: "localhost:8000"

相关配置文件与镜像定义

Nginx Dockerfile

FROM alpine:3.19

RUN apk upgrade && apk update
RUN apk add nginx && apk add openssl

RUN mkdir /var/www/html

COPY ./default.conf /etc/nginx/http.d/

CMD nginx -g "daemon off;"

EXPOSE 80

Nginx default.conf

server {
    listen 80;

    root /var/www/html;

    index index.php index.html;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;

        try_files $uri =404;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

}

自定义PHP-FPM Dockerfile

FROM alpine:3.19

RUN apk upgrade && apk update
RUN apk add curl php83 php83-phar php83-fpm
RUN mkdir -p /var/www/html/

CMD php-fpm83 -F

EXPOSE 9000

docker-compose.yml

version: "3.8"

services:
  nginx:
    image: my-nginx
    build:
      context: ./nginx/
    container_name: nginx
    ports:
      - 8000:80
    networks:
      - net
    volumes:
      - ./index.php:/var/www/html/index.php

  php-fpm:
    image: php:fpm-alpine
    container_name: php-fpm
    ports:
      - 9000
    networks:
      - net
    volumes:
      - ./index.php:/var/www/html/index.php

  my-php-fpm:
    image: my-php-fpm
    build:
      context: ./my-php-fpm/
    container_name: my-php-fpm
    ports:
      - 9000
    networks:
      - net
    volumes:
      - ./index.php:/var/www/html/index.php

networks:
  net:

index.php

<?php echo phpinfo();?>

目录结构

test
├── docker-compose.yml
├── index.php
├── my-php-fpm
│   └── Dockerfile
└── nginx
    ├── Dockerfile
    └── default.conf

排查与解决方案

1. 服务名映射错误

当前Nginx配置中fastcgi_pass php-fpm:9000指向的是官方PHP-FPM容器的服务名。若要使用自定义的my-php-fpm容器,二选一修改:

  • 修改Nginx的default.conf,将fastcgi_pass改为my-php-fpm:9000
  • 调整docker-compose中自定义PHP-FPM的服务名为php-fpm

2. PHP-FPM监听地址限制

Alpine中php83-fpm默认监听127.0.0.1:9000,仅允许容器内部访问,需修改为监听所有地址:
在自定义PHP-FPM的Dockerfile中添加:

RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /etc/php83/php-fpm.d/www.conf

3. 验证容器状态与连通性

  • 查看自定义PHP-FPM容器启动日志:docker logs my-php-fpm,确认服务是否正常启动
  • 进入Nginx容器测试网络连通:docker exec -it nginx ping my-php-fpm
  • 测试端口开放情况:docker exec -it nginx telnet my-php-fpm 9000

4. 文件权限问题

确保PHP-FPM运行用户(默认nobody)能访问网站目录,在自定义PHP-FPM的Dockerfile中添加:

RUN chown -R nobody:nobody /var/www/html

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:05:12