为什么Django文档为静态文件建议一个单独的服务器?

时间:2013-02-14 17:17:53

标签: django apache http mod-wsgi

来自Django on mod_wsgi page

  

我们建议使用一个单独的Web服务器 - 即一个不运行Django的服务器 - 来提供媒体服务。

为什么?

5 个答案:

答案 0 :(得分:20)

一般来说,放置静态内容是个好主意 - 例如图像,CSS和JS文件 - 在不同的服务器上,此外,在不同的域/子域上。这使得提供静态文件的软件得到高度优化并且速度极快(例如,nginx)。

另一个主要好处来自网络流量的减少。如果您使用与动态Django应用程序相同的域提供静态内容,则客户端浏览器会将您的域名cookie作为其HTTP请求的一部分发送,即使对于静态文件也是如此。这是不必要的开销 - 静态文件将始终是静态的 - 但是是必需的,因为客户端无法区分静态和动态内容。另一方面,如果静态内容是从不同的域提供的,那么它可以配置为“cookieless domain”,从而最大限度地减少请求开销。

答案 1 :(得分:8)

这是Web框架中的常见策略。这里的想法是简单地使用最好的工具来提供静态内容。 Apache,Nginx,lighttpd和其他现代Web服务器都非常擅长提供静态内容,因此如果您可以轻松配置这些服务器来完成这项工作,那么您将获得以下好处:

  1. 这些要求非常快。
  2. 你没有占用你的重量级python进程做普通任务,所以他们可以自由处理应用程序请求。
  3. 通过这个单独的处理静态内容的过程,您可以更灵活地使用CDN或将资产分散到其他服务器。
  4. 通过将媒体移动到特定目录,您可以更轻松地为此任务配置Web服务器。

答案 2 :(得分:6)

从单个主机下载资源时,现代Web浏览器通常会打开两个(几个?)套接字。所以你得到index.html引用一堆图像,js文件,css等。每个附加文件都由一个阻塞套接字下载。

如果从单独的主机中提取静态文件,则会额外获得两个插槽来下载文件 - 因此在生产环境中,这样做的速度要快得多。

这种并行化还允许您运行不同的服务器引擎(好吧,它们可以在同一个盒子上 - 但是你仍然只有两个套接字)专门研究它们所服务的内容 - 例如nginx原始内容和fastcgi动态内容的django

答案 3 :(得分:6)

这对安全也有好处。一种非常简洁的方法是让用户上传的文件远离核心服务器文件。单独的文件夹权限等。但是,速度快的优势。

答案 4 :(得分:1)

从技术和理论的角度来看,这里的答案肯定是正确的。但实际上,对于绝大多数Django部署,我甚至不会考虑为媒体和Django应用程序使用单独的服务器(即机器,虚拟或物理)。这没有必要。它是premature optimization - 所有邪恶的根源"。

相反,我会使用常见的httpd服务器(Apache,nginx,...)进行部署,让它通过WSGI / FastCGI运行应用程序让它也提供静态和媒体文件。这只是有效的。您可以避免很多麻烦,特别是如果您考虑为用户媒体使用单独的服务器。

如果您的网站足够成功以解决性能问题,您将很乐意解决它。而你的第一步甚至可能是租一台更快的服务器。

这至少适用于您唯一关注的问题。出于安全原因,您可能必须使用单独的服务器,甚至可能因为您的客户需要它。