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

2016-09-09 14:43:11 +08:00
 TheCure

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

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

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

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

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

7069 次点击
所在节点    Python
21 条回复
wyntergreg
2016-09-09 14:48:05 +08:00
最起码能优化静态资源吧
loading
2016-09-09 14:52:50 +08:00
静态资源也会造成堵塞
est
2016-09-09 14:55:52 +08:00
裸奔也是可以的。我就见过不少 Tornado 裸奔的。

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

然后还有用这个原理做 slow connection attack 的。
jppxhz01
2016-09-09 16:32:17 +08:00
@lightening 学习了
pangliang
2016-09-09 19:26:14 +08:00
说到底还是 看 线程模型, 如果 Gunicorn 也是 更 nginx 一样 用的非阻塞 socker + 反应堆模型, 可以不用套; 如果是 one connect per thread (process) 模型; 那最好就是套一个
TheCure
2016-09-09 21:36:14 +08:00
@lightening unicorn 不是用弹出式线程来处理用户请求的吗? 几个进程就几个并发?
Abirdcfly
2016-09-09 22:11:24 +08:00
lightening
2016-09-09 22:44:41 +08:00
@callofmx unicorn 并不是吧。 Unicorn 是单线程的,所以 app 线程不安全也没关系。 Puma 没有这个问题。
DuckJK
2016-09-10 00:01:28 +08:00
@lightening 好像是上传一个超级大的文件, keep-alive ,然后每次上传很小的部分。
ericls
2016-09-10 00:02:59 +08:00
@rrfeng cowboy 加 nginx 可能会降低性能
lightening
2016-09-10 03:44:29 +08:00
@DuckJK 但是 slow connection attack 肯定不会这样。另外 size 正常但网速奇慢也会这样。
ryd994
2016-09-10 14:37:32 +08:00
@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
2016-09-10 14:46:43 +08:00
不过讲真,套了 nginx 之后也未必要 gunicorn 了
基于多线程的都问题不大,因为前面 nginx 缓冲下来了,后面都是最快速度(本地 IO )收发然后满速处理,所以 gunicorn 的 event driven 就用不到了
我一般是 nginx 套 uwsgi
izoabr
2016-09-10 18:16:50 +08:00
我套是因为 SSL

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/305080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX