You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes集群中PHP-FPM+Nginx多容器Pod部署方案咨询

多容器Pod部署Nginx+PHP-FPM的源码存储方案

针对你提到的单容器多进程问题,拆分Nginx和PHP-FPM到同一Pod的思路完全正确——同一Pod内的容器共享网络和存储,刚好适配这种需要紧密协作的服务组合。下面是几种成熟的源码存储方案,你可以根据场景灵活选择:

1. 用EmptyDir共享临时存储(适合开发/测试场景)

EmptyDir是Pod级别的临时卷,Pod运行时自动创建,销毁时清空数据。非常适合快速验证方案或者开发环境,不需要持久化数据的场景。

实现方式

  • 在Pod定义中声明一个EmptyDir卷
  • 让Nginx和PHP-FPM容器都挂载这个卷到各自的源码目录(比如/var/www/html
  • 两种方式把源码放到卷里:
    • 给PHP-FPM镜像提前打包源码,启动时复制到挂载目录
    • 增加一个Init容器,从Git或本地镜像拉取源码到EmptyDir

示例YAML片段

apiVersion: v1
kind: Pod
metadata:
  name: php-nginx-dev
spec:
  volumes:
    - name: shared-source
      emptyDir: {}
  initContainers:
    - name: source-fetcher
      image: alpine/git
      command: ["git", "clone", "https://your-repo-url.git", "/tmp/source"]
      volumeMounts:
        - name: shared-source
          mountPath: /tmp/source
  containers:
    - name: php-fpm
      image: php:8.2-fpm
      volumeMounts:
        - name: shared-source
          mountPath: /var/www/html
    - name: nginx
      image: nginx:alpine
      volumeMounts:
        - name: shared-source
          mountPath: /var/www/html
      ports:
        - containerPort: 80

优缺点

  • ✅ 配置简单,无需额外存储服务
  • ❌ Pod重启后源码丢失,完全不适合生产环境

2. 用PersistentVolumeClaim(PVC)挂载持久化存储(生产首选)

如果是生产环境,必须保证源码的持久性和可维护性,PVC是最佳选择。你可以对接集群的持久化存储后端(比如NFS、Ceph、云厂商的EBS/EFS等)。

实现方式

  • 提前创建好PVC(或者用StorageClass动态创建)
  • 把PHP应用源码上传到PVC对应的存储后端(可以用CI/CD流水线自动同步,或者手动上传)
  • 在Pod中让两个容器都挂载这个PVC到源码目录

示例YAML片段

apiVersion: v1
kind: Pod
metadata:
  name: php-nginx-prod
spec:
  volumes:
    - name: php-source
      persistentVolumeClaim:
        claimName: php-app-pvc
  containers:
    - name: php-fpm
      image: php:8.2-fpm
      volumeMounts:
        - name: php-source
          mountPath: /var/www/html
    - name: nginx
      image: nginx:alpine
      volumeMounts:
        - name: php-source
          mountPath: /var/www/html
      ports:
        - containerPort: 80

补充优化

  • 可以给Nginx单独挂载PVC里的静态资源子目录(比如/var/www/html/public),减少不必要的目录访问权限
  • 配合CI/CD工具(比如Jenkins、GitLab CI),每次代码更新自动同步到PVC存储中

优缺点

  • ✅ 数据持久化,Pod重启或重建后源码不会丢失
  • ✅ 适合大规模生产环境,便于统一管理源码
  • ❌ 需要配置集群持久化存储,初期有一定复杂度

3. 源码打包进PHP-FPM容器,共享静态资源给Nginx

如果你的静态资源(CSS/JS/图片)和PHP代码分离度较高,可以把PHP源码打包进PHP-FPM镜像,然后用EmptyDir共享静态资源目录给Nginx,让Nginx专门处理静态请求,PHP-FPM处理动态请求。

实现方式

  • 构建PHP-FPM镜像时,把源码复制到容器内的/var/www/html
  • 在Pod中定义EmptyDir卷,挂载到PHP-FPM的静态资源目录(比如/var/www/html/public)和Nginx的静态资源目录
  • Nginx配置中,静态请求直接访问挂载的目录,动态请求转发到PHP-FPM(同一Pod内可以用localhost:9000访问)

示例Nginx配置片段

server {
    listen 80;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
        include fastcgi_params;
    }
}

优缺点

  • ✅ 镜像包含完整PHP代码,无需额外存储依赖
  • ✅ 静态资源和动态请求分离,性能更优
  • ❌ 每次更新代码需要重新构建PHP-FPM镜像,适合发布频率不高的场景

额外建议

  • 不管用哪种方案,都要注意权限问题:确保Nginx和PHP-FPM容器的运行用户对源码目录有合适的读写权限(比如都用www-data用户)
  • 生产环境中,建议配合ConfigMap管理Nginx的配置文件,避免硬编码在镜像里

内容的提问来源于stack exchange,提问作者Pampy

火山引擎 最新活动