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 [...]
无关背景 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,好长好长~~~
Nginx团队维护的PPA源带有PHP 5.3.x的子源,更新迅速,现在在Ubuntu部署Nginx+PHP环境真是太容易了(虽然LAMP更容易,一句apt-get install lamp-server^搞定,别漏了最后的上尖号)。像以前那样跑cgi-fcgi简直弱爆了。 UPDATE: 2012/03/15 Nginx的ppa团队决定不再维护php包了……所以只能用别人的ppa.. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apt-get install python-software-properties add-apt-repository ppa:nginx/stable #add-apt-repository ppa:nginx/php5 #not valid any more add-apt-repository ppa:brianmercer/php5 #Ubuntu 10.10 以后可不需添加以上源 apt-get update apt-get install nginx apt-get install php5-cgi php5-mysql php5-fpm php5-curl php5-mcrypt #或者你需要更齐全的php包: [...]
Mercurial/hg是分布式版本管理工具之一,如google code等公共代码服务都直接支持。不过公共服务通常都有如公开开源、空间大小等等的限制,如果特殊情况,需要自己在VPS上假设一套,也不太难。 如果单独一个hg仓库,直接运行hg serve就已经是在线仓库,用nginx做的http_proxy反向代理就够了,各种功能齐全。但是要host多个hg仓库,需要用hgwebdir。 Ubuntu当中安装的mercurial已经包含了架设仓库所用的程序,包括cgi/fcgi/wcgi的,主接口在/usr/share/doc/mercurial-common/examples下的hgwebdir.(ws|(f)c)gi。虽然其中的wsgi有效的只有三行。 Mercurial官方Wiki上主要介绍了用apache2来跑cgi方式的仓库,但是作为python的程序,wsgi才是最原生的嘛。用Nginx+uwsgi的方式,资源占用、响应效率等,都要比apache + cgi靠谱。 Nginx+uwsgi的方式很普遍,参见本博客之前的MoinMoin 与 Nginx, fastcgi 与 uwsgi 的配置一文。 但是因为uwsgi处于快速开发过程当中,ppa的打包也还不十分成熟,里面的路径跟以前有些不一样了。 add-apt-repository ppa:nginx/stable add-apt-repository ppa:uwsgi/release apt-get update apt-get install nginx uwsgi-python python-virtualenv mercurial mkdir -p /var/www/hgwebdir virtualenv /var/www/hgwebdir/python-home cat >/var/www/hgwebdir/hgwebdir_wsgi.py << EOF from mercurial import demandimport; demandimport.enable() from mercurial.hgweb.hgwebdir_mod import hgwebdir class hgwebdir_with_fixed_staticfile(hgwebdir): def __call__(self, env, respond): [...]
Update Vimpress 已经升级到2.x版本,使用、配置都有改进,请关注在vim.org的插件页面: Vimpress had been updated to 2.x, usage and configurations are now different, read the officle page in vim.org: http://www.vim.org/scripts/script.php?script_id=3510 If you noticed Vimpress before and got more than one wordpress to write, must glad now to know this VimRePressed support multiple configs and swith freely. The new VimRePressed (Version: 1.2.0) Changes: Add: [...]
WordPress的缓冲插件wp-super-cache默认支持apahce的缓冲方式,在生成了静态页面数据后,通过.htaccess的规则直接让apache读取静态文件,完全不经过PHP,可以很大的提高博客的页面性能。 但是Nginx的改写规则就没这么容易让代码来配置了,虽然wp-super-cache的第二种缓存方式就是为这种使用环境设计,但实际上是用了PHP来提供静态数据了,在使用apache benchmark压力的时候,php-cgi依然占很高的CPU占有率。 通过编写nginx的rewrite规则还是可以让nginx直接读取静态文件,参考来自Code Exchange: nginx rewrite rules for WordPress + WP Super Cache,这里的配置被很多地方引用过,但实际尝试使用过程看到那里面的代码还需要微调。 server { listen 80; server_name apt-blog.net; root /var/www/pt-sites/wordpress; index index.html index.htm index.php; location / { # enable search for precompressed files ending in .gz # nginx needs to be complied using –-with-http_gzip_static_module # for this to work, comment out if using [...]
Page optimized by WP Minify WordPress Plugin