
当nginx运行在docker外部(宿主机或独立vm)而php-fpm运行在docker容器内部时,核心挑战在于如何让外部nginx能够稳定地与内部php-fpm通信,并确保php代码在两者之间(或至少在php-fpm容器内)是可访问的。php-fpm通常监听9000端口,nginx需要通过fastcgi协议将php请求转发到这个端口。
这种场景适用于简单部署、开发环境或非容器编排的单机应用。
首先,确保你的PHP-FPM容器正在运行,并且其FastCGI端口(默认为9000)已映射到宿主机。例如,使用Bitnami的PHP-FPM镜像:
docker run -d --name my-php-fpm -p 9000:9000 bitnami/php-fpm:latest
这将把容器内部的9000端口映射到宿主机的9000端口。因此,在宿主机上,PHP-FPM服务可以通过127.0.0.1:9000访问。
在宿主机上配置Nginx,将PHP请求转发到Docker容器暴露的端口。
立即学习“PHP免费学习笔记(深入)”;
server {
listen 80;
server_name localhost; # 替换为你的域名或IP
root /var/www/html; # 替换为你的项目代码在宿主机上的路径
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# 尝试直接服务文件,如果不存在则回退到index.php
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php(/|$) {
# 将PHP请求转发到PHP-FPM容器,通过宿主机的映射端口访问
fastcgi_pass 127.0.0.1:9000; # 或宿主机IP:9000,如果FPM端口映射到特定IP
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params; # 包含Nginx默认的FastCGI参数
# 核心参数:定义PHP脚本在PHP-FPM容器内的绝对路径
# 这里的 $document_root 对应 Nginx 配置中的 'root' 指令的值
# 为了让FPM正确找到文件,宿主机上的 Nginx root 目录
# 需要与 FPM 容器内的代码路径通过 Docker 卷进行同步。
# 例如,如果宿主机 /var/www/html 挂载到 FPM 容器的 /app 目录,
# 则此处应改为 fastcgi_param SCRIPT_FILENAME /app$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off; # 根据实际情况配置HTTPS状态
}
}配置要点说明:
在Kubernetes集群中,Nginx Ingress Controller作为集群的入口点,可以专门配置来代理FastCGI服务,从而实现对PHP-FPM容器的外部访问。
首先,定义PHP-FPM的Pod和Service:
Pod (example-app.yaml):
apiVersion: v1
kind: Pod
metadata:
name: example-app
labels:
app: example-app
spec:
containers:
- name: example-app
image: example-app:1.0 # 替换为你的PHP-FPM镜像
ports:
- containerPort: 9000
name: fastcgiService (example-service.yaml):
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example-app
ports:
- port: 9000 # Service监听的端口
targetPort: 9000 # Pod容器暴露的端口
name: fastcgi接下来,定义一个ConfigMap来存储FastCGI参数,特别是SCRIPT_FILENAME。这允许Nginx Ingress Controller知道PHP-FPM容器内部的脚本路径。
ConfigMap (example-cm.yaml):
apiVersion: v1 kind: ConfigMap metadata: name: example-cm data: # SCRIPT_FILENAME 指向 PHP-FPM 容器内部的入口文件路径 # 例如,如果你的 PHP 代码挂载在容器的 /app 目录下,并且入口文件是 index.php SCRIPT_FILENAME: "/app/index.php" # 根据你的应用入口文件路径调整
最后,定义Ingress资源,利用Nginx Ingress Controller的特定注解来启用FastCGI代理。
Ingress (example-ingress.yaml):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-app
annotations:
kubernetes.io/ingress.class: "nginx" # 指定使用 Nginx Ingress Controller
nginx.ingress.kubernetes.io/backend-protocol: "FCGI" # 启用 FastCGI 协议
nginx.ingress.kubernetes.io/fastcgi-index: "index.php" # FastCGI 默认索引文件
nginx.ingress.kubernetes.io/fastcgi-params-configmap: "example-cm" # 引用 FastCGI 参数 ConfigMap
spec:
rules:
- host: app.example.com # 你的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
name: fastcgi无论选择哪种方式,外部Nginx代理Docker内的PHP-FPM都是实现高性能PHP应用部署的有效手段。
通用最佳实践:
通过以上指南,你应该能够根据自己的部署需求,选择并实施合适的Nginx外部代理方案来管理Docker化的PHP-FPM服务。
以上就是Nginx外部代理Docker内PHP-FPM服务的实践指南的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号