php-fpm:在 kubernetes 中找不到文件
php-fpm: File not found in kubernetes
我正在尝试使用 2 pods (nginx + php-fpm) 设置 k8s 部署,但我无法让 php-fpm 执行 php 脚本。网页显示File not found.
,日志中:
- fpm 吊舱:
192.168.3.187 - 13/Nov/2020:16:44:06 +0000 "GET /index.php" 404
- nginx pod:
2020/11/13 16:44:06 [error] 20#20: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.1.45, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://10.98.178.35:9000", host: "192.168.1.220"
.html
文件按预期提供。
没有 nginx 的 Location ~ \.php$
服务器块,我可以下载 .php
文件,所以问题确实出在 php-fpm 上;当进入容器时,我可以看到脚本存在。
在我的部署中,NFS 上的 PersistentVolume 安装在 pods 和 /app
上。 Nginx 使用此 configMap 配置:
default.conf: |
server {
listen 80 default_server;
server_name _;
add_header X-Backend-Server $hostname;
root /app;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass phpfpm-deploy-svc.default.svc.cluster.local:9000;
}
}
其中phpfpm-deploy-svc.default.svc.cluster.local
为PHP-FPM服务的DNS解析(无关贴服务代码)
php-fpm是经典部署:
spec:
containers:
- name: phpfpm
image: php:7.3-fpm
ports:
- containerPort: 9000
volumeMounts:
- name: nfs-volume
mountPath: /app
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: nfs-pvc
有自己的服务:
apiVersion: v1
kind: Service
metadata:
name: phpfpm-deploy-svc
spec:
ports:
- port: 9000
selector:
app: phpfpm-deploy
type: ClusterIP
这里看到的大多数解决方案都与 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
行相关:这是可能的,但我仍然需要找到一个可行的解决方案。
没有 k8s(只有 docker-compose),我可以创建这个配置没有问题。
好吧,我上面的代码工作正常:问题是 NFS 服务器,它没有对用户进行任何映射。
所以我能够从容器中将 NFS 卷上的文件列为 root...但不是 www-data,它是用户 运行 php-fpm。
在 NFS 卷上设置正确的映射解决了这个问题。
我正在尝试使用 2 pods (nginx + php-fpm) 设置 k8s 部署,但我无法让 php-fpm 执行 php 脚本。网页显示File not found.
,日志中:
- fpm 吊舱:
192.168.3.187 - 13/Nov/2020:16:44:06 +0000 "GET /index.php" 404
- nginx pod:
2020/11/13 16:44:06 [error] 20#20: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.1.45, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://10.98.178.35:9000", host: "192.168.1.220"
.html
文件按预期提供。
没有 nginx 的 Location ~ \.php$
服务器块,我可以下载 .php
文件,所以问题确实出在 php-fpm 上;当进入容器时,我可以看到脚本存在。
在我的部署中,NFS 上的 PersistentVolume 安装在 pods 和 /app
上。 Nginx 使用此 configMap 配置:
default.conf: |
server {
listen 80 default_server;
server_name _;
add_header X-Backend-Server $hostname;
root /app;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass phpfpm-deploy-svc.default.svc.cluster.local:9000;
}
}
其中phpfpm-deploy-svc.default.svc.cluster.local
为PHP-FPM服务的DNS解析(无关贴服务代码)
php-fpm是经典部署:
spec:
containers:
- name: phpfpm
image: php:7.3-fpm
ports:
- containerPort: 9000
volumeMounts:
- name: nfs-volume
mountPath: /app
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: nfs-pvc
有自己的服务:
apiVersion: v1
kind: Service
metadata:
name: phpfpm-deploy-svc
spec:
ports:
- port: 9000
selector:
app: phpfpm-deploy
type: ClusterIP
这里看到的大多数解决方案都与 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
行相关:这是可能的,但我仍然需要找到一个可行的解决方案。
没有 k8s(只有 docker-compose),我可以创建这个配置没有问题。
好吧,我上面的代码工作正常:问题是 NFS 服务器,它没有对用户进行任何映射。
所以我能够从容器中将 NFS 卷上的文件列为 root...但不是 www-data,它是用户 运行 php-fpm。
在 NFS 卷上设置正确的映射解决了这个问题。