前天晚上小邪折腾了一晚上 Python,因为小邪现在 VPS 的 Webserver 环境是由 Linux + Nginx(前端)+ Apache(解析PHP)+ Mysql + PHP + Memcached,而这次折腾的目的就是想把 Python 的 Webserver 组合到 Nginx 里面一起运行。
小邪查看了一些资料,发现 uWsgi 是目前效率灰常不错的 Python 应用容器服务器,并且可以通过 uwsgi 协议和 Nginx 协调工作。所以就果断开始折腾,目前已经搞定,请大家通过 Yui.im 传送门进行围观。

一. 为 Nginx 安装多站点的 uWsgi (Python) 支持:
以下都属于 SSH Bash 下的操作以及代码,小邪就直接用代码高亮 + 注释贴出来了喔 W( ̄w ̄)W。注意,/home/py 是小邪的 Python 虚拟环境根目录,/home/py/yui-im 是小邪用于测试的虚拟环境目录,这两个地址以及 yui-im yui.im 字符串请大家按照自己的需要修改,现在可以点击此传送门查看小邪的 hello world - http://yui.im/
#首先小邪要升级 Python,不需要的童鞋请跳过 wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 tar jxvf Python-2.7.2.tar.bz2 cd Python-2.7.2 ./configure make && make install mv /usr/bin/python /usr/bin/python.bak #备份原文件 ln -s /usr/local/bin/python2.7 /usr/bin/python python -V #查看目前系统默认 Python 的版本
#然后安装python下的安装管理器 wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py #安装Vitualenv(Python的虚拟环境,像虚拟机一样的) easy_install virtualenv mkdir /home/py/ #小邪用 /home/py/ 作为虚拟环境根目录 virtualenv --no-site-package /home/py/yui-im #yui-im 文件夹作为本次测试用的单独虚拟环境文件存放地址 cd /home/py/yui-im/bin source activate #激活此虚拟环境 #在激活的虚拟环境中安装bottle web框架 pip install bottle #用于在最后测试安装是否成功
#安装uWsgi wget http://projects.unbit.it/downloads/uwsgi-0.9.9.3.tar.gz #最新版本可见 http://projects.unbit.it/uwsgi/wiki/WikiStart#Getit tar zxvf uwsgi-0.9.9.3.tar.gz cd uwsgi-0.9.9.3 make #不用install #移动一下安装位置方便使用 mkdir /usr/local/uwsgi cp uwsgi /usr/local/uwsgi
<!-- 此文件是 uwsgi 虚拟主机的配置文件,就像 nginx 下的 vhost 一样 --> <uwsgi> <socket>127.0.0.1:4040</socket> <module>[WSGI Script (index)]</module> <limit-as>256</limit-as> <harakiri>30</harakiri> <processes>8</processes> <master /> <memory-report/> <vhost/> <no-site/> <logto>/home/logs/yui-im.log</logto> </uwsgi> <!-- 将此文件保存到 /root/yui-im.xml -->
<!-- 以下内容保存为 yui-im.conf 放入 nginx 的 vhost 文件夹 -->
server
{
listen 80;
charset utf-8;
server_name yui.im www.yui.im;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:4040;
uwsgi_param UWSGI_PYHOME /home/py/yui-im;
uwsgi_param UWSGI_CHDIR /home/py/yui-im;
uwsgi_param UWSGI_SCRIPT index;
}
access_log off;
}
#以下内容保存为 /home/py/yui-im/index.py
from bottle import route, run, default_app
@route('/')
def index():
return "<html><head><title>Hello World</title></head><body>Hello world lol ...</body></html>"
if __name__ == "__main__":
run(host="localhost", port=8888)
else:
application = default_app()
#最后reload一下nginx。 #接着启动uwsgi,以下命令可以放到 /etc/rc.local 里面开机启动 /usr/local/uwsgi/uwsgi -x /root/yui-im.xml
二. 凶残的 IMG 标签:
请直接查看下面的代码与注释,这种用法有好处也有坏处。好处是可以用在 Single Sign On 单点登录系统的同步登录与退出,这样可以直接在同一个页面内对多个站点进行 GET 操作。坏处是如果拿来恶作剧的话就蛋疼了,以下第一行是用法,第二行是例子。例子里面的 URL 是 BILIBILI 站点的登出 URL,如果你浏览了某个包含下面第二行代码的网页,就会立即登出 BILIBILI,大家可以想像如果用在坏处就杯具了。
不过理论上 PHP 里应该可以防护这种攻击,有兴趣的童鞋可以去研究一下。
<img src="请求URL" width="1" height="1" /> <img src="http://member.bilibili.tv/logout" width="1" height="1" />
三. 尾记:
小邪折腾了一晚上安装 uWsgi,一直都提示错误 application not found 找不到应用。最后一看 index.py 第一行,from 写成 form 了。
顿时一口老血喷在显示器上。
//错误日志,嗯嗯,错误日志是好东西啊
SyntaxError: invalid syntax
unable to load app mountpoint=yui.im|
yui.im {address space usage: 14065664 bytes/13MB} {rss usage: 4268032 bytes/4MB} [pid: 4400|app: -1|req: -1/10] 220.255.1.84 () {50 vars in 840 bytes} [Wed Dec 28 00:51:23 2011] GET / => generated 48 bytes in 2 msecs (HTTP/1.1 500) 2 headers in 63 bytes (0 switches on core 0)
File "/home/py/yui-im/index.py", line 1
form bottle import route, run, default_app
^
第一次+难得自沙一下。因为 uWSGI 只是运行 Python web 程序的一种方法。还有很多方法,不知道为什么现在运行 Python web 程序有那么多方法,小邪正在试图找一个合适的、高效的、有高用户群体支持的途径。
@小邪 , 最近小邪比较关注的就是直接运行 Tornado http server 然后用 Nginx 作为代理。
这里面很多概念感觉很复杂,uWSGI 是一种 WSGI 服务器。
查自wiki“所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。”
@小邪 , 同时 Tornado 可以作为一个 WSGI 服务器,同时也可以在其他 WSGI 服务器内运行(目前小邪无法在 uWSGI 里运行,正在继续查找原因中。)
@小邪 ,
暴力杀发.
@小邪 , 因为今天小邪试图在 uWSGI 上面运行 Tornado 官方提供的 WSGI 例子,但是不管怎么弄都提示 Application not found,应用无法被找到。
网上也找不到 Tornado + uWSGI 的任何有效信息。那么有种可能性就是这样用并不好。
所以引出此次自沙事件

@小邪 , Tornado不必运行在uWSGI上,它本身就是一个Server,它可以支持WSGI。
@SErHo , 所以其实最好的 Python + PHP 的方法是用 Nginx 反向代理到 Tornado?

@小邪 , 不是这个意思。
@SErHo , 诶?!那么就是如果要用 tornado + php,最好的方法就是 nginx 反向代理过来而不是去用什么 wsgi?
顺便请教俩个问题:
1)一般启动 tornado 的方法都是 exec index.py & 这样么?
2)tornado 多站点是不是交给 nginx 来管理即可,也不需要 virtualenv?
@小邪 , 如果只是使用Tornado,直接Nginx反向代理就可以了,Tornado既是一个Web框架,也是一个异步的Web服务器,效能不错。
1.管理Python进程可以使用Supervisord,非常方便,参考:http://feilong.me/2011/03/monitor-processes-with-supervisord
2.virtualenv是用来建立虚拟环境的,当你使用多个相同包的不同版本时,可以用到。而多站点就不必用了,只需要像使用虚拟主机一样,用Nginx监听不同的端口就行了,这样的话,每个站点只需要端口不一样就可以。
@SErHo , 原来如此,现在完全明白了嘿嘿嘿嘿。开搞

@小邪 , 嗯,我的回复怎么不见了,快去垃圾留言看看。
@SErHo , 囧,理论上不可能到垃圾评论里面去的诶,居然真的在。救回来了。
@SErHo , 啊,没有没有,小邪表达错了,小邪的意思是说,是不是 Tornado 的性能比 uWSGI 好呢?
我直接使用的是Centos 6,Python版本已经是2.7了,博客没有使用uWSGI,直接跑在Tornado上,如果使用Bottle,那可以看看里面支持的Server,几乎包含了Python里所有的。
好凶殘的代碼
除了img以外全是不懂滴 不愧是服務器控…

