带有 ingress-nginx 的 kubernetes 中的 Django 不提供静态文件

Posted

技术标签:

【中文标题】带有 ingress-nginx 的 kubernetes 中的 Django 不提供静态文件【英文标题】:Django in kubernetes with ingress-nginx is not serving static files 【发布时间】:2020-05-03 00:38:41 【问题描述】:

我是 Kubernetes 新手,这是我第一个使用它的项目。

我想要做的基本上就是这个。 我有一个 Django 应用程序和一个反应应用程序。我想使用 kubernetes 自己的 ingress nginx 库(kubernetes/ingress-nginx)使用单个 ingress-nginx 为它们提供服务 React 应用程序在根目录中提供,而 Django 在“/api”根目录中提供。 我在 Django 设置中定义了 FORCE_SCRIPT_NAME。

对于静态文件,我创建了一个单独的持久卷声明并将其安装在 Django 部署文件中。但是当我点击 Django 的管理页面时,没有提供静态文件。 并且媒体文件也在 api/api/media... 路径中提供,该路径有一个额外的 api。 在 Kubernetes 中提供静态文件的正确方法是什么?我不想使用像 S3 这样的在线静态根。 这是我的 Django 部署 yaml。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: django
  labels:
    deployment: django
spec:
  replicas: 1
  selector:
    matchLabels:
      pod: django
  template:
    metadata:
      labels:
        pod: django
    spec:
      volumes:
        - name: django-configmap-volume
          configMap:
            name: django-configmap
        - name: static-volume
          persistentVolumeClaim:
            claimName: static-volume
        - name: media-volume
          persistentVolumeClaim:
            claimName: media-volume
      containers:
        - name: django
          image: my_image:v1.0
          ports:
            - containerPort: 8182
          envFrom:
            - configMapRef:
                name: django-configmap
          env:
            - name: DB_HOST
              value: postgres-service
            - name: DB_NAME
              value: kubernetes_django
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: user
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: password
            - name: DB_PORT
              value: "5432"
          volumeMounts:
            - name: django-configmap-volume
              mountPath: /etc/config
            - name: static-volume
              mountPath: /app/static
            - name: media-volume
              mountPath: /app/media

Django 设置.py

...
FORCE_SCRIPT_NAME = '/api/'
STATIC_ROOT = '/app/static'
MEDIA_ROOT = '/app/media'
STATIC_URL = '/api/static/'
MEDIA_URL = '/api/media/'
...

我在 ingress 中为静态文件和媒体文件位置定义了一个配置 sn-p,但我认为它不起作用。 ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hoosthere-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '30'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '500'
    nginx.ingress.kubernetes.io/configuration-snippet: |
      location ~* "^/api/static?(.*)" 
        alias /app/static/;
      
      location ~* "^/api/media?(.*)" 
        alias /app/media/;
      
spec:
  rules:
  - http:
      paths:
        - path: /?(.*)
          backend:
            serviceName: react-service
            servicePort: 1220
        - path: /api/?(.*)
          backend:
            serviceName: django-service
            servicePort: 8000

如果你能提供一个很好的例子,我将不胜感激。

【问题讨论】:

大多数 Django Web 服务器设置根本不提供静态文件。你设置了白噪声还是什么? 不,我没有设置白噪声。我正在尝试使用 nginx 来提供静态文件。 ingress-nginx 只是一个代理,AFAIK 它不提供文件。您必须设置一个为文件提供服务的后端 pod。 这能回答你的问题吗? ***.com/a/53599771/11714114 【参考方案1】:

在上面的 cmets 中提到过,但是看看 whitenoise http://whitenoise.evans.io/en/stable/ 在这里提供解决方案。

这是一个直截了当的建议,但我花了很多时间四处寻找,才发现这里的 cmets 引用了它。

【讨论】:

以上是关于带有 ingress-nginx 的 kubernetes 中的 Django 不提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

Ingress-Nginx

[CKA备考实验][ingress-nginx] 4.1如何优雅部署自己的ingress-nginx环境

ingress-nginx请求改写

ingress-nginx

Ingress-nginx+内部LB(nginx)实现业务负载均衡

ingress-nginx 部署使用