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

Sno*_*all 18 apache django mod-wsgi http

mod_wsgi页面上Django:

我们建议使用一个单独的Web服务器 - 即一个不运行Django的服务器 - 用于服务媒体.

为什么?

voi*_*hos 20

通常,将静态内容(例如图像,CSS和JS文件)放在不同的服务器上,此外,放在不同的域/子域上是个好主意.这使得提供静态文件的软件得到高度优化和极快(例如,nginx).

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


Dav*_* S. 8

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

  1. 这些要求非常快.
  2. 你没有占用你的重量级python进程做普通任务,所以他们可以自由处理应用程序请求.
  3. 通过这个单独的处理静态内容的过程,您可以在使用CDN或将资产分散到其他服务器方面具有更大的灵活性.

通过将媒体移动到特定目录,您可以更轻松地为此任务配置Web服务器.


dan*_*van 6

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

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

这也并行化使您可以运行不同的服务器引擎(好吧,他们可能是在同一个盒子-但你仍然只能得到两个插座)是专注于他们的服务怎么办-例如nginx对原材料的内容,并fastcgi针对django动态内容.


obi*_*mod 6

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