自定义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
相关产品推荐
相关产品推荐

