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




