推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
TheCure
V2EX  ›  Python

Gunicorn 前面一定要套一个 Nginx 吗?

  •  1
     
  •   TheCure · Sep 9, 2016 · 8314 views
    This topic created in 3711 days ago, the information mentioned may be changed or developed.

    flask 框架的网站,现在部署的时候,很多人推荐给 Gunicorn 前面加一个 Ngnix 反代.

    1.我们现在一台物理机只会部署一个网站,没有多域名的需求,但是页面的静态文件也在这台主机上.

    2.前面会有一个 LVS 的东西来做多台机器的三层负载均衡,不需要 Ngnix 做七层负载均衡.

    在我们这种情况下,使用 Nginx+Gunicorn 相比使用 Gunicorn 有啥效果?

    Nginx 比 Gunicorn 能更好的处理连接,能够把数据 buffer 住然后传给 gunicorn,关于这点能够详细解答下?

    21 replies  •  2016-09-10 19:49:48 +08:00
    wyntergreg
    wyntergreg
    Sep 9, 2016
    1
    最起码能优化静态资源吧
    loading
    loading
    Sep 9, 2016 via Android
    2
    静态资源也会造成堵塞
    est
    est
    Sep 9, 2016
    3
    裸奔也是可以的。我就见过不少 Tornado 裸奔的。

    但是你要注意 gunicorn 的 graceful reload 是有坑的。。。
    killpanda
    killpanda
    Sep 9, 2016 via iPhone
    4
    @est 什么坑?
    pcar
    pcar
    Sep 9, 2016
    5
    我也是套了 nginx 主要事静态文件
    rrfeng
    rrfeng
    Sep 9, 2016❤️2
    6
    一切非 Nginx 的东西加个 Nginx 都是有意义的,这就是 Nginx 存在的意义(逃
    qingchn
    qingchn
    Sep 9, 2016
    7
    看需求
    mimzy
    mimzy
    Sep 9, 2016
    8
    @rrfeng 看出了万物基于 Nginx 的感觉(
    lightening
    lightening
    Sep 9, 2016❤️6
    9
    我做 Ruby 的,用 Ruby 的 unicorn 的话,假设说你有 2 个进程,但是有两个用户上传文件,网速还很慢,那这两个用户同时上传文件时第三个请求就必须排队。前面套 Nginx 的话, nginx 会负责接收那两个网速很慢的用户上传的文件,等 nginx 收到全部数据后,再一下子发给 unicorn 。 Nginx 在收取文件的同时, unicorn 还能接收其他请求。

    然后还有用这个原理做 slow connection attack 的。
    jppxhz01
    jppxhz01
    Sep 9, 2016 via Android
    10
    @lightening 学习了
    pangliang
    pangliang
    Sep 9, 2016
    11
    说到底还是 看 线程模型, 如果 Gunicorn 也是 更 nginx 一样 用的非阻塞 socker + 反应堆模型, 可以不用套; 如果是 one connect per thread (process) 模型; 那最好就是套一个
    TheCure
    TheCure
    OP
    Sep 9, 2016
    12
    @lightening unicorn 不是用弹出式线程来处理用户请求的吗? 几个进程就几个并发?
    lightening
    lightening
    Sep 9, 2016
    14
    @callofmx unicorn 并不是吧。 Unicorn 是单线程的,所以 app 线程不安全也没关系。 Puma 没有这个问题。
    DuckJK
    DuckJK
    Sep 10, 2016
    15
    @lightening 好像是上传一个超级大的文件, keep-alive ,然后每次上传很小的部分。
    ericls
    ericls
    Sep 10, 2016 via iPhone
    16
    @rrfeng cowboy 加 nginx 可能会降低性能
    lightening
    lightening
    Sep 10, 2016 via iPhone
    17
    @DuckJK 但是 slow connection attack 肯定不会这样。另外 size 正常但网速奇慢也会这样。
    ryd994
    ryd994
    Sep 10, 2016 via Android❤️2
    18
    @lightening
    @DuckJK

    http slow 其实有很多
    slow download 就是慢下载,故意限速,多开连接
    slow loris 就是慢 header ,请求带一个超大的 header ,然后慢慢发
    slow post 慢慢发 post body

    重点在于开大量并发,保持服务端忙碌

    Nginx 加足够 buffer 对付起来很有效
    此外, gunicorn 因为基于 gevent ,也是基本不怕的

    大多数时候 Nginx 的主要作用:
    1. 服务静态
    2. 提供横向扩展能力
    3. fail over
    4.扛各种暴力攻击(只要不涉及后端的都多少有用)
    ryd994
    ryd994
    Sep 10, 2016
    19
    不过讲真,套了 nginx 之后也未必要 gunicorn 了
    基于多线程的都问题不大,因为前面 nginx 缓冲下来了,后面都是最快速度(本地 IO )收发然后满速处理,所以 gunicorn 的 event driven 就用不到了
    我一般是 nginx 套 uwsgi
    izoabr
    izoabr
    Sep 10, 2016
    20
    我套是因为 SSL
    qweweretrt515
    qweweretrt515
    Sep 10, 2016
    21
    建议加
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   652 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 21:48 · PVG 05:48 · LAX 13:48 · JFK 16:48
    ♥ Do have faith in what you're doing.