1
tempdban 2020-05-11 21:28:53 +08:00 via Android 1
此时是不是应该去看看 wsgi 规范
|
2
kwoktung 2020-05-11 21:37:03 +08:00 via Android
我也好奇。蹲个答案。
|
3
fgwmlhdkkkw 2020-05-11 21:59:46 +08:00
实现了 uwsgi 协议的 nginx 。
|
4
fgwmlhdkkkw 2020-05-11 22:01:21 +08:00
@fgwmlhdkkkw uwsgi 将 http 协议转换为 uwsgi 协议,然后转发给 wsgi 程序。
|
5
WispZhan 2020-05-11 22:05:12 +08:00 3
几周、几个月或多年后,你回过头来,再来看这个帖子,会发现“原来当年我问过这么蠢的问题”。
|
6
jimmyismagic 2020-05-11 22:18:40 +08:00
关注这个问题,我想听到最准确的答案,像 java,tomcat 都是 java 程序,为什么 uwsgi 不是呢?
|
7
bwangel 2020-05-11 22:40:02 +08:00 6
Python 有个东西叫做 C-API,https://docs.python.org/3/c-api/index.html,让开发者可以用 C 代码来访问 Python 解释器内部,这样就可以用 C 来获取 Python 中的对象,执行 Python 中定义的函数函数等。
1. uwsgi 中并没有集成一个 Python 虚拟机,它只是调用了 Python 提供的 C 接口,启动后在内存中创建了 Python 虚拟机实例。 # 初始化 Python 实例的位置 https://github.com/unbit/uwsgi/blob/11ca00432176f4246881870ea6c7c4ea5a26481f/plugins/python/python_plugin.c#L302 分析 uwsgi 依赖的动态库,可以看到它是依赖 Python 的。 ø> otool -L `which uwsgi` 22:29:40 (05-11) /usr/local/bin/uwsgi: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) /usr/local/opt/pcre/lib/libpcre.1.dylib (compatibility version 4.0.0, current version 4.8.0) /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0) /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 57.1.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1349.8.0) /usr/local/opt/python3/Frameworks/Python.framework/Versions/3.6/Python (compatibility version 3.6.0, current version 3.6.0) 2. uwsgi 启动后会将 wsgi App 对象(例如 flask 的 app 对象)加载到内存中。然后每次请求到来后,调用 wsgi App 对象来处理请求。 # 加载 wsgi app 对象的位置 https://github.com/unbit/uwsgi/blob/58c920bf96b86450f88d02a1df9043e754550483/plugins/python/pyloader.c#L194 |
8
bwangel 2020-05-11 22:41:41 +08:00
搜一下 “uwsgi 源码分析”,有挺多讲 uwsgi 实现的文章的。
|
9
youngce 2020-05-11 22:49:19 +08:00
uwsgi 甚至提供了对遵守 WSGI 协议的其它语言的 web 支持。。。虽然我觉得应该没人用:)
|
10
crella 2020-05-11 23:28:42 +08:00 via Android
官网文档:
Request plugins (implement application server interfaces for various languages and platforms: WSGI, PSGI, Rack, Lua WSAPI, CGI, PHP, Go …) |
11
crella 2020-05-12 00:00:02 +08:00 via Android
哈哈,作为一个完全没用过 flask 或 django 的菜鸟,我说一下我的看法。
首先,文档提到 uWSGI 用插件来支持多种语言。这样的话,要么用本机 socket 与各个语言的运行时通信,要么把那个语言的运行时嵌入到自己的运行空间中。 第二,参考 uWSGI 的启动命令,发现仅需指定插件编号,而不用指定对应语言运行时的 socket,所以应该不是通过 socket 通信 第三,uWSGI 的 perl 与 ruby 文档都提到要用到 c 编译器和 libperl-dev 或者 ruby-dev 。在 linux 上编译过一些小型软件的就知道这是什么回事了。 |
12
lis66951735 2020-05-12 00:11:37 +08:00 via Android
wsgi 类比 servlet,uwsgi 类比 tomcat
|
13
CzaOrz 2020-05-12 08:44:13 +08:00
个人理解:
flask 和 django 都是基于 WSGI 标准搭建的 web 应用框架。 可把整个服务端响应流程分为: >>> socket 监听端口 >>> 接收 http 请求报文 >>> 解析请求报文并将其打包为 wsgi 标准,从代码层面看,就是整理出了两个参数,分别为 environ 和 start_response >>> web 应用层调用 environ 和 start_response 实现业务逻辑和响应报文 uwsgi 本质不是为了执行 python,他是配合了 nginx,python 来实现了上述流程,提高吞吐量。 nginx 监听并转发请求 -> uwsgi 将请求打包 -> python 实现业务逻辑 |
14
luobo 2020-05-12 09:15:05 +08:00
#!/usr/bin/python
print("hello,world!") |
15
smallpython 2020-05-13 14:01:45 +08:00
就好像 python 也可以调用 c 代码中的函数一样, 应该是可以互相调用的吧.
wsgi 是一个协议, 如果都遵守这个协议, 无论版本新旧都没关系吧 |
16
smallpython 2020-05-13 14:03:41 +08:00
不过还是推荐用 gunicorn, 纯 python 的更好理解, 万一有什么不符合系统要求的地方还能直接改里面的代码
|