簡體   English   中英

如何在 nginx + django + ZB76E98AF9AAA680979BF5A65B2D5A10 中提供 static 內容

[英]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 migratepython 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM