zoukankan      html  css  js  c++  java
  • 使用了Gunicorn或者uWSGI,为什么还需要Nginx?

    在只使用一台机器的情况下,为什么在Gunicorn或者uWSGI前面还要加一层Nginx?哪些情景下这样做能提高性能?

    一种情况,本地有多个 web 服务,有 Python、php、java 编写的,都想监听 80 端口,这个时候就必须有一个负责转发的服务了。

    如果本机确定只跑这一个服务,但是 uwsgi 和 gevent 对于静态资源处理的并不是很好,一是性能问题,二是各种 HTTP 请求缓存头,处理的也没有 Nginx 完善。

    然后还有一些安全问题,Nginx 作为专业服务器,暴露在公网相对比较安全(虽然有著名的心血漏洞),uwsgi 和 gevent 的话,漏洞恐怕只比 Nginx 多而不是少。

    再来就是支持的协议,uwsgi 和 gunicon 早期是不支持 https 的,只能提供 http 给浏览器访问。虽然现在这两者都支持了,但是以后的 spdy 和http2,恐怕也是 nginx 跟进更快一些。

    还有一些运维优势,比如服务器被人 CC,这是一种非常常见的情况,nginx 可以比较方便的把一些 IP 加入黑名单,直接改配置文件就好了。要是 uwsgi 或者 gunicorn,恐怕还要修改自己应用的代码,把 IP 过滤写进去。

    如果考虑集群的话,那一个 nginx 做负载均衡那就几乎是必须了。

    项目用的是前后端分离,一边是webpack + vuex 一边是django,如果不用nginx的话,每次更新前端代码,都需要把生成的静态文件放到static,然后重启uwsgi服务,如果加了一层nginx,就可以前后端分开来部署,每次前端代码更新的时候,只要重启前端服务就可以了,甚至前端服务可以单独拿出来做cdn分发。

    使用nginx转发还是很方便的。曾经一个服务器同时跑了apache, tomcat, node3个服务。但是想做到不跨域,用url来做分发。这时候就用到nginx了。

    如果仅仅是一个提供API接口的后端的话,我觉得可以直接用uwsgi。

    根据以上内容,自己归纳如下:
    • Nginx更安全
    • Nginx能更好地处理静态资源(通过一些http request header)
    • Nginx也可以缓存一些动态内容
    • Nginx可以更好地配合CDN
    • Nginx可以进行多台机器的负载均衡
    • 不需要在wsgi server那边处理keep alive
    • 让Nginx来处理slow client
    • 还有一个更隐蔽的区别是,像uWSGI支持的是wsgi协议,Nginx支持的是http协议,它们之间是有区别的。
  • 相关阅读:
    6. ModelDriven拦截器、Preparable 拦截器
    5. 标签和主题
    前后端开发联调遇到的问题以及排查
    手写HashTable
    Java项目常用注解总结
    快速排序就这么简单
    交替打印出奇数和偶数
    Java的SpringMVC执行流程
    Java中Comparable与Comparator的区别
    阻塞非阻塞,同步和异步的概念
  • 原文地址:https://www.cnblogs.com/panchanggui/p/14840483.html
Copyright © 2011-2022 走看看