如何在Google Cloud Run的Docker环境中配置PHP FPM运行应用?
适配Google Cloud Run的PHP-FPM + Nginx Docker配置方案
直接替换php:apache为php:fpm后无法运行的核心原因是:PHP-FPM本身不是HTTP服务器,它只负责处理PHP代码执行,需要搭配Nginx这类反向代理服务器接收外部HTTP请求并转发给FPM处理。Cloud Run要求容器必须监听8080端口提供HTTP服务,下面是完整的配置步骤:
一、整理项目目录
先确保你的项目目录结构如下:
your-project/ ├── src/ # 存放你的PHP应用代码 │ ├── index.php │ └── ... ├── Dockerfile └── nginx.conf # Nginx自定义配置文件
二、编写Dockerfile
采用多阶段构建,兼顾镜像轻量化与环境完整性:
# 第一阶段:构建PHP-FPM运行环境 FROM php:8.2-fpm AS php-build # 安装应用所需的PHP扩展(按需添加,比如pdo_mysql、gd等) RUN docker-php-ext-install pdo_mysql # 设置工作目录 WORKDIR /var/www/html # 复制本地应用代码到容器内 COPY src/ . # 第二阶段:构建Nginx环境并整合FPM FROM nginx:alpine # 从第一阶段复制PHP代码到Nginx的网站根目录 COPY --from=php-build /var/www/html /var/www/html # 替换Nginx默认配置为自定义配置 COPY nginx.conf /etc/nginx/conf.d/default.conf # 暴露Cloud Run要求的8080端口 EXPOSE 8080 # 启动Nginx前台进程(Cloud Run要求容器运行前台进程) CMD ["nginx", "-g", "daemon off;"]
三、编写Nginx配置文件(nginx.conf)
重点配置反向代理规则,将HTTP请求转发给FPM处理:
server { listen 8080; server_name localhost; root /var/www/html; index index.php index.html; # 静态文件直接返回,无需经过FPM location / { try_files $uri $uri/ /index.php?$query_string; } # PHP请求转发至FPM的9000端口(FPM默认监听端口) location ~ \.php$ { fastcgi_pass php-build:9000; # 对应Dockerfile中第一阶段的镜像别名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
四、构建与部署到Cloud Run
- 构建Docker镜像(替换
gcr.io/your-project-id/php-fpm-app为你的GCP项目ID和自定义镜像名):
docker build -t gcr.io/your-project-id/php-fpm-app .
- 将镜像推送到Google容器注册表:
docker push gcr.io/your-project-id/php-fpm-app
- 部署至Cloud Run:
gcloud run deploy php-fpm-app --image gcr.io/your-project-id/php-fpm-app --platform managed --region us-central1
五、常见问题排查
- 权限异常:确保Nginx与PHP-FPM的运行用户一致(默认均为
www-data),若应用需写入权限,可在Dockerfile中添加RUN chown -R www-data:www-data /var/www/html - 端口不匹配:Cloud Run默认检查
8080端口,Nginx配置必须监听该端口,不可使用默认的80端口 - FPM连接失败:确认Nginx配置中的
fastcgi_pass指向正确的FPM服务名(多阶段构建中使用第一阶段的镜像别名即可)
内容的提问来源于stack exchange,提问作者user19677630
相关产品推荐
相关产品推荐

