使用 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;
          }
    }

    求助:

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16

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

3年前 评论

我觉得应该是你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
3年前 评论
matteao (楼主) 3年前
犯二青年 (作者) 3年前

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

file

3年前 评论

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

3年前 评论

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

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

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

3年前 评论
fastcgi_param  SCRIPT_FILENAME /www/app/public/$fastcgi_script_name;

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

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

@振翅飞翔

  • telnet php 9000 拒绝连接

file

  • ping php 9000 可以通

file

3年前 评论
振翅飞翔 3年前

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

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

3年前 评论

@振翅飞翔

  • entrypoint 脚本 php-db.sh file

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

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

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

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

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

github.com/839891627/dnpm

3年前 评论

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

3年前 评论

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

3年前 评论
circle

访问 502 页面

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

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

docker-compose restart nginx

3年前 评论

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