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

Docker部署Laravel项目出现Nginx 502 Bad Gateway问题求助

Laravel Docker化后Nginx 502 Bad Gateway问题排查

MySQL、phpMyAdmin、Redis服务均正常运行,但浏览器访问项目时出现Nginx 502错误,错误日志显示无法连接到PHP-FPM服务。以下是相关配置文件及日志:

docker-compose.yml

version: '2.4'
services:

    #PHP Service
    app:
        build:
            context: .
            dockerfile: Dockerfile
        image: ${APP_NAME}_app
        container_name: ${APP_NAME}_app
        restart: unless-stopped
        tty: true
        environment:
            SERVICE_NAME: ${APP_NAME}
            SERVICE_TAGS: ${APP_ENV}
            CONTAINER_ROLE: app
        working_dir: /var/www
        volumes:
            - ./:/var/www
            - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
        networks:
            - app-network

    #Nginx Service
    webserver:
        image: nginx:1.22
        #        platform: linux/arm64/v8
        container_name: ${APP_NAME}_webserver
        restart: unless-stopped
        tty: true
        ports:
            - "8080:80"
            - "443:443"
        volumes:
            - ./:/var/www
            - ./nginx/conf.d/:/etc/nginx/conf.d/
        networks:
            - app-network

    #MySQL Service
    db:
        image: mysql:latest
        #        platform: linux/arm64/v8
        container_name: ${APP_NAME}_db
        restart: unless-stopped
        tty: true
        ports:
            - "3307:3306"
        environment:
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_USER: ${DB_USERNAME}
            MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
            SERVICE_TAGS: ${APP_ENV}
            SERVICE_NAME: ${DB_DATABASE}
        volumes:
            - dbdata:/var/lib/mysql/
            - ./mysql/my.cnf:/etc/mysql/my.cnf
        networks:
            - app-network

    #Phpmyadmin Service
    phpmyadmin:
        image: phpmyadmin:latest
        #        platform: linux/arm64/v8
        container_name: ${APP_NAME}_phpmyadmin
        restart: always
        links:
            - db
        depends_on:
            - db
        ports:
            - "8081:80"
        environment:
            - PMA_ARBITRARY=1
            - PMA_HOST=${APP_NAME}_db
            - PMA_PORT=3306
            - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
        networks:
            - app-network

    #Redis Service
    redis:
        image: redis:latest
        #        platform: linux/arm64/v8
        container_name: ${APP_NAME}_redis
        command: redis-server --appendonly yes --requirepass "${REDIS_PASSWORD}"
        ports:
            - "6380:6379"

    #Queue Service
    queue:
        build:
            context: .
            args:
                - APP_ENV=${APP_ENV}
        environment:
            - APP_ENV=${APP_ENV}
            - CONTAINER_ROLE=queue
        container_name: ${APP_NAME}_queue
        working_dir: /var/www
        volumes:
            - ./:/var/www

#Docker Networks
networks:
    app-network:
        driver: bridge
#Volumes
volumes:
    dbdata:
        driver: local

Nginx配置文件

server
{
    listen 80;
    index index.php index.html;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$
    {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location /
    {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

Dockerfile

FROM php:8.1-fpm

# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/

# Set working directory
WORKDIR /var/www

# Install dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl \
    libzip-dev \
    libonig-dev

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www

# Copy existing application directory contents
COPY . /var/www

# Copy existing application directory permissions
COPY --chown=www:www . /var/www

# Change current user to www
USER www

ENTRYPOINT [ "./entrypoint.sh" ]

# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]

错误日志

2022/10/20 20:27:46 [error] 22#22: *6 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.112.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://192.168.112.2:9000", host: "localhost:8080"
192.168.112.1 - - [20/Oct/2022:20:27:46 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
192.168.112.1 - - [20/Oct/2022:20:27:46 +0000] "GET /favicon.ico HTTP/1.1" 304 0 "http://localhost:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"

排查与解决步骤

1. 检查PHP-FPM容器运行状态

执行命令查看app容器状态:

docker-compose ps app

若容器未启动或异常,查看容器日志定位问题:

docker-compose logs app

2. 验证entrypoint.sh脚本逻辑

Dockerfile中设置了ENTRYPOINT指向./entrypoint.sh,该脚本可能阻断了php-fpm的启动:

  • 确认脚本存在且有执行权限
  • 确保脚本最后执行php-fpm,若脚本用于初始化任务,需保证完成后启动php-fpm
  • 可临时注释Dockerfile中的ENTRYPOINT行,重新构建镜像并启动容器,测试是否恢复正常

3. 检查PHP-FPM端口监听状态

进入app容器,确认9000端口是否被监听:

docker-compose exec app bash
netstat -tulpn | grep 9000

若端口未监听,检查php-fpm配置文件(通常为/usr/local/etc/php-fpm.d/www.conf)中的listen参数是否设置为9000,而非socket路径。

4. 验证容器网络连通性

在webserver容器中测试到app:9000的连通性:

docker-compose exec webserver bash
curl -v app:9000

若连接失败,确认两个容器都加入了app-network网络(查看docker-compose ps的NETWORK列)。

5. 修复Laravel目录权限

Laravel的storage和bootstrap/cache目录需要写入权限,本地挂载目录的权限可能与容器内用户冲突:

  • 宿主机执行权限修复:
chown -R 1000:1000 storage bootstrap/cache
  • 或在entrypoint.sh中添加权限修复命令:
chmod -R 775 storage bootstrap/cache
chown -R www:www storage bootstrap/cache

内容的提问来源于stack exchange,提问作者Amir Salehi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:56:07