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. 部署步骤
- 生成Laravel APP_KEY(若未设置):
docker-compose exec laravel-api php artisan key:generate - 启动容器:
docker-compose up -d - 验证服务状态:
docker-compose ps - 查看日志排查异常:
docker-compose logs nginx docker-compose logs laravel-api
内容的提问来源于stack exchange,提问作者Velo
相关产品推荐
相关产品推荐

