如何将 wsgi django/python 应用服务器与 Web 服务器分开?

如何将 wsgi django/python 应用服务器与 Web 服务器分开?

我已经构建了一个 django / python 应用程序,使用 wsgi 在 apache 上运行,并托管在单个 amazon AWS EC2 实例上。

它是一个自定义的客户端应用程序,因此流量很低,但我的应用程序的一部分会生成报告,这需要更多的马力,所以我想添加一个传入的 Web 服务器,查看我的请求并将它们发送到两个应用程序服务器之一。

我猜这不完全是负载平衡,因为我想将生成文档的请求与其他请求区别对待。所以我设想一台机器上运行 apache,另一台机器上运行 django...

但是人们如何做到这一点呢?

  • 我是否在 Web 服务器上运行基于 wsgi 的 django 应用程序,该应用程序查看请求,然后将其转发到另一台运行带有基于 wsgi 的 django 应用程序的 apache 的机器?
  • 或者是否存在一些 apache mod 可以转发来自 web 服务器的请求,然后应用程序作为独立的 django 服务器运行,而无需 apache?
  • 或者可以配置负载均衡器(如亚马逊的弹性负载均衡器)来执行此操作吗?

我一直无法找到有关此内容的文档 - 是否有某些特定内容是我可以搜索的?

答案1

显然,我正在寻找的是具有此功能的 FastCGI。在第 21 章:部署 Django在 Django 书中,有这样一段话:

FastCGI 是一种让外部应用程序向 Web 服务器提供页面的有效方法。Web 服务器将传入的 Web 请求(通过套接字)委托给 FastCGI,FastCGI 执行代码并将响应传回 Web 服务器,Web 服务器再将其传回客户端的 Web 浏览器。

文件还解释道如何将 Django 与 FastCGI、SCGI 或 AJP 一起使用。看起来我可以相当轻松地修改请求路径并将它们路由到不同的实例。

答案2

供参考:自 1.7 版起已弃用: FastCGI 支持已弃用,并将在 Django 1.9 中删除。

我使用 nginx 进行相同类型的路由并使用 gunicorn 运行 django。

Nginx 只是充当反向代理,可以通过多种不同的方式路由您的请求。

设置定义并命名您的上游应用服务器:

upstream main_site { server         localhost:8000;}
upstream reports   { server         172.16.12.35:8000;}

然后相应地路由请求

location /reports {
    proxy_read_timeout 1900; #because these requests can take a while
    proxy_pass http://reports;
}
location / {
    proxy_pass http://main_site;
}

当我受到数据库约束但应用服务器有足够的资源时,我实际上已经使用同一个盒子上的两个相同的应用程序实例完成了此操作,以便长时间运行的报告不会占用应用服务器线程。

即使你仍然在 apache/wsgi 中运行你的应用程序,nginx 也提供了很多轻量级的灵活性。来看看吧。

相关内容