![](/img/trans.png)
[英]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.