首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何服务nginx + django + kubernetes中的静态内容?

如何服务nginx + django + kubernetes中的静态内容?
EN

Stack Overflow用户
提问于 2020-05-22 18:40:10
回答 2查看 1.2K关注 0票数 2

我有一个运行django应用程序部署的minikube。直到今天,我们还在使用django启动的服务器。现在,我添加了另一个Nginx容器,这样我们就可以部署django应用程序了,因为我读到django并不是真正用于生产的。在阅读了一些文档和博客之后,我配置了deployment.yaml文件,它现在运行得非常好。问题是没有提供静态内容。这是因为静态内容在django容器中,而不是Nginx容器中。(Idk如果他们可以共享音量,请澄清这个疑问或误解)什么是最好的方式,以便我可以提供我的静态内容?这是我的部署文件的规范:

代码语言:javascript
复制
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

我相信

代码语言:javascript
复制
server {
    location /static {
        alias /var/www/djangoapp/static;
    }
}

需要改变。但是我不知道我该写些什么?另外,如何在部署完成后立即运行python manage.py migratepython manage.py collectstatic

请提供资源/文档/博客,它们将帮助我做到这一点。谢谢!谢谢。

在@willrof的回答之后,这是我当前的YAML文件。

代码语言:javascript
复制
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: {}

代码语言:javascript
复制
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;
}

我没有写这个配置,但找到了它,并根据我的需要进行了编辑。

EN

回答 2

Stack Overflow用户

发布于 2020-05-27 00:08:40

在我们的评论聊天后,你告诉我你在使用cmd和args时遇到了困难。

下面是一个名为two-containers.yaml的示例

代码语言:javascript
复制
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 updateapt-get install -y curlmkdir /curl-folder,然后将usr/bin/curl复制到/curl-folder,然后将文件夹/curl-folder复制到/pod-data共享挂载卷。

几点观察:

  • 容器镜像必须具有command中提到的二进制文件(就像python中的/bin/sh )。
  • 尝试使用&&在args字段中连续链接命令,这样更易于测试和部署。

Reproduction:

代码语言:javascript
复制
$ 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容器中的文件日志。

代码语言:javascript
复制
$ 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

如果您需要进一步的帮助,在您尝试运行时将yaml与command+args一起发布,我们可以帮助您解决语法问题。

票数 3
EN

Stack Overflow用户

发布于 2021-02-26 08:34:23

如果是django应用程序,可以考虑使用whitenoise http://whitenoise.evans.io/en/stable/来提供minikube或kubernetes的静态内容。

这是一个直截了当的建议,但在有人提到它之前,我不得不进行了相当多的搜索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61953139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档