php-fpm:在 kubernetes 中找不到文件

php-fpm: File not found in kubernetes

我正在尝试使用 2 pods (nginx + php-fpm) 设置 k8s 部署,但我无法让 php-fpm 执行 php 脚本。网页显示File not found.,日志中:

.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 卷上设置正确的映射解决了这个问题。