Docker Compose环境下Nginx与php-fpm连接被拒绝问题求助
解决Docker Compose中Nginx+php-fpm的502 Bad Gateway问题
访问localhost:8080时Nginx返回502 - Bad Gateway,对应的错误日志如下:
2023/03/10 12:52:54 [error] 31#31: *10 connect() failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://172.19.0.4:9000", host: "localhost:8080", referrer: "http://localhost:8080/index.php"
相关配置文件
NGINX配置文件(default.conf)
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; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass app:9000; proxy_set_header X-Forwarded-For $remote_addr; include fastcgi_params; fastcgi_param REQUEST_METHOD $request_method; 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; proxy_set_header Host $http_host; } }
php-fpm应用Dockerfile
FROM php:7.4-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 # 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-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ 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 # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]
Docker-compose.yaml
version: '3' services: #PHP Service app: build: context: . dockerfile: dockerfile image: php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www networks: - app-network volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini depends_on: - webserver #Nginx Service webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "8080:80" networks: - app-network volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ #MySQL Service db: image: mariadb container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql - ./my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker Networks networks: app-network: driver: bridge #Volumes volumes: dbdata: driver: local
解决方案建议
- 修正容器启动依赖顺序:当前
app服务依赖webserver启动,但实际应该是Nginx依赖php-fpm服务才能正常转发请求。修改docker-compose.yaml:移除app服务下的depends_on: - webserver,给webserver服务添加depends_on: [app],确保php-fpm先启动完成后再启动Nginx。 - 确认php-fpm监听端口配置:进入php容器执行
docker exec -it app bash,然后用netstat -tulpn | grep 9000检查php-fpm是否监听在0.0.0.0:9000(而非仅127.0.0.1,否则容器间无法通信)。若监听地址不对,检查/usr/local/etc/php-fpm.d/www.conf中的listen参数,修改为listen = 9000或listen = 0.0.0.0:9000。 - 统一文件权限:Nginx Alpine镜像默认运行用户是
nginx,php容器运行用户是www(UID 1000)。要么给宿主机项目目录设置权限chown -R 1000:1000 ./,要么在docker-compose.yaml的webserver服务中添加user: "1000:1000",让Nginx以相同用户运行,避免php无法读取脚本文件。 - 清理重建容器:清理现有容器和缓存,执行
docker-compose down -v删除容器和卷,然后docker-compose build --no-cache重新构建镜像,最后docker-compose up -d启动服务。 - 优化Nginx fastcgi配置:在
location ~ \.php$块中,proxy_set_header是用于反向代理的配置,fastcgi场景下不需要,删除proxy_set_header X-Forwarded-For $remote_addr;这一行,避免干扰fastcgi通信逻辑。
内容的提问来源于stack exchange,提问作者Luca Pisoni
相关产品推荐
相关产品推荐

