Docker部署Laravel项目出现Nginx 502 Bad Gateway问题求助
Laravel Docker化后Nginx 502 Bad Gateway问题排查
MySQL、phpMyAdmin、Redis服务均正常运行,但浏览器访问项目时出现Nginx 502错误,错误日志显示无法连接到PHP-FPM服务。以下是相关配置文件及日志:
docker-compose.yml
version: '2.4' services: #PHP Service app: build: context: . dockerfile: Dockerfile image: ${APP_NAME}_app container_name: ${APP_NAME}_app restart: unless-stopped tty: true environment: SERVICE_NAME: ${APP_NAME} SERVICE_TAGS: ${APP_ENV} CONTAINER_ROLE: app working_dir: /var/www volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network #Nginx Service webserver: image: nginx:1.22 # platform: linux/arm64/v8 container_name: ${APP_NAME}_webserver restart: unless-stopped tty: true ports: - "8080:80" - "443:443" volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL Service db: image: mysql:latest # platform: linux/arm64/v8 container_name: ${APP_NAME}_db restart: unless-stopped tty: true ports: - "3307:3306" environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} SERVICE_TAGS: ${APP_ENV} SERVICE_NAME: ${DB_DATABASE} volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Phpmyadmin Service phpmyadmin: image: phpmyadmin:latest # platform: linux/arm64/v8 container_name: ${APP_NAME}_phpmyadmin restart: always links: - db depends_on: - db ports: - "8081:80" environment: - PMA_ARBITRARY=1 - PMA_HOST=${APP_NAME}_db - PMA_PORT=3306 - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} networks: - app-network #Redis Service redis: image: redis:latest # platform: linux/arm64/v8 container_name: ${APP_NAME}_redis command: redis-server --appendonly yes --requirepass "${REDIS_PASSWORD}" ports: - "6380:6379" #Queue Service queue: build: context: . args: - APP_ENV=${APP_ENV} environment: - APP_ENV=${APP_ENV} - CONTAINER_ROLE=queue container_name: ${APP_NAME}_queue working_dir: /var/www volumes: - ./:/var/www #Docker Networks networks: app-network: driver: bridge #Volumes volumes: dbdata: driver: local
Nginx配置文件
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } }
Dockerfile
FROM php:8.1-fpm # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www/ # Set working directory WORKDIR /var/www # Install 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 \ libzip-dev \ libonig-dev # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install extensions RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install gd # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Add user for laravel application RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www # Copy existing application directory contents COPY . /var/www # Copy existing application directory permissions COPY --chown=www:www . /var/www # Change current user to www USER www ENTRYPOINT [ "./entrypoint.sh" ] # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]
错误日志
2022/10/20 20:27:46 [error] 22#22: *6 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.112.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://192.168.112.2:9000", host: "localhost:8080" 192.168.112.1 - - [20/Oct/2022:20:27:46 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" 192.168.112.1 - - [20/Oct/2022:20:27:46 +0000] "GET /favicon.ico HTTP/1.1" 304 0 "http://localhost:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
排查与解决步骤
1. 检查PHP-FPM容器运行状态
执行命令查看app容器状态:
docker-compose ps app
若容器未启动或异常,查看容器日志定位问题:
docker-compose logs app
2. 验证entrypoint.sh脚本逻辑
Dockerfile中设置了ENTRYPOINT指向./entrypoint.sh,该脚本可能阻断了php-fpm的启动:
- 确认脚本存在且有执行权限
- 确保脚本最后执行
php-fpm,若脚本用于初始化任务,需保证完成后启动php-fpm - 可临时注释Dockerfile中的
ENTRYPOINT行,重新构建镜像并启动容器,测试是否恢复正常
3. 检查PHP-FPM端口监听状态
进入app容器,确认9000端口是否被监听:
docker-compose exec app bash netstat -tulpn | grep 9000
若端口未监听,检查php-fpm配置文件(通常为/usr/local/etc/php-fpm.d/www.conf)中的listen参数是否设置为9000,而非socket路径。
4. 验证容器网络连通性
在webserver容器中测试到app:9000的连通性:
docker-compose exec webserver bash curl -v app:9000
若连接失败,确认两个容器都加入了app-network网络(查看docker-compose ps的NETWORK列)。
5. 修复Laravel目录权限
Laravel的storage和bootstrap/cache目录需要写入权限,本地挂载目录的权限可能与容器内用户冲突:
- 宿主机执行权限修复:
chown -R 1000:1000 storage bootstrap/cache
- 或在
entrypoint.sh中添加权限修复命令:
chmod -R 775 storage bootstrap/cache chown -R www:www storage bootstrap/cache
内容的提问来源于stack exchange,提问作者Amir Salehi
相关产品推荐
相关产品推荐

