Docker部署Laravel项目Nginx返回502连接被拒绝问题求助
问题原因与解决方案
核心问题根源
当前配置的核心冲突是:
- Nginx配置中尝试通过FastCGI协议转发PHP请求到
app:9000,这是php-fpm服务的默认监听端口 - 但你的PHP容器实际启动的是Laravel自带的Artisan内置服务器,监听的是8000端口,且未启用php-fpm服务,9000端口完全没有进程监听,自然会返回连接拒绝的502错误。
推荐解决方案(生产可用标准架构:Nginx + php-fpm)
步骤1:修改PHP Dockerfile
替换原Dockerfile内容如下,使用带fpm的官方PHP镜像,移除Artisan启动命令:
# 替换基础镜像为fpm版本 FROM php:7.4-fpm # Install system dependencies RUN apt-get update && apt-get install -y \ git \ curl \ zip \ unzip \ libpng-dev \ libonig-dev \ libxml2-dev # 安装Laravel required PHP扩展 RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Get latest Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /var/www COPY database/ database/ COPY composer.json composer.json RUN composer install \ --no-interaction \ --no-plugins \ --no-scripts \ --no-dev \ --prefer-dist COPY . . RUN composer dump-autoload RUN php artisan optimize:clear # 给Laravel目录设置正确权限 RUN chown -R www-data:www-data /var/www \ && chmod -R 775 /var/www/storage /var/www/bootstrap/cache # php-fpm镜像默认启动命令就是fpm,无需额外指定,监听9000端口 EXPOSE 9000
步骤2:验证配置生效
重新构建镜像并启动容器:
docker-compose down docker-compose build app docker-compose up -d
故障排查验证
如果仍有问题可按以下步骤排查:
- 查看Nginx错误日志确认报错信息:
docker logs rating-nginx - 进入PHP容器确认9000端口监听:
docker exec rating-app ss -tunlp | grep 9000 - 确认Nginx容器可连通PHP容器:
docker exec rating-nginx ping app
临时测试方案(仅本地开发用,不推荐生产)
如果你不想使用php-fpm,只想保留Artisan内置服务器,可修改Nginx配置替换所有location规则为反向代理:
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; location / { proxy_pass http://app:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
内容的提问来源于stack exchange,提问作者Alireza Amrollahi
相关产品推荐
相关产品推荐

