nginx-如果index.php不在nginx文件夹中,则禁止使用php fpm

nginx-如果index.php不在nginx文件夹中,则禁止使用php fpm,php,nginx,kubernetes,google-cloud-platform,fpm,Php,Nginx,Kubernetes,Google Cloud Platform,Fpm,我们正在尝试使用kubernetes在GCP上部署应用程序。我们仅使用PHP-FPM创建一个容器/pod,使用NGINX创建另一个容器/pod 我们进行了部署,所有的工作都正常,但是当我们尝试获取名为index.php的“helloword”php文件时,我们从NGINX服务收到一个错误403 因此,我尝试进入NGINX pod并在php项目的根(/var/www/html/symfony/public)手动添加index.php。当我这样做时,NGINX神奇地返回PHP-FPM脚本,而不是po

我们正在尝试使用kubernetes在GCP上部署应用程序。我们仅使用PHP-FPM创建一个容器/pod,使用NGINX创建另一个容器/pod

我们进行了部署,所有的工作都正常,但是当我们尝试获取名为index.php的“helloword”php文件时,我们从NGINX服务收到一个错误403

因此,我尝试进入NGINX pod并在php项目的根(/var/www/html/symfony/public)手动添加index.php。当我这样做时,NGINX神奇地返回PHP-FPM脚本,而不是pod中创建的文件。 为了让您了解,我附加了NGINX配置

      server {
      index index.php index.html;
      server_name php-docker.local;
      error_log  /var/log/nginx/error.log;
      access_log /var/log/nginx/access.log;
      root /var/www/html/symfony/public;

      location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass symfony:9000;
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
      }
  }
NGINX服务器使用kubernetes DNS将请求重定向到PHP-FPM服务器
symfony:9000

[编辑]

是的,我还有一项服务允许NGINX与PHP-FPM通信:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: symfony
  namespace: default
  labels:
    app: symfony
spec:
  selector:
    matchLabels:
      app: symfony
  replicas: 1
  template:
    metadata:
      labels:
        app: symfony
        tier: back
    spec:
      containers:
      - name: symfony
        image: gcr.io/myphone-mmpk/symfony:v.80
        #TODO: REMOVE THIS
        imagePullPolicy: Always
        ports:
          - containerPort: 9000
        resources:
          requests:
            memory: 16Mi
            cpu: 1m
          limits:
            memory: 128Mi
            cpu: 20m
---
kind: Service
apiVersion: v1
metadata:
  name: symfony
  namespace: default
spec:
  selector:
    app: symfony
  type: NodePort
  ports:
  - protocol: TCP
    port: 9000
    targetPort: 9000
这是ku8的nginx清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
        - name: html
          emptyDir: {}
        - name: nginx
          configMap:
            name: nginx-configmap
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx/conf.d
          name: nginx
        - mountPath: /var/www/html/symfony/public
          name: html
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configmap
  namespace: default
data:
  default.conf: |
      server {
          index index.php index.html;
          server_name php-docker.local;
          error_log  /var/log/nginx/error.log;
          access_log /var/log/nginx/access.log;
          root /var/www/html/symfony/public;

          location ~ \.php$ {
              fastcgi_split_path_info ^(.+\.php)(/.+)$;
              fastcgi_pass symfony:9000;
              fastcgi_index index.php;
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              fastcgi_param PATH_INFO $fastcgi_path_info;
          }
      }
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: default
  labels:
    app: nginx
spec:
  scaleTargetRef:
    kind: Deployment
    name: nginx
    apiVersion: apps/v1
  minReplicas: 1
  maxReplicas: 5
  targetCPUUtilizationPercentage: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: default
  labels:
    app: nginx
spec:
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerIP: ~

您需要为每个应用程序创建一个kubernetes服务,描述应用程序的公开端口。或者将容器放在同一个pod中并使用localhost:9000

内部kube DNS将类似于
my svc.my namespace.svc.cluster.local

您不需要端口信息,因为服务中将描述这些信息


请参见

我使用此NGINX配置解决问题。这不是库伯尼特斯的问题

      server {
      server_name php-docker.local;
      error_log  /var/log/nginx/error.log;
      access_log /var/log/nginx/access.log;
      root /var/www/html/symfony/public;

      proxy_buffering off;

      location = /nginx-health {
          access_log off;
          return 200 "healthy\n";
      }

      location / {
          try_files $uri /index.php$is_args$args;
      }

      location ~ \.php {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass symfony:9000;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param DOCUMENT_ROOT $document_root;
          internal;
      }
      location ~ \.php$ {
              return 404;
      }
  }

这是因为您需要为index.php所在的文件夹提供正确的安全权限/var/www/html/symfony/public/似乎Nginx无法访问该文件。您正在使用php fpm讨论pod中的文件?如果我将chmod改为777,它仍然会响应403 Foribeden,没有任何变化…我问你如何部署你的代码,因为我没有看到它存储的任何剧本,只有
-mountPath:/var/www/html/symfony/public name:html
,但它是作为
emptyDir:{}
装载的,所以应该没有任何内容。我使用DNS,因为如果我在NGINX目录中手动添加一个空文件(与php fpm的目录相同),它就可以工作了。嗯,不确定-在第一次检查时,我觉得您的k8s配置看起来不错是的,看起来不错。。。出于这个原因,我不知道为什么它不起作用…:(