ps 你這兒只能用中文寫評論 試著用日文寫然後被拒絕了
@小闇 , 诶,日文不行?那么小邪果断关闭反英文插件。以后全手工反SPAM

@小闇 , OK,求本博第一条日文评论

@小闇 , 太恐怖了,关了两天一下子就进来400多条英文垃圾留言。。。。
咱不得不再次开启了,下次随便打个中文在日文句子后面算了 囧。。。
なるほど、わからん
@小闇 , ぼくはわからない


Mac居然有那么给力的罗马音输入法
话说如果要表达 “也”,应该如何修改小邪这句话呢?
@小邪 , 先解釋一下 「なるほど、わからん」是在pixiv上的標籤,表示「看了也不明白」。所以小邪你回應我「我也不明白啊」令我有點
了,是指看不明白評論麼?btw 我不是用mac自帶的日文輸入法 傳送門:http://goo.gl/RNqmn 如果你想表達「我也不明白」那應該是「僕もわからない」 
@小闇 , 嗯嗯,因为咱当时的确还是不明白,写完文章依然发现许多疑问,所以才问了 SErHo 那么多问题,不过现在懂了。

话说咱是不是直接打成那啥平假音了?
@小邪 , その通りです!
@小邪 , 知らないある
Ok,nginx 反向代理 tornado http server 做好了 ~
欢迎围观 http://devil.im/
唔... 技术渣渣表示没有能力评论... 只能说学习了...
@conanshang , 加油拉,大家一起努力呗 ~

小邪也是个域名控!
@小松 , 嘿嘿,被你发现了,但是好像这年头 .im 玉米不是很流行,好奇怪喔,难道是不用信用卡的话很难买么?
小邪,有QQ数据库和银行数据库下载地址么,有的话给回个EMAIL
@FORECE , 。。。。。咱应该有么 。。。

驚くべきevlos
小邪绝对是服务器倥……
Python就是一个服务平台,可以脱离除操作系统之外的任何支持软件
@千与琥珀 , Python太帅了,今天本来想写javascript控制cookies的,但是如果直接用浏览器打开html文件,文件中的代码是木有权限设置cookies的,必须要在http环境下(用localhost方式访问的时候)才行,但是这台本本上木有装apache,就果断用tornado跑了!!
Python 果断看不懂
@无冷 , 那么路过就行了 =w=
恩,都看不懂= =
我是来祝个新年好的
@Veezy , 嘿嘿,新年好,2012船上见 - -
Python果断不懂,还是预祝小邪元旦快乐了!
@Kayo , 新年快乐喔 OwO
求助啊 懂VPS的小邪 我的时间怎么弄都是美国时间
@软件风暴 , 很多vps的时间是和母机保持同步的,要想不同步很难的,不如在php程序里面修正。
@fatkun , 嘿嘿嘿嘿嘿,咱已经很猥琐地抓了20333张图了 。。。。在k站。
搞这种高深技术的只有绕过了。
@wmtimes , 冷静骚年
@小邪 , 我是提前祝春节快乐!看你没有新文章就写这儿了。
@wmtimes , 新年快乐 ~
嘿嘿,最近木有时间写文章,学习得抓紧啊,博客学习法在要求较高的时候还是效率相对较低了。
神马是img标签,傻傻看不明白
@axiu ,
就是html里面插入图片用的内个~~
你也学python了,看来python还真是开始流行了啊。我以前经常用python做一些数据处理工作,发现python才是最简单的啊。现在python在web上用的也非常好了。SAE也支持python了
@rusaer , 恩恩,尤其是咱发现 instargam 也在用 python 的时候,而且 mongodb redis 太帅了!!
千色色⋯⋯
本来想搞个反代的。不知道哪点没搞对。。结果后来http都打不开了。。。只好重装。。。
这么高深的东东,我只知道,我很喜欢的一个源码,它是用python写的,我不会
.......架构太复杂了......感觉如果只是个Blog日访问量不到1W IIS其实都可以扛住的...架构太长数据交互方面出现的不稳定性会大大增加.
QAQ我超讨厌python啊运行起来各种莫名其妙的错误QAQ....!!
技术控,域名控,问一下哦,YUI什么意思啊,你名字的缩写?
@周良 Yahoo User Interface吧