[英]How to serve static content with Nginx and Django Gunicorn when using Traefik
[英]How to serve the static content in nginx + django + kubernetes?
我有一个运行 django 应用程序部署的 minikube。 直到今天,我们使用的是 django 启动的服务器。 现在,我添加了另一个 Nginx 容器,以便我们可以部署 django 应用程序,因为我读到 django 并不真正用于生产。 在阅读了一些文档和博客之后,我配置了 deployment.yaml 文件,它现在运行得非常好。 问题是没有提供 static 内容。 这实际上是因为 static 内容位于 django 容器中,而不是 Nginx 容器中。 (如果他们可以分享数量,请澄清这个疑问或误解)什么是最好的方法,以便我可以提供我的 static 内容? 这是我的部署文件的规范:
spec:
containers:
- name: user-django-app
image: my-django-app:latest
ports:
- containerPort: 8000
env:
- name: POSTGRES_HOST
value: mysql-service
- name: POSTGRES_USER
value: admin
- name: POSTGRES_PASSWORD
value: admin
- name: POSTGRES_PORT
value: "8001"
- name: POSTGRES_DB
value: userdb
- name: user-nginx
image: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
volumes:
- name: nginx-config
configMap:
name: nginx-config
我相信
server {
location /static {
alias /var/www/djangoapp/static;
}
}
需要改变。 但是我不知道我应该写什么? 此外,如何在部署完成后立即运行python manage.py migrate
和python manage.py collectstatic
。
请提供资源/文档/博客,这将帮助我做到这一点。 谢谢你。 谢谢你。
在@willrof 的回答之后,这是我当前的 YAML 文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-deployment
labels:
app: web
spec:
replicas: 1
selector:
matchLabels:
app: web
micro-service: user
template:
metadata:
name: user
labels:
app: web
micro-service: user
spec:
containers:
- name: user-django-app
image: docker.io/dev1911/drone_plus_plus_user:latest
ports:
- containerPort: 8000
env:
- name: POSTGRES_HOST
value: mysql-service
- name: POSTGRES_USER
value: admin
- name: POSTGRES_PASSWORD
value: admin
- name: POSTGRES_PORT
value: "8001"
- name: POSTGRES_DB
value: userdb
volumeMounts:
- name: shared
mountPath: /shared
command: ["/bin/sh", "-c"]
args: ["apt-get install nano"]
- name: user-nginx
image: nginx
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
- name: shared
mountPath: /var/www/user/static
volumes:
- name: nginx-config
configMap:
name: nginx-config
- name: shared
emptyDir: {}
而 nginx-config 文件是
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096; ## Default: 1024
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format ltsv 'domain:$host\t'
'host:$remote_addr\t'
'user:$remote_user\t'
'time:$time_local\t'
'method:$request_method\t'
'path:$request_uri\t'
'protocol:$server_protocol\t'
'status:$status\t'
'size:$body_bytes_sent\t'
'referer:$http_referer\t'
'agent:$http_user_agent\t'
'response_time:$request_time\t'
'cookie:$http_cookie\t'
'set_cookie:$sent_http_set_cookie\t'
'upstream_addr:$upstream_addr\t'
'upstream_cache_status:$upstream_cache_status\t'
'upstream_response_time:$upstream_response_time';
access_log /var/log/nginx/access.log ltsv;
sendfile on;
tcp_nopush on;
server_names_hash_bucket_size 128; # this seems to be required for some vhosts
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name example.com
;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
alias /var/www/user/static;
}
}
# include /etc/nginx/conf.d/*.conf;
}
我没有编写此配置,但找到了此配置并对其进行了编辑以供我使用。
在我们在评论中聊天后,您告诉我您在使用 cmd 和 args 时遇到了困难。
这是一个名为two-containers.yaml
的示例:
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
containers:
- name: python
image: python
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "apt-get update && apt-get install -y curl && mkdir /curl-folder && cp /usr/bin/curl /curl-folder && cp -r /curl-folder /pod-data/"]
- name: user-nginx
image: nginx
volumeMounts:
- name: shared-data
mountPath: /tmp/pod-data
volumes:
- name: shared-data
emptyDir: {}
python
将启动,运行apt-get update
然后apt-get install -y curl
然后mkdir /curl-folder
然后将usr/bin/curl
复制到/curl-folder
然后将文件夹/curl-folder
到/pod-data
shared安装的卷。
几点观察:
command
中提到的二进制文件(如 python 中的/bin/sh
)。&&
在 args 字段中连续链接命令,这样更容易测试和部署。再生产:
$ kubectl apply -f two-container-volume.yaml
pod/two-containers created
$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
two-containers 2/2 Running 0 7s
two-containers 1/2 NotReady 0 30s
$ kubectl describe pod two-containers
...
Containers:
python:
Container ID: docker://911462e67d7afab9bca6cdaea154f9229c80632efbfc631ddc76c3d431333193
Image: python
Command:
/bin/sh
Args:
-c
apt-get update && apt-get install -y curl && mkdir /curl-folder && cp /usr/bin/curl /curl-folder && cp -r /curl-folder /pod-data/
State: Terminated
Reason: Completed
Exit Code: 0
user-nginx:
State: Running
python
容器正确执行并完成,现在让我们检查 nginx 容器内记录的文件。$ kubectl exec -it two-containers -c user-nginx -- /bin/bash
root@two-containers:/# cd /tmp/pod-data/curl-folder/
root@two-containers:/tmp/pod-data/curl-folder# ls
curl
如果您需要进一步的帮助,请在您尝试运行时使用 command+args 发布 yaml,我们可以帮助您解决语法问题。
If it's a django app, consider using whitenoise http://whitenoise.evans.io/en/stable/ to serve your static content from minikube or kubernetes.
这是一个直截了当的建议,但在有人提到它之前,我不得不进行大量搜索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.