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

Laravel容器化后Nginx反向代理502及配置文件异常问题求助

解决Laravel容器化部署的502错误及Nginx容器路径问题

一、宿主机Nginx+Laravel容器的502 Bad Gateway错误解决

排查与修复步骤

  • 检查Laravel容器状态:
    执行docker ps确认容器是否正常运行,若容器未启动,用docker logs <laravel-container-id>查看日志,排查依赖缺失、环境变量错误(如APP_KEY未设置)、storage/bootstrap/cache目录权限问题。
  • 修正PHP-FPM监听地址:
    Laravel容器内PHP-FPM默认监听127.0.0.1:9000,宿主机无法访问。需修改/usr/local/etc/php-fpm.d/www.conf,将listen = 127.0.0.1:9000改为listen = 0.0.0.0:9000,可在Dockerfile中通过sed命令批量修改。
  • 调整Nginx上游配置:
    宿主机Nginx的fastcgi_pass需指向Laravel容器的可访问地址:
    • 端口映射模式:fastcgi_pass 127.0.0.1:9000;(确保容器启动时映射了9000端口)
    • Docker网络模式:给Laravel容器设置网络别名,Nginx配置中用别名+端口,如fastcgi_pass laravel-api:9000;

二、Nginx容器启动提示找不到fastcgi-php.conf的解决

排查与修复

  • 避免挂载覆盖容器文件:
    若docker-compose中将宿主机目录挂载到/etc/nginx/snippets,会覆盖容器自带的snippets目录导致文件丢失。需仅挂载自定义配置目录(如conf.d),而非整个snippets目录。
  • 检查路径引用正确性:
    确认Nginx站点配置中引用路径为绝对路径include /etc/nginx/snippets/fastcgi-php.conf;,无拼写错误。
  • 验证文件权限:
    进入Nginx容器执行ls -l /etc/nginx/snippets/fastcgi-php.conf,确认文件存在且权限为nginx用户可读(默认容器内权限正常,异常时可执行chmod 644 /etc/nginx/snippets/fastcgi-php.conf)。

三、完整容器化部署示例

1. Laravel Dockerfile(放置在API目录)

FROM php:8.2-fpm-alpine

# 安装系统依赖
RUN apk add --no-cache \
    curl \
    zip \
    unzip \
    git \
    oniguruma-dev \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev

# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# 复制项目文件
COPY . .

# 安装项目依赖
RUN composer install --no-dev --optimize-autoloader

# 设置目录权限
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

# 修改PHP-FPM监听地址
RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.d/www.conf

CMD ["php-fpm"]

2. docker-compose.yml(项目根目录)

version: '3.8'

services:
  laravel-api:
    build: ./API
    container_name: laravel-api
    restart: unless-stopped
    volumes:
      - ./API:/var/www/html
      - ./API/storage:/var/www/html/storage
      - ./API/bootstrap/cache:/var/www/html/bootstrap/cache
    networks:
      - speedcart-network
    environment:
      - APP_ENV=production
      - APP_KEY=your-app-key-here
      - DB_HOST=mysql # 若使用数据库服务,填写对应服务名
      - DB_DATABASE=speedcart
      - DB_USERNAME=root
      - DB_PASSWORD=your-db-password

  nginx:
    image: nginx:alpine
    container_name: speedcart-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./API:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      - speedcart-network
    depends_on:
      - laravel-api

networks:
  speedcart-network:
    driver: bridge

3. Nginx站点配置(放置在nginx/conf.d/api.speedcartapp.com.conf)

server {
    listen 80;
    server_name api.speedcartapp.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name api.speedcartapp.com;

    ssl_certificate /etc/nginx/ssl/api.speedcartapp.com.crt;
    ssl_certificate_key /etc/nginx/ssl/api.speedcartapp.com.key;

    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass laravel-api:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include /etc/nginx/snippets/fastcgi-php.conf;
        include fastcgi_params;
    }

    location ~ /\.env {
        deny all;
    }
}

4. 部署步骤

  1. 生成Laravel APP_KEY(若未设置):
    docker-compose exec laravel-api php artisan key:generate
    
  2. 启动容器:
    docker-compose up -d
    
  3. 验证服务状态:
    docker-compose ps
    
  4. 查看日志排查异常:
    docker-compose logs nginx
    docker-compose logs laravel-api
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:32:05