繁体   English   中英

docker、nginx、django 以及如何提供静态文件

[英]docker, nginx, django and how to serve static files

目标:用于生产 django 网站部署的一组 docker 容器。

我在这个过程中挂断的是,通常 nginx 直接提供静态文件......根据我对使用 docker 的良好架构的理解,您将拥有一个用于 wsgi 服务器(可能是 gunicorn)的容器,一个带有上游的单独 nginx 容器服务器配置指向您的 gunicorn 容器。 nginx 容器可以在多个 gunicorn 容器之间进行负载均衡。

但这意味着我必须在 nginx 容器中安装我的 django 应用程序的静态文件,这似乎是不好的做法,因为它的主要目标是真正的负载平衡

拥有三个容器是否更好:nginx、gunicorn 和用于静态文件的专用静态服务器(可能是 nginx 或 lighthttpd)?

关于提供静态文件,您的选择取决于您的应用程序的功能。 有一个非常漂亮的工具叫做dj-static ,它可以通过添加非常少的代码来帮助您提供静态文件。

该文档相当简单,您只需按照以下步骤操作即可。

我从Michael Hampton那里找到了这个答案:“这仅在进程位于同一主机、VM 或容器中时才有效,因为它试图与同一台机器建立连接。当它们位于不同的容器中时,它不起作用。

您需要更改 nginx 配置,以便它使用 uwsgi 容器的内部 IP 地址。” 帖子中的链接

如果您将 Nginx 放在不同的容器中,那么绝对是您必须记住的事情,您还必须设置 nginx.conf,将您的静态文件目录指定为别名,以防止出现安全问题。

我希望这段代码适用于每个人,我花了一些时间来弄清楚如何组合 Gunicorn、docker 和 Nginx:

# nginx.conf
  upstream djangoA {
       server $DOCKER_CONTAINER_SERVICE:9000 max_fails=3 fail_timeout=0;
       # In my case looks like: web:9000
  }
Server {
    include mime.types;
    # The port your site will be served on      
    listen 80;
    # the domain name it will serve for
    server_name $YOUR_SERVER_NAME;# substitute your machine's IP address or FQDN
    charset utf-8;
    #Max upload size
    client_max_body_size 512M;   # adjust to taste
    location /site_media {
       alias $DIRECTORY_STATIC_FILES/site_media;#your Django project's media   files have to be inside of the container have nginxs, you can copy them with volumes.
    expires 30d;
    }

    location / {
      try_files $uri @proxy_to_app;
    }

   # Finally, send all non-media requests to the Django server.
   location @proxy_to_app {
     proxy_set_header X-Real-IP $remote_addr;
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_pass http://djangoA;
   }
}

对于 docker-compose:

#production.yml
version: '2'

services:
  db:
    extends:
      file: base.yml
      service: db

  nginx:
    image: nginx:latest
  volumes:
      - ./nginx:/etc/nginx/conf.d/
      - ./$STATIC_FILE_ROOT/site_media:/$STATIC_FILE_ROOT/site_media
  ports:
      - "80:80"
    depends_on:
      - web


  web:
    extends:
      file: base.yml
      service: web
    build:
      args:
        - DJANGO_ENV=production
    command: bash -c "python manage.py collectstatic --noinput && chmod 775 -R project/site_media/static && gunicorn project.wsgi:application"
    volumes:
      - ./$DIRECTORY_APP:/$DIRECTORY_APP
    ports:
      - "9000:9000"
    depends_on:
      - db

volumes:
  db_data:
    external: true

如果它是使用 docker 和/或 kubernetes 的 django 应用程序,请查看 whitenoise http://whitenoise.evans.io/en/stable/以在此处提供解决方案。

这是一个直截了当的建议,但在我发现它被引用之前,我花了很多时间四处寻找。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM