邪罗刹的菠萝阁


前天晚上小邪折腾了一晚上 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
              ^
Leave a comment
60 Comments.
  1. 小邪 Google Chrome Windows 坐沙发!#1

    第一次+难得自沙一下。因为 uWSGI 只是运行 Python web 程序的一种方法。还有很多方法,不知道为什么现在运行 Python web 程序有那么多方法,小邪正在试图找一个合适的、高效的、有高用户群体支持的途径。

    @
    • @小邪 , 最近小邪比较关注的就是直接运行 Tornado http server 然后用 Nginx 作为代理。
      这里面很多概念感觉很复杂,uWSGI 是一种 WSGI 服务器。
      查自wiki“所谓的 WSGI中间件同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用:从WSGI服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。”

      @
    • @小邪 , 因为今天小邪试图在 uWSGI 上面运行 Tornado 官方提供的 WSGI 例子,但是不管怎么弄都提示 Application not found,应用无法被找到。
      网上也找不到 Tornado + uWSGI 的任何有效信息。那么有种可能性就是这样用并不好。

      所以引出此次自沙事件 :neutral: :neutral:

      @
      • @小邪 , Tornado不必运行在uWSGI上,它本身就是一个Server,它可以支持WSGI。

        @
        • @SErHo , 所以其实最好的 Python + PHP 的方法是用 Nginx 反向代理到 Tornado? :neutral: :neutral: :neutral:

          @
          • @小邪 , 不是这个意思。

            @
            • @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 , 啊,没有没有,小邪表达错了,小邪的意思是说,是不是 Tornado 的性能比 uWSGI 好呢?

              @
  2. SErHo Google Chrome Ubuntu Linux 坐板凳!#2

    我直接使用的是Centos 6,Python版本已经是2.7了,博客没有使用uWSGI,直接跑在Tornado上,如果使用Bottle,那可以看看里面支持的Server,几乎包含了Python里所有的。

    @
  3. 小闇 Google Chrome Mac OS 躺地板!#3

    好凶殘的代碼 :evil: 除了img以外全是不懂滴 不愧是服務器控…
    ps 你這兒只能用中文寫評論 試著用日文寫然後被拒絕了 :cry: :cry:

    @
  4. 小闇 Google Chrome Mac OS 天花板!#4

    なるほど、わからん :!:

    @
    • @小闇 , ぼくはわからない  :!: :!:
      Mac居然有那么给力的罗马音输入法 :idea:
      话说如果要表达 “也”,应该如何修改小邪这句话呢?

      @
      • @小邪 , 先解釋一下 「なるほど、わからん」是在pixiv上的標籤,表示「看了也不明白」。所以小邪你回應我「我也不明白啊」令我有點 :?: 了,是指看不明白評論麼?btw 我不是用mac自帶的日文輸入法 傳送門:http://goo.gl/RNqmn 如果你想表達「我也不明白」那應該是「僕もわからない」 :smile:

        @
        • @小闇 , 嗯嗯,因为咱当时的确还是不明白,写完文章依然发现许多疑问,所以才问了 SErHo 那么多问题,不过现在懂了。 :mrgreen: :mrgreen: :mrgreen:

          话说咱是不是直接打成那啥平假音了?

          @
      • @小邪 , 知らないある :oops:

        @
  5. 小邪 Google Chrome Windows 下水道!#5

    Ok,nginx 反向代理 tornado http server 做好了 ~
    欢迎围观 http://devil.im/

    @
  6. 唔... 技术渣渣表示没有能力评论... 只能说学习了...

    @
  7. 小邪也是个域名控!

    @
    • @小松 , 嘿嘿,被你发现了,但是好像这年头 .im 玉米不是很流行,好奇怪喔,难道是不用信用卡的话很难买么?

      @
  8. 小邪,有QQ数据库和银行数据库下载地址么,有的话给回个EMAIL

    @
  9. 驚くべきevlos
    小邪绝对是服务器倥……
    Python就是一个服务平台,可以脱离除操作系统之外的任何支持软件

    @
    • @千与琥珀 , Python太帅了,今天本来想写javascript控制cookies的,但是如果直接用浏览器打开html文件,文件中的代码是木有权限设置cookies的,必须要在http环境下(用localhost方式访问的时候)才行,但是这台本本上木有装apache,就果断用tornado跑了!!

      @
  10. Python 果断看不懂

    @
  11. 恩,都看不懂= =
    我是来祝个新年好的

    @
  12. Python果断不懂,还是预祝小邪元旦快乐了!

    @
  13. 求助啊 懂VPS的小邪 我的时间怎么弄都是美国时间 :eek:

    @
  14. :?: 今晚打算写个python去抓图。。。 :grin:

    @
  15. 搞这种高深技术的只有绕过了。

    @
  16. 神马是img标签,傻傻看不明白

    @
  17. 你也学python了,看来python还真是开始流行了啊。我以前经常用python做一些数据处理工作,发现python才是最简单的啊。现在python在web上用的也非常好了。SAE也支持python了

    @
    • @rusaer , 恩恩,尤其是咱发现 instargam 也在用 python 的时候,而且 mongodb redis 太帅了!!

      @
  18. 千色色⋯⋯

    @
  19. 本来想搞个反代的。不知道哪点没搞对。。结果后来http都打不开了。。。只好重装。。。

    @
  20. 这么高深的东东,我只知道,我很喜欢的一个源码,它是用python写的,我不会 :cry:

    @
  21. .......架构太复杂了......感觉如果只是个Blog日访问量不到1W IIS其实都可以扛住的...架构太长数据交互方面出现的不稳定性会大大增加.

    @
  22. QAQ我超讨厌python啊运行起来各种莫名其妙的错误QAQ....!!

    @
  23. 技术控,域名控,问一下哦,YUI什么意思啊,你名字的缩写? :twisted:

    @
  24. :razz: 折腾才是王道!

    @

Leave a Reply


[ Ctrl + Enter ]