django - 在 kubernetes 上使用 nginx 和 gunicorn 提供 Django 静态文件
问题描述
我有 Docker、nginx 和 gunicorn 的 Django 应用程序。
我正在尝试使用 nginx 来提供静态文件,但我得到 404。
这是我的 nginx.conf:
events {
worker_connections 1024;
}
http {
upstream backend {
ip_hash;
server backend:8000;
}
server {
location /static {
autoindex on;
alias /api/static;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
listen 80;
}
}
kubernetes 清单文件:Nginx 和 app 是同一部署中的两个独立容器。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: backend
namespace: staging
labels:
group: backend
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: <host name>
http:
paths:
- path: /
backend:
serviceName: backend
servicePort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: staging
labels:
group: backend
spec:
selector:
app: backend
ports:
- port: 8000
targetPort: 8000
name: backend
- port: 80
targetPort: 80
name: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: backend
namespace: staging
labels:
group: backend
spec:
replicas: 1
template:
metadata:
labels:
app: backend
group: backend
spec:
containers:
- name: nginx
image: <image>
command: [nginx, -g,'daemon off;']
imagePullPolicy: Always
ports:
- containerPort: 80
- name: backend
image: <image>
command: ["gunicorn", "-b", ":8000", "api.wsgi"]
imagePullPolicy: Always
ports:
- containerPort: 8000
设置.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
用于 nginx 的 Dockerfile:
FROM nginx:latest
ADD app/api/static /api/static
ADD config/nginx /etc/nginx
WORKDIR /api
我检查了 nginx 容器,所有静态文件都存在于 /api 目录中。
解决方案
您需要创建一个卷并将其与 nginx 和您的 django 后端共享,然后在该卷中使用 python manage.py collectstatic。ReadWriteMany
但是有一个问题,你的集群需要支持accessModes
pvc 存储。如果您无权访问它,您可以创建一个具有两个容器的应用程序,即您的 django 后端和 nginx。然后,您可以在它们之间共享卷!
推荐阅读
- javascript - 在反应导航 TabNavigator 中动态启用/禁用选项卡
- clojure - (defn name {:style/indent 2} [param]) 在 clojure 中是什么意思
- javascript - 如何避免 redux 中的重复代码(鸭子方法)?
- ios - 从当前时区转换为 UTC 是不正确的 swift
- jquery - Slidetoggle 隐藏上一个 div
- c# - 如何允许 .Net 单元测试引用 .Net core 2 Web 应用程序
- postgresql - PostgreSQL LOGGED 和 UNLOGGED 表性能对比与 LOCK TABLE 使用情况
- python - 在 Keras 功能 API 中合并两个模型
- python - 使用 QLineEdit.setText() 冻结窗口,但后台任务工作正常
- go - 类型 reflect.Value 不支持索引