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

时间:2014-08-12 18:42:16

标签: django nginx docker

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

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

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

最好有三个容器:nginx,gunicorn和静态文件的专用静态服务器(可能是nginx或lighthttpd)?

3 个答案:

答案 0 :(得分:3)

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

文档非常简单,您只需遵循these steps.

即可

答案 1 :(得分:3)

我从Michael Hampton找到了这个答案: “这仅适用于进程位于同一主机,VM或容器中的情况,因为它尝试连接到同一台计算机。当它们位于不同的容器中时,它不起作用。

您需要更改nginx配置,以便它使用uwsgi容器的内部IP地址。“Link from the post

如果你将Nginx放在另一个容器中,你必须记住这一点,你也必须设置nginx.conf,将你的静态文件目录指向别名以防止出现安全问题。

我希望这段代码适合所有人,我花了几个时间来考虑如何编写Gunicorn,docker和Nginx:

import re

from sys import argv


def read_file(fname):
    """ open and extract the text from the file """
    txt_file = open(fname, 'r')
    txt = txt_file.read()
    txt_file.close()
    return txt


def clean_space(files):
    """ remove spaces from the file """
    return files.replace('\n', '')


def filter_file(files):
    """ remove punctuation and filter small words from the file """
    split_words = map(lambda x: re.sub('[^A-Za-z0-9]+', '', x),
                        files.split())
    filtered_txt = [x for x in split_words if len(x) > 1]
    return filtered_txt


def dict_count(files):
    """ for loop to return dict with word count and length keys """
    lengths = {}
    for word in filtered_text:  # And this also
        length = len(word)
        if length not in lengths:
            lengths[length] = 0
        lengths[length] += 1
    for length, counter in lengths.item():
        return "Words of length %d: %d" % (length, counter)


def print_result(fname):
    fi = dict_count(filter_file(clean_space(read_file(fname))))
    print fi


if __name__ == '__main__':

    script, fname = argv
    print_result(fname)

对于docker-compose:

# 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;
   }
}

答案 2 :(得分:0)

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

这是一个直截了当的建议,但我花了很多时间搜索才发现它被引用。