无需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"
验证步骤
- 启动容器后,进入Nginx容器执行
curl php-service:9000(替换为实际服务名),检查网络连通性 - 查看PHP-FPM日志:
docker logs php-container-name,排查进程启动错误或权限报错 - 查看Nginx日志:
docker logs nginx-container-name,定位502对应的具体错误(如连接超时、文件权限不足)
内容的提问来源于stack exchange,提问作者Daud Ch
相关产品推荐
相关产品推荐

