使用 docker 部署 nginx 和 PHP 遇到 502 报错

问题:

我在使用docker 部署php 环境, 访问 .php文件时,报502 错误。

目前的现状:

  • 访问.php 后缀的文件,均报502错误,并有以下错误日志

    connect() failed (111: Connection refused) while connecting to upstream

  • 访问.html后缀的文件, 正常输出页面
  • 在启动的php容器里,执行 php index.php, 正常输出内容

我的环境和执行脚本:

  • docker-compose.yml

    services :
    php:
      image: 'php:7.2.5-fpm'
      container_name: php
      volumes:
        - ~/nginx/www:/www
        - ~/nginx/php-db.sh:/nginx/php-db.sh
      tty: true
      ports:
        - "9000:9000"
      entrypoint:
        - /bin/bash
        - /nginx/php-db.sh
      networks:
        - laravel
    nginx:
      image: 'nginx'
      container_name: nginx
      ports:
        - "80:80"
      volumes:
        - ~/nginx/www:/usr/share/nginx/html
        - ~/nginx/conf.d:/etc/nginx/conf.d
      depends_on:
        - php
      networks:
        - laravel
    networks:
      laravel:
  • nginx 相关的配置文件

    server {
          listen 80;
          server_name api.laravel.test;
    
          root /usr/share/nginx/html/app/public;
    
          index index.php index.html index.htm;
    
          charset utf-8;
    
          location / {
                  try_files $uri $uri/ /index.php?$query_string;
          }
    
          location = /favicon.ico {access_log off; log_not_found off;}
          location = /robots.txt {access_log off; log_not_found off;}
    
          error_page 404 /index.php;
    
          location ~ \.php$ {
                  fastcgi_pass  php:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME /www/app/public/$fastcgi_script_name;
                  include        fastcgi_params;
          }
    
          location ~/\.(?!well-know).*{
                  deny all;
          }
    }

    求助:

    希望有了解的朋友,可以给我一些思路和排查方法

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 28
circle

访问 502 页面

docker logs (项目名称)_nginx_1 --tail 10检查 log 中 upstream:地址是否与

docker-compose exec nginx ping php 中的地址一致,若不一致,重启 nginx 容器

docker-compose restart nginx

5年前 评论

php容器的项目目录和nginx容器的项目目录改成一致的试试

5年前 评论
matteao (楼主) 5年前

不確定你的發行版,如果在非 Docker 環境下這個狀況可能是 SELinux 把連線擋掉。

近期幾個發行版中,安裝 Docker 的時候都會自動把 SELinux Policy 建進去,理論上會沒有問題。

5年前 评论
lol173

问题的根源应该是nginx容器跟php容器的IP没对应上,上面有兄弟指出来了。 我的解决办法是

docker compose restart php nginx 

先启动PHP,后启动nignx,让nginx可以找到php的IP

1年前 评论

老铁, 问题解决了吗?我也是排查半天没找到原因所在啊

5年前 评论

@all ,因为时间的问题和自己对docker 理解还需要深入,我暂时一个容器,一个容器手动启动了,没有用 docker-compose 。等项目稳定了,我会继续反馈这个问题的解决方案。也希望大家继续给予指导,我会及时反馈效果

5年前 评论

分享下我这个 dnmp,简单都能看懂。只装需要的扩展。 php容器再 dockerfile 中,里面有些python 啥的如果不用,直接注释那行就行了

github.com/839891627/dnpm

5年前 评论

github.com/snowlyg/dnmp 其实有写好的直接用就好了,如果是想学习 docker 配置也可以参考。

5年前 评论
matteao (楼主) 5年前

@振翅飞翔

  • entrypoint 脚本 php-db.sh file

我推测也是 php-fpm 没起来, 可是我把脚本禁掉, 也不行啊,还是502 。 能不能再给我个思路

5年前 评论
振翅飞翔 5年前
matteao (作者) (楼主) 5年前

nginx能访问到php吗?在nginx容器里面ping一下php容器试试

5年前 评论

@振翅飞翔

  • telnet php 9000 拒绝连接

file

  • ping php 9000 可以通

file

5年前 评论
振翅飞翔 5年前
fastcgi_param  SCRIPT_FILENAME /www/app/public/$fastcgi_script_name;

你的脚本文件请求的路径和你的项目root不一样,为什么不用这个:

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
5年前 评论
matteao (楼主) 5年前
wifi (作者) 5年前
matteao (楼主) 5年前

php 那里你写了 entrypoint,你看 entrypoint 怎么写的,telnet php 9000 试试

5年前 评论

nginx 配置加上 include enable-php-pathinfo.conf;

5年前 评论

@daijunooo 在 nginx 容器中 ping php 容器,是可以 ping 通的。

file

5年前 评论

我觉得应该是你nginx容器访问不到php容器的问题,你可以参考一下以下yaml配置文件,PHP容器是我自己build的,其他的基本都差不多 :flushed:

# 指定本yml依赖docker-compose的哪个版本制定的
version: '3.3'
# 服务容器
services:
  # Nginx容器配置
  nginx:
    # 使用镜像文件
    image: nginx:latest
    # 容器名称
    container_name: nginx
    # 映射端口
    ports:
      - 80:80
    # 链接到php-fpm
    links:
      - php7.3
    # 需要挂载的目录
    volumes:
      # Nginx虚拟主机配置文件
      - D:\docker-compose\nginx\conf.d:/etc/nginx/conf.d
      # Nginx配置文件
      - D:\docker-compose\nginx\nginx.conf:/etc/nginx/nginx.conf
      # Nginx日志文件
      - D:\docker-compose\nginx\logs:/var/log/nginx
      # 项目目录
      - D:\docker-compose\www:/var/www
    # 设置依赖关系
    depends_on:
      - php7.3

  # MySQL容器配置
  mysql5.7:
    # 使用镜像文件
    image: mysql:5.7
    # 容器名称
    container_name: mysql
    # 端口映射
    ports:
      - 3306:3306
    # 设置MySQL的root用户密码
    environment:
      - MYSQL_ROOT_PASSWORD=root
    # 重启服务
    restart: always
    # 挂载文件
    volumes:
      # 挂载MySQL存储文件
      - D:\docker-compose\mysql\mysql-data:/var/lib/mysql
      # 需要手动开启日志文件记录
      # 笔记地址:http://note.youdao.com/noteshare?id=90d92b0bc877584c78b6c32d9aa93605&sub=01FA3A13A3A9427EA223A0F87ACFD414
      # 挂载MySQL日志文件
      - D:\docker-compose\mysql\log:/var/log/mysql

  # PHP容器配置
  php7.3:
    # 使用镜像文件
    image: php7.3:1.4
    # 容器名称
    container_name: php
    # 挂载文件
    volumes:
      - D:\docker-compose\www:/var/www
    # 暴露的端口
    expose:
      - "9000"
    # 链接到MySQL容器
    links:
      - mysql5.7
    # 设置依赖关系
    depends_on:
      - mysql5.7
5年前 评论
matteao (楼主) 5年前
犯二青年 (作者) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!