uWSGI的各种部署方式
As a back-end with web-server, speak the uwsgi protocol
<uwsgi id = "uwsgibk">
<stats>127.0.0.1:9090</stats>
<socket>127.0.0.1:3030</socket>
<file>./server.py</file>
<enable-threads/>
<post-buffering/>
<memory-report/>
</uwsgi>
As a back-end with web-server, speak the http protocol
The http and http-socket options are entirely different beasts. The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to natively speak the http protocol. TL/DR: if you plan to expose uWSGI directly to the public, use –http, if you want to proxy it behind a webserver speaking http with backends, use –http-socket. .. seealso:: Native HTTP support
<uwsgi id = "httpbk">
<stats>127.0.0.1:9090</stats>
<http-socket>127.0.0.1:3030</http-socket>
<file>./server.py</file>
<enable-threads/>
<post-buffering/>
<memory-report/>
</uwsgi>
Expose self directly to the public
The http and http-socket options are entirely different beasts. The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to natively speak the http protocol. TL/DR: if you plan to expose uWSGI directly to the public, use –http, if you want to proxy it behind a webserver speaking http with backends, use –http-socket. .. seealso:: Native HTTP support
<uwsgi id = "http">
<stats>127.0.0.1:9090</stats>
<http>:80</http>
<file>./server.py</file>
<enable-threads/>
<post-buffering/>
<memory-report/>
</uwsgi>
Nginx with The uWSGI FastRouter
http://uwsgi-docs.readthedocs.org/en/latest/Nginx.html
http://uwsgi-docs.readthedocs.org/en/latest/Fastrouter.html
http://stackoverflow.com/questions/21518533/putting-a-uwsgi-fast-router-in-front-of-uwsgi-servers-running-in-docker-containe
http://stackoverflow.com/questions/26499644/how-to-use-the-uwsgi-fastrouter-whith-nginx
Configurations of Nginx
location /test {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3030;
}
Configurations of FastRouter
<uwsgi id = "fastrouter">
<fastrouter>127.0.0.1:3030</fastrouter>
<fastrouter-subscription-server>127.0.0.1:3131</fastrouter-subscription-server>
<enable-threads/>
<master/>
<fastrouter-stats>127.0.0.1:9595</fastrouter-stats>
</uwsgi>
Configurations of instance
<uwsgi id = "subserver1">
<stats>127.0.0.1:9393</stats>
<processes>4</processes>
<enable-threads/>
<memory-report/>
<subscribe-to>127.0.0.1:3131:[server_ip] or [domain]</subscribe-to>
<socket>127.0.0.1:3232</socket>
<file>./server.py</file>
<master/>
<weight>8</weight>
</uwsgi>
<uwsgi id = "subserver2">
<stats>127.0.0.1:9494</stats>
<processes>4</processes>
<enable-threads/>
<memory-report/>
<subscribe-to>127.0.0.1:3131:[server_ip] or [domain]</subscribe-to>
<socket>127.0.0.1:3333</socket>
<file>./server.py</file>
<master/>
<weight>2</weight>
</uwsgi>
If we HTTP-GET [server_ip] or [domain]/test, the route of request as follows:
Nginx >> FastRouter(port 3030) >> FastRouter(port 3131) >> subserver1(port 3232) or subserver2(port 3333)
and the protocol of all is uwsgi.
Faster Router also has specific stats.
http router
http://uwsgi-docs.readthedocs.org/en/latest/HTTP.html
Router
<uwsgi id = "httprouter">
<enable-threads/>
<master/>
<http>:8080</http>
<http-stats>127.0.0.1:9090</http-stats>
<http-to>127.0.0.1:8181</http-to>
<http-to>127.0.0.1:8282</http-to>
</uwsgi>
sub-server1
<uwsgi id = "httpserver1">
<stats>127.0.0.1:9191</stats>
<socket>127.0.0.1:8181</socket>
<memory-report/>
<file>./server.py</file>
<enable-threads/>
<post-buffering/>
</uwsgi>
sub-server2
<uwsgi id = "httpserver2">
<stats>127.0.0.1:9292</stats>
<memory-report/>
<file>./server.py</file>
<socket>127.0.0.1:8282</socket>
<enable-threads/>
<post-buffering/>
</uwsgi>
Other route mode
Just like Fast Route and Http Route, the router can forward(http-to) or route requests to other sub-servers, the only difference is protocol.
The protocols as follows:
Fast, HTTP(S), raw, ssl.
Certainly, all of routers have specific stats in the same style.
The uWSGI Emperor
http://uwsgi-docs.readthedocs.org/en/latest/Emperor.html
Emperor
<uwsgi id = "emperor">
<emperor>./vassals</emperor>
<emperor-stats-server>127.0.0.1:9090</emperor-stats-server>
</uwsgi>
Vassal1
<vassal1>
<uwsgi id = "vassal1">
<http>:8080</http>
<stats>127.0.0.1:9191</stats>
<memory-report/>
<enable-threads/>
<post-buffering/>
<file>./server.py</file>
<chdir>..</chdir>
</uwsgi>
</vassal1>
Vassal2
<vassal2>
<uwsgi id = "vassal2">
<http>:8181</http>
<stats>127.0.0.1:9292</stats>
<memory-report/>
<enable-threads/>
<post-buffering/>
<file>./server.py</file>
<chdir>..</chdir>
</uwsgi>
</vassal2>
Emperor also has specific stats.
multi-mountpoint
<uwsgi id = "vassal1">
<socket>127.0.0.1:3030</socket>
<http>:8080</http>
<stats>127.0.0.1:9191</stats>
<memory-report/>
<enable-threads/>
<post-buffering/>
<manage-script-name/>
<chdir>..</chdir>
<mount>/pic=server.py</mount>
<mount>/test=fuck.py</mount>
<workers>2</workers>
</uwsgi>
注意:
http://stackoverflow.com/questions/19475651/how-to-mount-django-app-with-uwsgi
<manage-script-name/>参数很关键,但官方help中并没有提这个,F*CK YOU!
这样配置后,uWSGI会根据不同的request路径调用不同的app。
The End
uWSGI作为backend,和Nginx的配合比Apache要好,建议用Nginx作前端。
如果在CentOS上以INET socket为载体部署Nginx+uWSGI或Apache+uWSGI时,客户端访问遇到50x Bad Gateway错误时,强烈建议你换到Ubuntu上去试试,因为同样的配置在CentOS上有这个问题,换到Ubuntu后就可能没问题。
2014-11-03补充:CentOS下的这个问题的原因是RedHat系列的Linux发行版默认开启SELinux,SELinux的某些策略导致的这个问题,不知道算不算是BUG。关闭了SELinux就可解决,具体如何关闭可以参考:http://www.cnblogs.com/lightnear/archive/2012/10/06/2713090.html。Debian系列的发行版因为默认没有开启SELinux,所以不存在这个问题。上周末看到一篇比较Liunx发行版性能的文章时,偶然发现的有SELinux这个东西,今天一试果然。如果再碰到其他类似的诡异问题,也可以尝试关闭SELinux试试。
如果用Apache+uWSGI部署后,客户端访问时返回一个文件,那有可能是Apache对页面压缩后的结果,把Apache的GZIP压缩模块关掉就好了。Nginx没有这个问题,更好用不是吗?
忍不住吐槽
尼玛uWSGI的文档就是一坨SHIT,SHIT!国内这方面的知识可能少很多,在这里贴出来,方便国内的用户。
像这种小众一点的东西,国内资料很少,跟国外比还是有差距啊,基友们还需努力啊。
uWSGI的各种部署方式的更多相关文章
- 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- 使用Nginx+uWSGI+Django方法部署Django程序
第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...
- 使用Nginx+uWSGI+Django方法部署Django程序(上)
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- [原]Python Web部署方式总结
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- [转]Python Web部署方式总结
学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...
- Python Web部署方式全汇总
学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足. 在 ...
- 使用Nginx+uWSGI+Django方法部署Django程序(下)
在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的, ...
- uWSGI + Nginx + Django 部署
1. uWSGI 服务器 Django 默认使用 WSGI(Python Web Server Gateway ) 作为 Web 服务器,一般仅用来作为测试使用,实际生产环境而是使用 uWSGI 和 ...
- django项目在uwsgi+nginx上部署遇到的坑
本文来自网易云社区 作者:王超 问题背景 django框架提供了一个开发调试使用的WSGIServer, 使用这个服务器可以很方便的开发web应用.但是 正式环境下却不建议使用这个服务器, 其性能.安 ...
随机推荐
- JavaScript实现碰撞检测(分离轴定理)
概述 分离轴定理是一项用于检测碰撞的算法.其适用范围较广,涵盖检测圆与多边形,多边形与多边形的碰撞:缺点在于无法检测凹多边形的碰撞.本demo使用Js进行算法实现,HTML5 canvas进行渲染. ...
- virtualenv沙箱
准备用Django开发网站,豆瓣阅读中有<Django入门>,里面有人批注说用virtualenv+pip很好. 每次搞个什么都感觉举步维艰,因为之前太懒了,什么都懒得深入看一下.pip一 ...
- [原创]-[WEB]代码高亮工具
代码高亮显示,不是什么新鲜玩艺了,各种各样的插件多了去了. 一开始想在baidu空间里贴代码,用GeSHi生成的高亮HTML复制到编辑器就可以了,不过QQ空间却不行,复制过去的格式全部被清 ...
- Emacs 文件中的查找操作
1,在本文件中查找 list-matching-lines 命令会列出本文件中所有出现text的地方.下面是它的一个输出示例: 7 matches for "ngx_http_wait_re ...
- idea编辑区光标问题
本文转自:http://blog.csdn.net/shaoyezhangliwei/article/details/48735417 今天在用idea的情况下 ,莫名闪退了 ,重新打开的时候发现 光 ...
- windows批处理文件打印幻方
无论是批处理文件还是shell都是没有意义的,它们只是一种工具,并且是非常低级难懂的工具. 如果不会,那就保持不会就好了.不要花费太多时间在这些没意义的事情上. 批处理的没意义体现在: 难以表达 随便 ...
- Android开发简历书写的各个要点
对于我们这些自学成才的菜鸟来说,很多知识是欠缺的,比如如何写简历,今早上特意在网上学习了一下,写成学习笔记供大家参考. 篇幅,简历一般3页或者三页多一点是最好的,少了不好看,多了面试官不愿意看. 工作 ...
- 订阅mosquitto服务器状态各主题
mosquitto_sub -v -t \$SYS/broker/client MQTT客户端可以通过订阅位于$SYS层次下的主题来查看mosquitto服务器的状态信息.标记为Static的主题对于 ...
- ios学习之旅--oc对象的关系
1.匿名对象:就是没有名字对象 1.匿名对象仅用一次 使用场景: 1.当我们仅仅要调用一个对象的某个方法一次的时候能够使用匿名对象 2.匿名对象能够作为函数的实际參数 #imp ...
- POJ 3670 Eating Together 二分解法O(nlgn)和O(n)算法
本题就是一题LIS(最长递增子序列)的问题.本题要求求最长递增子序列和最长递减子序列. dp的解法是O(n*n),这个应该大家都知道.只是本题应该超时了. 由于有O(nlgn)的解法. 可是因为本题的 ...