我对后端架构进行了大量研究。我目前正在 Amazon 的 Web Services 上运行 django 应用服务器和 postgresql 数据库服务器。我所有的内容都通过 Gunicorn 提供。我想知道为什么 nginx 服务器位于 django 应用服务器的前面。它们的用途是什么?以下是一张图:
https://d36cz9buwru1tt.cloudfront.net/architecture_diagram_praekelt-1.jpg
答案1
在许多堆栈中,nginx 通常位于 unicorn 或 gunicorn 前面,用于缓冲对慢速客户端的响应。
有关更多信息,请参阅 nginx 文档:
http://wiki.nginx.org/HttpProxyModule#proxy_buffering
ELB 不进行缓冲,因此使用 nginx 可以节省您的麻烦。
答案2
一般来说,你会把反向代理放在后端服务器前面,比如 gunicorn(或 java 世界中的 tomcat),因为它们具有更多功能并且更具弹性。
例如,使用 nginx,您可以添加细粒度的访问控制,终止 SSL,并且不容易受到 DOS 攻击(这是 gunicorn 在其文档中特别提到的(http://docs.gunicorn.org/en/latest/deploy.html)。
在 EC2 中,如果您使用的 nginx 或 haproxy 没有特殊功能,则可以用 ELB 替换 nginx 和 haproxy。请参阅http://harish11g.blogspot.com/2012/11/amazon-elb-vs-haproxy-ec2-analysis.html对 ELB 和 haproxy 进行比较。