【问题标题】:Ingress Nginx won't load resources of a Django ApplicationIngress Nginx 不会加载 Django 应用程序的资源
【发布时间】:2020-03-01 21:52:56
【问题描述】:

所以我有一个在 K8 中运行的 django 应用程序,但我的资源(如 .css)不会被加载。我总是收到 404。我使用 Ingress-Nginx 路由传入流量。

入口配置如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-aboi
  annotations:
    kubernetes.io/ingress.class: nginx
    ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - secretName: tls-cert
  rules:
  #- host: dev.<ip>.xip.io
  - http:
      paths:
      - path: /
        backend:
          serviceName: django-service
          servicePort: 8000

对于 index.html,我尝试使用前导斜杠和不使用。因为我在这里的这个 stackoverflow 线程中找到了这些信息。 Kubernetes Ingress Nginx loading resources 404 可悲的是,它并没有解决我的问题。

Index.html

<html lang="en">
    <head>
    <title>Log in | Django site admin</title>
    <link rel="stylesheet" type="text/css" href="static/admin/css/base.css">
    <link rel="stylesheet" type="text/css" href="static/admin/css/login.css">
    <link rel="stylesheet" type="text/css" href="static/admin/css/responsive.css">
    </head>
<body>
</body>
</html>

在我使用带有此配置的 nginx 之前,但如果我可以单独使用 ingress-nginx 组件处理流量,我不想使用另一个 pod。

nginx.conf

server {
   listen      443 ssl;
   location /media  {
       alias /website/media;
   }

   location /static {
       alias /website/static;
   }
   location / {
       uwsgi_pass  django;
       include     /etc/nginx/uwsgi_params;
       uwsgi_read_timeout 300;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header Host $http_host;
       proxy_redirect off;
   }

所以总结一下。我可以使用该应用程序,但没有资源。这些资源位于 django 应用程序 pod 之一中。我检查了他们是否在里面,他们也是。 我还尝试了这样的重写 sn-p,以匹配之前的 nginx 配置。它也不起作用。

    nginx.ingress.kubernetes.io/configuration-snippet: |
     rewrite (.*)/media/(.*) /website/media/$2 break;
     rewrite (.*)/static/(.*) /website/static/$2 break;

顺便说一句。如果我使用像 xip.io 这样的主机,我根本无法访问我的应用程序。所以我真的不知道我最后搞砸了什么。域会很好,但更重要的是能够加载所需的资源。

欢迎提供任何帮助、提示和技巧。

来自柏林的亲切问候。

【问题讨论】:

  • 您使用的是什么版本的 kubernetes 和 nginx 入口控制器?这里是link 来指导如何检查 nginx 版本。要检查 kubernetes 版本,请使用 kubectl version
  • Kubernetes 1.14 和最新的 Ingress Nginx 最新的 0.26.1。

标签: python django gunicorn kubernetes-ingress nginx-ingress


【解决方案1】:

我了解到 Ingess 不应该提供静态文件。它应该由像 nginx oder a cdn 这样的 Web 服务器处理。 Ingress 用于路由,不应将其视为 Web 服务器。因为我不想为 nginx 启动和额外的 pod,所以我将为 Django 应用程序使用中间件,现在称为 whitenoise。这将通过 gunicorn 传递静态文件。 我必须重新考虑未来最好的解决方案是什么,并且可能会使用来自 Google 或 AWS 的 cdn。

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2016-08-16
    • 2019-10-13
    相关资源
    最近更新 更多