希望不吝赐教啊!
1
wlzd 2018-12-05 18:23:23 +08:00 via Android
我也想知道,求大佬们普及
|
2
Rand01ph 2018-12-05 18:45:18 +08:00
客户端发送 HTTP 协议到 Nginx,然后 Nginx 发送 uwsgi 协议到 uWSGI,然后 uWSGI 调用 Django/flask 的 WSGI application
|
3
Rand01ph 2018-12-05 18:46:13 +08:00
只有 django 的话,是不存在 uWSGI 这一层,直接接受 HTTP 协议,然后调用 Django 的 WSGI application
|
4
est 2018-12-05 18:48:34 +08:00
1. nginx 粗解析,比如头,uWSGI 细解析,比如 URL。
2. 是 uwsgi ( uWSGI 是程序 uwsgi 是协议) 3. 是 WSGI。uWSGI 直接调用 libpython.so 其他的都是代码接口。明白了吧 4. uwsgi 协议是 http 的一个超集。可以看成一个 RPC。但是同时 uWSGI 作者精力太旺盛实现了 http http/1.1 https 静态文件输出 cache 服务 key-value 服务 crontab 服务等。可以代替 nginx 直接监听 80 端口。可以代替 supervisor 监控进程。所以 uWSGI 也重新实现了全套 http 解析服务。 5. runserver 实现了。但是只是开发用。 6. 是基于 WSGI 的一些助手工具中间件。 |
5
Zzdex 2018-12-05 18:50:19 +08:00
插楼问一句 uwsgi 和 gunicorn 那个更好
|
6
xpresslink 2018-12-05 18:54:00 +08:00 2
nginx+uWSGI+django 解析 http 协议是在哪个上面解析的?
http 是个文本协议,django 来解析的。 nginx+uWSGI 通信的协议(或者说规范)是什么? uwsgi 是一种线路协议而不是通信协议,在此常用于在 uWSGI 服务器与其他网络服务器的数据通信。uwsgi 协议是一个 uWSGI 服务器自有的协议,它用于定义传输信息的类型。 uWSGI+django 通信的规范是什么? WSGI 协议。这东西是一个 Gateway,也就是网关。网关的作用就是在协议之间进行转换。 网上说 uWSGI 实现了 http 协议,是否 uWSGI+django 的架构上,uWSGI 负责 http 的解析 不是。 只有 django 的话,是不是内部也实现了一个简单的 类似 nginx+uWSGI 的东西 Django 所提供的是一个开发服务器,这个开发服务器,没有经过安全测试,而且使用的是 Python 自带的 simple HTTPServer 创建的,在安全性和效率上都是不行的。虽然不要 nginx 和 uWSGI 也可以跑,只不过 django runsever 原生为单线程,当第一个请求没有完成时,第二个请求辉阻塞,知道第一个请求完成,第二个请求才会执行。nginx 是线 web 服务器主要起到了调度,转发,处理静态文件等作用。uWSGI 是 nginx 和 app 之间的桥梁,起到多进程并发,转换协议接口等作用。 flask 框架依赖于 werkzeug ,这个东西是不是跟 uWSGI 一个层次的东西 不是。werkzeug 既不是一个 web 服务器,也不是一个 web 框架,而是是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response 等等。 |
7
est 2018-12-05 18:56:19 +08:00 1
@Zzdex 功能强大来说 uwsgi 好一万倍。
配置难度来说其实一样。如果你只看国内 csdn 级别文章肯定都推荐 gunicorn 要自己去修改一些底层逻辑,gunicorn 更简单。uWSGI 的 C 代码全世界估计只有作者会改。3 层 for 循环嵌套。 |
8
javlib 2018-12-05 19:02:29 +08:00
|
9
xpresslink 2018-12-05 19:12:52 +08:00 1
@Zzdex
各有优势 Gun 是纯 python 实现的,容易配置和 hack,配合 gevent 时处理部分阻塞请求的性能高。 uW 是 C 实现的,大量非阻塞短请求优势明显,但是配置麻烦一些。 总体上 uW 略占优。 |
10
lanqing OP @xpresslink django 的 runserver 是多线程的
|
11
lanqing OP @est 请问,werkzeug 是不是类似于封装了很多 http 请求的东西,然后用它根据 WSGI 规范能写一个 uWSGI 和 django 通信,根据 uwsgi 规范我可以写一个 uWSGI 与 nginx 通信
|
12
est 2018-12-06 09:52:33 +08:00 1
|
13
est 2018-12-06 09:53:51 +08:00 1
@lanqing WSGI 只是一个 python 代码接口。werkzeug 在这个接口之上封装了很多工具。
WSGI 之下是 uWSGI 真正监听端口跑起来 一般不推荐写 uwsgi 协议。太蛋痛了。 |
14
xpresslink 2018-12-06 10:24:59 +08:00
@lanqing runserver 确实默认是多线程启动的。写的时候没有太注意,其实是想说 django 应用是单线程的阻塞的,而且 python 有 GIL,也是伪多线程。
|
15
est 2018-12-07 09:52:17 +08:00
@xpresslink 不懂就不要瞎说。py 的多线程就是 native os thread。跑 http 是会释放 GIL 的。
|
16
xpresslink 2018-12-07 10:34:37 +08:00
@est IO 操作会释放 GIL,这个基本上学过 py 都知道,我说的伪多线程是指有 GIL 的存在不能利用多核。一个 WEB 框架里不光只有 IO 操作吧,总会有正反序列化之类的吃 CPU 操作的任务。
|
17
est 2018-12-07 11:04:01 +08:00
@xpresslink 谁告诉你不能利用多核就是伪多线程了?那么多 C++ 写的游戏,都只吃单个 CPU,他们都是单线程的?
|
18
xpresslink 2018-12-07 11:19:30 +08:00
|
19
est 2018-12-07 12:01:11 +08:00
@xpresslink 比赛说脏话了? @livid
|
20
xpresslink 2018-12-07 13:31:27 +08:00
@est 我可真心没说你,只是借喻一下。
|