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

Nginx配置下Laravel API POST请求返回502错误求助

Laravel API POST请求502 Bad Gateway排查与解决

问题现象

Laravel API部署在Docker环境中,GET请求可正常响应,但POST请求返回502 Bad Gateway错误。环境采用Nginx作为反向代理,PHP-FPM处理PHP请求。

环境配置

Nginx配置

server {
    listen 8080;
    server_name remote_addr;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/app/public;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;  # Changed to local PHP-FPM
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
    }
} 

docker-compose.yaml

version: '3.8'

services:
  # Landing service (Next.js)
  landing:
    build:
      context: ./landing
      dockerfile: Dockerfile
    container_name: landing_page
    ports:
      - "3002:3000"
    networks:
      - app-network

  # Chat service (Next.js )
  chat:
    build:
      context: ./chat
      dockerfile: Dockerfile
    container_name: chat_app
    ports:
      - "3001:3000"
    networks:
      - app-network

  # Go service (for go-chat)
  go-chat:
    build:
      context: ./go-chat
      dockerfile: Dockerfile
    container_name: go_chat
    ports:
      - "7070:7070"
    networks:
      - app-network

  # Laravel backend service
  php:
    build:
      context: ./backend  # Backend dizini
      dockerfile: Dockerfile
    container_name: laravel_backend
    restart: unless-stopped
    tty: true
    ports:
        - "9000:9000"
    volumes:
      - ./backend:/var/www/app:delegated  # Uygulama dosyalarını bağlama
    networks:
      - app-network
   
  # PostgreSQL service
  postgres:
    image: postgres:15
    container_name: postgres_db
    environment:
      POSTGRES_DB: "project"
      POSTGRES_USER: "user"
      POSTGRES_PASSWORD: "pass"
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network

  # Nginx service
  nginx:
    image: nginx:alpine
    container_name: nginx_proxy
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./backend:/var/www/app
      - ./nginx/conf.d/:/etc/nginx/conf.d/
    networks:
      - app-network
    depends_on:
      - chat
      - landing
      - php

networks:
  app-network:
    driver: bridge

volumes:
  postgres_data:

Laravel Dockerfile

# Base image
FROM php:8.2-fpm

# Install system 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 \
    libpq-dev \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo pdo_pgsql

# Set working directory
WORKDIR /var/www/app

# Copy application files
COPY . ./

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

# Install PHP dependencies
RUN composer install --no-dev --optimize-autoloader

# Set permissions
RUN chown -R www-data:www-data /var/www/app/storage /var/www/app/bootstrap/cache \
    && chmod -R 775 /var/www/app/storage /var/www/app/bootstrap/cache

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

排查与解决方案

1. 修复Nginx FastCGI配置

POST请求失败的常见原因是FastCGI参数干扰请求体解析,修改Nginx配置如下:

server {
    listen 80; # Docker映射8080:80,容器内监听80即可
    server_name _;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/app/public;

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

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # 移除PATH_INFO参数,Laravel不需要该参数,会干扰POST请求解析
        # 显式传递POST请求必需的Content参数(fastcgi_params通常已包含,此处确保生效)
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        # 延长FastCGI超时时间,避免大请求超时返回502
        fastcgi_connect_timeout 300s;
        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
    }
}

2. 确保PHP-FPM监听容器全局IP

默认PHP-FPM仅监听127.0.0.1:9000,容器间通信需要监听0.0.0.0:9000,修改Laravel Dockerfile:

# ... 原有内容 ...

# 修改PHP-FPM监听地址,允许容器外部访问
RUN echo "listen = 0.0.0.0:9000" >> /usr/local/etc/php-fpm.d/www.conf

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

3. 同步文件权限

Nginx和PHP容器共享挂载目录,确保宿主机与容器内权限一致:

# 在宿主机执行
chown -R www-data:www-data ./backend/storage ./backend/bootstrap/cache
chmod -R 775 ./backend/storage ./backend/bootstrap/cache

4. 验证容器网络连通性

在Nginx容器内测试与PHP容器的连通性:

# 测试ping
docker exec -it nginx_proxy ping php
# 测试端口连通
docker exec -it nginx_proxy telnet php 9000

如果端口不通,重启容器重建网络:

docker-compose down
docker-compose up -d --build

5. 查看日志定位具体错误

查看Nginx错误日志:

docker exec -it nginx_proxy tail -n 20 /var/log/nginx/error.log

添加PHP-FPM日志配置(可选):
在Laravel Dockerfile中添加:

RUN echo "error_log = /var/log/php-fpm.log" >> /usr/local/etc/php-fpm.conf
RUN touch /var/log/php-fpm.log && chown www-data:www-data /var/log/php-fpm.log

查看PHP-FPM日志:

docker exec -it laravel_backend tail -n 20 /var/log/php-fpm.log

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:02:02