VPS迁移:从OpenVZ到Xen

前阵子,在PhotonVPS上租的VPS到期了,当时图便宜,选用了基于OpenVZ的,结果这一年来,用得不甚舒坦。ssh连接上去,断断续续的的;OpenVPN装上去,为了nat之类的发了好久的ticket;博客打开的速度,也是老慢老慢的。趁着到期了,就琢磨着换成基于Xen的了。

在原来的机器上,大大小小的网站有10来个,每次需要增加新网站时,都是本着知根知底的态度,也没装个WebPanel,全是手工操作来增加Virtual Host,创建数据库,设置目录权限等。弄了几次终于累了。

Apache2的速度果然不是吹的,死慢,还巨吃内存。Word Press没搭几个,1G的峰值内存就全吃光了。就算照着网上的LAMP教程优化了一遍,也是没见起效。

Open VPN这玩意,既要有nat设备,还有设置iptables,更加有一堆证书。在我已知的任一平台上使用,都得额外安装软件,烦不胜烦。想想还是PPTP VPN好使,每个平台都默认支持,不用装其它软件,也没有证书之类的,很好操作。

基于以上几点,在迁移到Xen的过程中,做了如下改变:

Web服务器:Apache -> Nginx
网站部署:手动->使用自写脚本
VPN: OpenVPN -> PPTP

没变化 的也就php和mysql了。

在Apache下使用php基本上都是安装mod来达到支持php的,但使用nginx的时候,却没有这样的mod可以用,所以为了支持php,还需要安装一个php-fpm,在Ubuntu 10.04中,这个软件包名字叫php5-fpm。php5-fpm是一个服务,默认会监听在9000端口。在nginx的默认Virtual Host配置中,也有一段被注释掉的代码,包含有”location ~ \.php$”字样的。取消掉后重启就可以支持php了。

至于 PPTP,那就更简单了,aptitude安装好后,就直接可用了。只是默认是没有用户的,需要在/etc/ppp/chap-secrets里增加用户,并且密码是明文保存的。[2011-07-21更新] 漏了一步骤

iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -o eth0 -j MASQUERADE

因为我在/etc/pptpd.conf里设置了remoteip值为192.168.255.100-238,所以iptables中192.168.255.0/24表示我这个remoteip的网段了。[2011-07-21更新完毕]

至于自写脚本,贴上来仅供参考:使用之前请先过目,知道每条命令在做什么。

#!/bin/sh
USER=$1
SITENAME=$2

sample_conf() {
    echo "server {
        root /var/www/$SITENAME;
        index index.html index.htm index.php;
        access_log /access.log;
        error_log /error.log;
        server_name $SITENAME;
        location / {
            try_files \$uri \$uri/ /index.php?q=\$uri&\$args;
        }
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    }"
}

sample_conf $SITENAME > /etc/nginx/sites-available/$SITENAME
ln -s /etc/nginx/sites-available/$SITENAME /etc/nginx/sites-enabled/$SITENAME
mkdir /var/www/$SITENAME
chmod o+t /var/www/$SITENAME

## create database
DB_NAME=`echo $SITENAME | sed -e 's/\./_/g'`
mysql -uroot -p --password=MYSQL_ROOT_PASSWD -e "create database $DB_NAME"
mysql -uroot -p --password=MYSQL_ROOT_PASSWD -e "grant all privileges on $DB_NAME.* to '$USER'@'localhost' identified by ''"

exit 0

使用该脚本前,需要先创建一个用户。这个脚本会使用自动为指定的域名创建一个Virtual Host配置,并且创建一个数据库,让该用户对其有所有操作权限。脚本使用格式:./script USER SITE_NAME,如:./new_site.sh tiger blog.tigerlee.me

人太懒了,都静不下心来把个教程写完整,我知道这是缺点,得改。

让nagios报警消息重复通知

其实这也没什么好讲的,只要在service_tmpl.cfg中把notification_interval设置为不小于0的数字就好了,但实际上我在设定Nagios Server的时候,已经这么做了,但一旦报警通知发出,如果下次检查的时候仍为此状态,Nagios却不会继续通知。这让我郁闷了好久,相关的文档都翻阅了,还是不知道所以然。

后来不经意地在services.cfg文件中发现了这样的定义:

define service {
hostgroup_name                ssh-servers
service_description           SSH
check_command                 check_ssh
use                           generic-service
notification_interval         0 ; set > 0 if you want to be renotified
}

在具体的service中,居然把notification_interval设置为0了!怪不得不重复通知呢,我光改了模板文件,却没注意到具体的service都是由默认的service修改而来的,而默认的service,都将notification_interval设置为0了。知道原因后,马上将notification_interval删除,让其使用service_tmpl.cfg中的配置,然后重启nagios,就可以收到重复的报警消息了。