目标:生产django网站部署的一组docker容器。
我在这个过程中挂断的是通常nginx直接提供静态文件...基于我对使用docker的良好架构的理解,你将有一个容器用于你的wsgi服务器(可能是gunicorn),一个单独的nginx容器上游服务器配置指向您的gunicorn容器。 nginx容器可以在多个gunicorn容器之间进行负载平衡。
但这意味着我必须在nginx容器中安装我的django应用程序的静态文件,这似乎是不好的做法,因为它的主要目标实际上是负载平衡
最好有三个容器:nginx,gunicorn和静态文件的专用静态服务器(可能是nginx或lighthttpd)?
答案 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/ 以在此处提供解决方案。
这是一个直截了当的建议,但我花了很多时间搜索才发现它被引用。