答案 0 :(得分:20)
一般来说,放置静态内容是个好主意 - 例如图像,CSS和JS文件 - 在不同的服务器上,此外,在不同的域/子域上。这使得提供静态文件的软件得到高度优化并且速度极快(例如,nginx)。
另一个主要好处来自网络流量的减少。如果您使用与动态Django应用程序相同的域提供静态内容,则客户端浏览器会将您的域名cookie作为其HTTP请求的一部分发送,即使对于静态文件也是如此。这是不必要的开销 - 静态文件将始终是静态的 - 但是是必需的,因为客户端无法区分静态和动态内容。另一方面,如果静态内容是从不同的域提供的,那么它可以配置为“cookieless domain”,从而最大限度地减少请求开销。
答案 1 :(得分:8)
这是Web框架中的常见策略。这里的想法是简单地使用最好的工具来提供静态内容。 Apache,Nginx,lighttpd和其他现代Web服务器都非常擅长提供静态内容,因此如果您可以轻松配置这些服务器来完成这项工作,那么您将获得以下好处:
通过将媒体移动到特定目录,您可以更轻松地为此任务配置Web服务器。
答案 2 :(得分:6)
从单个主机下载资源时,现代Web浏览器通常会打开两个(几个?)套接字。所以你得到index.html
引用一堆图像,js文件,css等。每个附加文件都由一个阻塞套接字下载。
如果从单独的主机中提取静态文件,则会额外获得两个插槽来下载文件 - 因此在生产环境中,这样做的速度要快得多。
这种并行化还允许您运行不同的服务器引擎(好吧,它们可以在同一个盒子上 - 但是你仍然只有两个套接字)专门研究它们所服务的内容 - 例如nginx
原始内容和fastcgi
动态内容的django
。
答案 3 :(得分:6)
这对安全也有好处。一种非常简洁的方法是让用户上传的文件远离核心服务器文件。单独的文件夹权限等。但是,速度快的优势。
答案 4 :(得分:1)
从技术和理论的角度来看,这里的答案肯定是正确的。但实际上,对于绝大多数Django部署,我甚至不会考虑为媒体和Django应用程序使用单独的服务器(即机器,虚拟或物理)。这没有必要。它是premature optimization - 所有邪恶的根源"。
相反,我会使用常见的httpd服务器(Apache,nginx,...)进行部署,让它通过WSGI / FastCGI运行应用程序和让它也提供静态和媒体文件。这只是有效的。您可以避免很多麻烦,特别是如果您考虑为用户媒体使用单独的服务器。
如果您的网站足够成功以解决性能问题,您将很乐意解决它。而你的第一步甚至可能是租一台更快的服务器。
这至少适用于您唯一关注的问题。出于安全原因,您可能必须使用单独的服务器,甚至可能因为您的客户需要它。