【发布时间】:2020-09-09 04:23:37
【问题描述】:
我有一个运行 django 应用程序部署的 minikube。直到今天,我们使用的是 django 启动的服务器。现在,我添加了另一个 Nginx 容器,以便我们可以部署 django 应用程序,因为我读到 django 并不是真正用于生产。在阅读了一些文档和博客之后,我配置了 deployment.yaml 文件,它现在运行得非常好。 问题是没有提供静态内容。这实际上是因为静态内容位于 django 容器中,而不是 Nginx 容器中。 (如果他们可以分享数量,请澄清这个疑问或误解)什么是最好的方式,以便我可以提供我的静态内容? 这是我的部署文件的规范:
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;
}
这个配置不是我写的,但我发现了这个并编辑了我的使用。
【问题讨论】:
-
谢谢你,@hdhruna 我希望这能解决我的问题。
-
检查提供的链接后,如果您仍然遇到问题,请使用您的新发现和问题更新您的问题,您可以在评论中提及我,我也可以为您查找。
-
@willrof 当然,谢谢。我尚未对此进行测试,但已经浏览了链接。我一定会寻求帮助的。非常感谢。
-
@willrof 我做了提到的两个链接中的建议。创建共享卷有效。但我必须手动将我的静态文件夹的内容从应用程序复制到共享目录。我怎样才能自动化呢?带有 args 的命令 bin/sh 不起作用。添加这些行时部署失败。请帮忙。
标签: django nginx kubernetes minikube