Setting up an openvpn server isn't a diffcult thing, but you have to deal with root certificates, rsa keys, confs, subnet addresses, iptables ... such trifles are annoying. So I wrote this script to make my life easier, only to provide basic infomation like the server IP, and those configuraion will be done at the [...]
Django is a complicated but useful python web-framework, comparing to light weight frameworks like Bottle, web.py. I recently switch from Bottle, making use of it's powerful admin site to build a Email Account Management system. An AdminSite offer interfaces to manage databases. It includes traditional authentications, permissions, data display and POST saving mechanisms, etc. , [...]
What Beaker is a library for caching and sessions for use with web applications and stand-alone Python scripts and applications. -- Beaker Offcial Document Why I recently writting a small app running on Google App Engine, Beaker is the ideal midware working together with light weight python web frameworks, eg bottle, web.py, to handle session [...]
无关背景 Ubuntu 10.04 这个版本已经服役两年,虽说是LTS,但最近起发现已经有点力不从心,主要是ppa上一些比较重要的库,如PHP 5.3,ningx的团队已经停止维护,uwsgi则总是落后半年的样子。很大一个原因是这些包在新版的Ubuntu里面已经有官方维护,ppa的第三方维护会缺乏跟进。所以在一定意义上,可以宣布Ubuntu 10.04死亡了。 但Ubuntu的包维护策略就是那样,要么自己维护所有用到的包,要么每隔一段时间就跟着官方一次大升级。觉得不爽就干脆把VPS的系统也改成Archlinux。 现象 一番大迁移后所有的东西都正常上线,但直到一个多星期后的昨天晚上才注意到博客的性能问题。 因为博客那里有nginx直接读取静态的缓冲机制,所以动态执行非常慢之前都没留意到。 把缓冲关闭就非常明显了,任何一次点击的页面都要10秒才能打开。 排查 引起应用缓慢的因素是非常多的,概括来说有两种:IO慢、运算慢。 运算慢是不大常见的,虽说PHP性能一直受到诟病。但如果是这个问题是很明显的,top里面php的子进程会占满CPU,高居不下。此前排查过一个drupal的站点,是因为前端模板的组件方式存在循环引用,用profile过程看,正则替换的regrex函数占了绝大多的CPU时间。 在SSH看到,打开页面的10秒内php-fpm的子进程基本没占CPU,排除这个可能。 IO慢就复杂了,每个组件都有IO,得先确定IO的范围。 首先想到是数据库Mysql,arch的包太新,有bug?linode主机的磁盘快挂了,磁盘很慢?这些都不好判断,确定这些得借助工具。 Profiling是追踪一个应用的运行流程,记录所有的函数调用栈、记录调用时间的过程,是追查性能问题的最佳帮手。Python里面是有个repoze.profile的wsgi中间件很方便进行排查,但我没做过完整PHP开发,就暂时不大清楚有什么方便的profile方案 (以前弄过早忘了),但google一下还是有很多方案的 ,不过我首先想起newrelic的应用监控系统就提供了这个功能。 Newrelic针对WEB应用和服务器监控服务,其中的服务器监控是免费的,但对应用的监控只有14天试用;所以我赶紧重新申请个帐号,用来监控一下wordpress。安装好监控模块后,超过2s的响应会在他们的Transaction traces记录下来。 图表数据可以排除数据库问题,几十个数据库的操作都是在ms级别完成,而在apt-blog.net的耗时花了10秒。其实我一开始对这个报告也没看懂,newrelic的直观性还有待提高,其实在这里出现域名的意思是有网络请求,比如askimet的评论、插件的更新等都要和外部请求,这里就会出现域名。 而现在出现了自己博客的域名,那问题就是,程序里面某个地方需要请求自己的域名,可能是检查状态的操作,被卡住了,直到超时才返回。 本机程序访问不到本机,基本确定是iptables规则出问题了,在filter表的最后插入这样一句: -A INPUT -j LOG iptables的规则一般是,除非明文允许,否则拒绝,所以经过一系列的规则后如果还没有没ACCEPT的,在最后的都是被DROP了,把这句放最后可以看到究竟是什么包被DROP了。 查看/var/log/everything.log看到这样的记录: Mar 31 03:17:32 (none) kernel: [17554800.765033] IN=lo OUT= MAC=00:00:00:00:00:0 0:00:00:00:00:00:00:08:00 SRC=106.187.36.50 DST=106.187.36.50 LEN=60 TOS=0x00 PR EC=0x00 TTL=64 ID=31529 DF PROTO=TCP SPT=45594 DPT=80 WINDOW=32792 RES=0x00 [...]
Why 我家里用的是一家三线的便宜小区宽带,标称有几个M的带宽,虽说有些资源确实能达到这个速度,但发现直连VPN的速度从来都没上去过,大概30k/s,不难猜测到,ISP在链路上做了手脚,即所谓的Layer 7 Priority QoS。因为入线是100M进宅然后PPPoE,不像ADSL那样直接物理链路就限制了连接速度,在链路层做QoS也很合理。平时HTTP打开网页、下载到合适链路的话很容易达到满速,而OpenVPN的TCP/UDP包估计就被当成P2P流量被限制了,所以网速一点都不给力。 用OpenVPN科学上网是最稳定最灵活的方式了,它基于udp/tcp的协议,比pptp、l2tp等直接跑IP包的开销虽说大一点,但好处就是容易把数据流重新封装,避开链路的关卡。显然它也支持HTTP代理,所以把OpenVPN变成HTTP协议,就可以在家里跑上满速的VPN。 How OpenVPN要过HTTP代理,只能用TCP协议,这个需要服务端和客户端都要稍作修改。 Polipo as Tunnel Proxy 首先在VPS上安装一个http proxy,我选择polipo,比较轻量级。 apt-get install polipo 配置也是很简单的,编辑/etc/polipo/config,原来的配置文件基本全都是注释,直接在文件底部加上: proxyAddress = "0.0.0.0" proxyPort = 8128 authCredentials = "user:password3.141592654" tunnelAllowedPorts = 1194 polipo默认只监听本地的127.0.0.1,要拿来做服务就要监听外网 polipo默认监听8123,为了不让扫代理的盯上,自己随便写个端口 加上http basic验证,这个密码不要紧,后面让openvpn自动应答 允许管道模式连接openvpn的1194端口 OpenVPN Server 服务端倒是不需要很多配置,确定是tcp模式监听连接(我是多开一个openvpn server,子网错开,个人喜欢吧) Client 客户端就要指定使用代理的方式: remote 127.0.0.1 1194 http-proxy YOUR.VPS.IP.HERE.com 8128 pw.txt http-proxy-retry 这个pw.txt是上述的HTTP的认证信息,用户名密码各一行。 现在连接OpenVPN,可以看到连接过程的Log有这么几句,基本就确定OpenVPN over HTTP成功了! Sun Mar [...]
Gnome Desktop Environment的VNC服务开启很容易,仅需点开Desktop Sharing,打个勾就完了。 但是有时候某台工作站没有打开这个VNC服务,只有SSH,但是又必须通过桌面来操作,这时候自带的vino server就好像不容易跑起来。 x11vnc这个小工具就可以派上用场,它对当前的x11 session建立VNC服务,很简单直接运行x11vnc,就等你连接5900端口了。当然,如果一定要指定一个session,有个-display参数可以指定,或者看看x11vnc --help,好长好长~~~
uWSGI基本上是python做web服务的不二选择了,但似乎项目的开发者比较热衷于其新功能开发,对其使用文档还是相当缺乏的。 安装: Ubuntu 添加ppa,安装。 目前只有Lucid, Maverick, Natty几个版本还需要添加,以后版本都在官方原,直接apt-get install即可。 1 2 3 add-apt-repository ppa:uwsgi/release apt-get update apt-get install uwsgi-python Debian 目前Debian sid已经收录了uwsgi,一般服务器安装的testing/stable,只能自己修改apt的配置,从sid里面port过来。 注意:以下操作可能毁掉您的整个debian包系统。以下命令仅在Debian wheezy,即目前的testing运行测试安装过,如果你的是squeeze,自己修改01all那里 Pin: release a=squeeze 一行,但不保证能够正常运行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 echo "deb http://ftp.tw.debian.org/debian sid main non-free contrib" >> /etc/apt/sources.list cat > /etc/apt/preferences.d/01all << [...]
What 在Python里面,如果你使用上Qt,SQLAlchemy,Twisted之类各种大型类库时候,有时候多重继承Multiple Inheritance是个简单的解决方法,但是多重继承的复杂性总容易造成误解和疑惑。 一般“常识”说,使用super访问父类的属性/方法,这种说法在多重继承里面是不成立的,多重继承的类并没有父类的概念(There is no superclass in a MI world)。类似的博客在过去几年被人写了无数遍了,因为过去版本里面python官方文档对super的解释非常有限而且有误导解释,直到2.6以后的文档,才详细说明了super在单继承和多继承的两种不同工作方式。当时苦逼的程序员甚至不得不去翻看Python源码才搞清楚是什么回事。以致几年来很多人对python的多重继承保持怀疑态度。 Python多重继承使用Method Resolution Order的动态算法来解决一个方法名的调用顺序,mro其实说来简单,就是一个深度优先的继承列表,很易理解,但随之来的是遇到互不相同的构造器__init__参数的问题。 Codepad运行结果:http://codepad.org/qQNiMzBl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 class A(object): def __init__(self, arg1): print "init func in A, with arg1 '%s'" % arg1 super(A, self).__init__() class B(object): def __init__(self, arg1, [...]
Page optimized by WP Minify WordPress Plugin