快过年了,也没什么心思工作了,上面也没安排什么繁重的工作了。 现在有大把的时间干自己喜欢的事情,一直都想下功夫看看uwsgi server的实现源码及uwsgi的协议。以前总是根据喜好挑着代码片段看,不系统。
先前遇到过python gunicorn 和 uwsgi 在不同io模型下性能差异问题,导致了下面这些一系列的Q&A , 还好通过这么几天的分析代码和测试知道是怎么一回事了。
gunicorn 默认是select模型, 如何改成epoll模型 ? gunicorn 长连接实现方法 uwsgi http模式为什么会listen两组端口 unix domain socket 性能真的好么? 在uwsgi里出现502\504根本原因? 故意传递一个不完整的http请求? listen fd被所有worker accept么? 等等...
这个关于python uwsgi的章节有点多,所以打算扔到后面去讲解,这么好的话题,咱们可不能这么草率就对付了,要好好从uwsgi源码层面捕捉一些问题.
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新. http://xiaorui.cc/?p=4205
那么本章的内容是什么? 正如标题那样,自己开发设计一个uwsgi的测试客户端,那么为什么要设计一个uwsgi的客户端呢? uwsgi 还需要客户端么? 为什么是多功能呢? 疑问是不是多了不少。
我们知道uwsgi 和 gunicorn 实现的功能很类似,单说服务模式方面, gunicorn只有http模式,而uwsgi server有多个服务模式,它有http、tcp socket、unix domain socket 。 如果是http模式,那没得讲,直接用curl都可以访问的。 如果uwsgi切换到 tcp socket、unix domain socket模式,因为他们跑的协议是uWsgi protocol ,又因为他们有 unix domain socket (unix域套接字),这时候你用curl肯定是玩不转的,那么如何? 所以我定制一个uwsgi客户端来兼容这三个模式…
其实uwsgi的客户端不是必需品的, 我们以往测试uwsgi server,都是在nginx配置uwsgi_proxy代理后,再进行下一步测试。
一句话,为了方便测试uwsgi server 而开发的客户端. 代码倒是没什么难度,只是uwsgi protocol协议有点苦涩难懂,所以借助于nginx的uwsgi_proxy来一路抓包和strace分析…. 这过程也是醉了….
github 地址: (记得给我这个github项目点star)
https://github.com/rfyiamcool/uwsgi_cli
项目名, uwsgi_cli :
一些俗气的安装使用介绍.
安装方法:
pip install uwsgi_cli
if not found uwsgi_cli bin, please set PATH . ( /usr/local/bin/ )
http mode
uwsgi_cli http 127.0.0.1:5000 /blog
unix socket mode
uwsgi_cli unix /tmp/xiaorui.sock /
tcp socket mode
uwsgi_cli tcp 127.0.0.1:5000 /mp/article
POST 模式
uwsgi_cli tcp 127.0.0.1:5000 /cool/fetch "url=xiaorui.cc&name=fengyun"
END.