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

无需Laravel开发服务器运行PHP-Laravel应用:502报错求助

解决方案:Laravel + PHP-FPM + Nginx 502 Bad Gateway 问题排查与修复

核心问题排查与修复

1. PHP-FPM 监听地址配置错误

默认php:8.0-fpm-alpine的PHP-FPM配置(/usr/local/etc/php-fpm.d/www.conf)中,listen参数默认是127.0.0.1:9000,仅监听容器内部回环地址,导致Nginx容器无法访问。

修复方式:
在Dockerfile中添加修改监听地址的命令:

RUN sed -i 's/listen = 127.0.0.1:9000/listen = 0.0.0.0:9000/' /usr/local/etc/php-fpm.d/www.conf

2. Nginx 配置修正

常见错误点:

  • root未指向Laravel的public目录(Laravel入口文件位于此目录)
  • fastcgi_pass地址错误(未使用PHP容器的服务名/K8s Service名)
  • 缺少Laravel必需的FastCGI参数

修正后的nginx.conf示例:

server {
    listen 80;
    server_name my-domain;

    # 必须指向Laravel的public目录
    root /app/public;
    index index.php index.html;

    location /myapi/ {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        # Docker Compose环境填PHP服务名(如php-service:9000);K8s环境填对应Service名(如laravel-php-svc:9000)
        fastcgi_pass php-service:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Laravel运行必需参数
        fastcgi_param APP_ENV production;
        fastcgi_param APP_KEY your-app-key-here;
    }
}

3. Laravel 文件权限修复

PHP-FPM进程默认使用www-data用户,需确保Laravel的storage和bootstrap/cache目录有读写权限,否则会因无法生成缓存/日志导致502。

Dockerfile中添加权限配置:

RUN chown -R www-data:www-data /app/storage /app/bootstrap/cache
RUN chmod -R 775 /app/storage /app/bootstrap/cache

4. 优化后的完整Dockerfile示例

FROM php:8.0-fpm-alpine

# 安装Laravel依赖的PHP扩展
RUN docker-php-ext-install pdo_mysql

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

# 设置工作目录
WORKDIR /app

# 复制项目代码
COPY . .

# 安装生产环境依赖
RUN composer install --no-dev --optimize-autoloader

# 修改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

# 设置Laravel目录权限
RUN chown -R www-data:www-data /app/storage /app/bootstrap/cache
RUN chmod -R 775 /app/storage /app/bootstrap/cache

# 启动PHP-FPM
CMD ["php-fpm"]

Kubernetes 环境适配配置

1. PHP Service 配置

确保K8s中PHP Deployment对应的Service监听9000端口:

apiVersion: v1
kind: Service
metadata:
  name: laravel-php-svc
spec:
  selector:
    app: laravel-php
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000

2. Nginx Ingress 配置(Nginx Ingress Controller)

方式1:Ingress 对接独立Nginx容器

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: laravel-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - host: my-domain
      http:
        paths:
          - path: /myapi(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: nginx-svc
                port:
                  number: 80

方式2:Ingress 直接对接PHP-FPM(需FastCGI支持)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: laravel-php-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "FCGI"
    nginx.ingress.kubernetes.io/fastcgi-index: "index.php"
    nginx.ingress.kubernetes.io/fastcgi-params-configmap: "laravel-fastcgi-params"
spec:
  rules:
    - host: my-domain
      http:
        paths:
          - path: /myapi
            pathType: Prefix
            backend:
              service:
                name: laravel-php-svc
                port:
                  number: 9000

对应FastCGI参数ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: laravel-fastcgi-params
data:
  SCRIPT_FILENAME: "/app/public/index.php$is_args$args"
  APP_ENV: "production"
  APP_KEY: "your-app-key-here"

验证步骤

  1. 启动容器后,进入Nginx容器执行curl php-service:9000(替换为实际服务名),检查网络连通性
  2. 查看PHP-FPM日志:docker logs php-container-name,排查进程启动错误或权限报错
  3. 查看Nginx日志:docker logs nginx-container-name,定位502对应的具体错误(如连接超时、文件权限不足)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:25:18