You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

  1. 构建Docker镜像(替换gcr.io/your-project-id/php-fpm-app为你的GCP项目ID和自定义镜像名):
docker build -t gcr.io/your-project-id/php-fpm-app .
  1. 将镜像推送到Google容器注册表:
docker push gcr.io/your-project-id/php-fpm-app
  1. 部署至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:00:18