Ubuntu 16.04

前两天收到通知,说是我host在Azure上的这台VM,可以升级到Ubuntu 16.04了。趁着有空,就将它升了上去。

说起来,这台VM也经历好几次版本升级了。最初的时候,OS是Ubuntu 13.04。后来升级到13.10,再后来是14.04。每次升级都或多或少会遇到一些问题,要花些时间troubleshooting。因为怕麻烦,升到14.04之后就没继续折腾15.10,呆在14.04有两年多了。

因为之前升级的时候遇到过问题,我在今天升级之前还专门搜了搜,果然还是有不少人在升级16.04的时候遇到问题。为了以防万一,我觉着还是先做个备份比较保险。这时候就显出用Azure的好处了。Azure里有一个VMBackup服务,大大简化了云端虚拟机的备份和恢复操作,这个服务也支持Hybrid模式,可以将本地VM备份到云端。考虑到云存储非常便宜,这确实是个不错的功能。我之前就建了一个备份策略来保护这台VM,所以只要跑一下已经定义好的Job,备份就完成了。万一升级出了问题,恢复的话也是一个按钮的事。

备份好之后,我就开始跑升级。没想到还挺顺利的,除了mysql升级失败之外,没有遇到什么会导致升级失败的错误。查log之后发现,mysql之所以失败,是因为apparmor保护了一些路径。因为升级的过程中,我选择保留所有的旧的配置文件,这导致mysql需要访问的一些新的文件路径是被apparmor保护的。改了apparmor的设置,问题就解决了。fail2ban也遇到一样的问题,我在旧版里修改的jail rule有一个bug,但旧版忽略了,新版就出错无法启动。修了这个bug之后就好了。其他的服务都没有遇到问题,升级之后就立即可用了。

总之这次升级还蛮顺利的,一个上午就搞定了,我本来还打算搞一天的。

Linux VM on Azure: A Mail Server

I need a mail server which can serve emails with my own domains for a small group of users. I don’t want to go with Exchange server as it is too heavy. With some search on the internet, I decide to setup a small Linux node with Postfix on Azure. Such a small node only costs about $40/month which can be covered by my MSDN subscription, and it is good enough for the purpose.

I choose to setup the VM with Ubuntu server image. There are a lot of posts online about how to setup Postfix on Ubuntu. Particularly, I followed this one as I also need the virtual domain and virtual mailbox. It is quite clear and easy to follow, and I got the Postfix and Dovecot up and running by following it.

The missing parts of the above post are the anti-spam and anti-virus portion. Fortunately, Amavis-new + Spamassassin + Clamav make things a lot more easier. The Ubuntu help page here is good enough for the purpose.

With all these setup, I have a mail server which can send and receive emails. However, when I try to send emails to those big mailbox hosts like gmail or outlook, my emails are rejected as they don’t accept emails from dynamic IP range, which is unfortunately used by the public cloud vendors like Azure and AWS. So the only way to workaround it is to relay emails to a mail delivery service. With Azure, we can leverage SendGrid. SendGrid has a free plan for Azure accounts of which the quota is 25,000 / month. So I create a SendGrid account in Azure, and configure Postfix to relay emails to it. SendGrid has a short guide for it.

The only problem I encounter with the relay is that Amavis-new throws an error “TLS is required, but was not offered by host”. With some search, I find the workaround here. After fixing it, the emails can be accepted by gmail and outlook happily.

继续升级

上次尝试升级这个VM的OS,但是由于当时网络状况不稳定,失败了,于是就放在那里没管了一段时间。最近老有一堆提示说有安全补丁要打,操作系统需要升级什么的,看着心烦,于是昨天晚上就又尝试升级了一次。这次网络比较稳定,OS很顺利地就升到Ubuntu 14.04了。

但是,升级后apache遇到一些问题,原来的apache配置文件似乎不起作用了,网站无法访问。查了些资料,原来是apache 2.4的配置文件和语法有些变化,导致原来的配置文件不起作用或者有语法错误,所以配置失效了。比如apache 2.2的网站配置文件,在/etc/apache2/sites-available/目录里是没有后缀的,apache 2.4要求必须有后缀.conf等等。这篇问答里的答案,提供了不少有用的信息:403 error after upgrading to apache2.4

不由得想起有一次和人讨论为什么近来建在iis上的网站越来越多,我当时说,系统容易升级肯定是其中一个原因。我这只是个很小的Linux VM,除了跑AMP之外,几乎没有其他的应用和服务。而跑在AMP上的,也是相当成熟的Wordpress,可是升级一下系统,也会遇到一些细节的问题,对于那些复杂一些的网站,升级的难度可想而知了。所以,像Stackoverflow这样的大站,能够始终运行在微软最新的产品和平台上,就显得非常牛逼了。

Upgrade to Ubuntu 13.10

晚上花了一点时间,将server的OS从Ubuntu 13.04升级到了13.10。不得不再说一遍,Windows Azure对Linux的支持真是好啊。我升级之前还担心万一失败了,系统起不来怎么办。所以给OS和数据分区的vhd都做了快照,以防万一。没想到,直接用Ubuntu的升级程序 do-release-upgrade,就完成了系统升级,相当顺利。

只是在重起Apache服务的时候遇到了点问题。一开始服务起不来,显示如下错误:

Invalid command ‘LockFile’, perhaps misspelled or defined by a module not included in the server configuration

一通搜索,原来,Ubuntu 13.10的Apache已经升级到了2.4,LockFile这个关键字已经不再用了,2.4中改用Mutext来处理锁定。升级的时候,我选择保留原来的Apache2.conf,这样这个LockFile参数就还保留着。注释掉这一行之后,Apache就可以顺利启动了。有空我再研究,看看2.4的Apache2.conf和2.2的到底有什么不同。现在Apache服务启动正常,只是在读一个网站配置时,有如下错误:

AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/sites-enabled/default-site:2

另外,升级完成之后,php的mcrypt模块也有问题。在Stackoverflow上找到了下面的解决方法。

sudo ln -s /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available
sudo php5enmod mcrypt
sudo service apache2 restart

配置Windows Azure上的Linux虚拟机

之前的post里讲过,我已经将这个blog从之前基于Windows Azure web role的解决方案,迁移到目前的部署在Windows Azure中的Linux虚拟机上了。这两个周末都在折腾这个虚拟机,记录一些细节。

首先,在Windows Azure中部署Linux虚拟机其实并不复杂,Windows Azure的文档里有相关的说明,照着做基本就可以创建好虚拟机,唯一需要注意的是ssh的证书。当我部署完成的时候,甚至惊讶,原来微软对开源系统的支持已经这么好了。

我使用的是Ubuntu 13.04的模版创建的虚拟机,一切顺利。虚拟机创建好之后,就可以像普通ubuntu机器一样来配置Apache, PHP和MySQL了,Ubuntu的help里有相关说明。拥有自己的虚拟机的好处是,我可以掌控上到系统下到应用的一切。目前我在这个虚拟机上运行了WordPress, tt-rss和tt-rss mobile。有空再折腾别的有趣的应用。

需要注意的几点:

  1. Windows Azure的虚拟机除了运行OS的.vhd之外,还需要单独挂一个.vhd,作为数据分区。你可能会注意到,创建好的虚拟机中,除了OS分区,还有一个分区/dev/sdb1,mount到/mnt/resource,而且空间挺大,有100多GB。但是这个分区和Azure里的Windows虚拟机的D:分区一样,是Azure虚拟机用来放临时数据的,它的数据不会persist到你自己的storage里,所以你还是需要自己创建一个.vhd挂上。只有在自己storage里的.vhd的数据才是persistent的。我之前将一个网站目录放在/mnt/resource里,昨天就碰到了404的错误,日志显示是I/O错误。
  2. Windows Azure的虚拟机目前没有备份或快照整个虚拟机的功能。文档里关于capture image的文章并不是备份的方法,capture image会unprovision整个虚拟机。官方的备份方法是,对storage里的.vhd做快照。当虚拟机有问题的时候,就恢复.vhd的快照,然后重建虚拟机。我的快照还没做,要找时间做一下。

Update: 一个可以用来给.vhd做快照的免费的Windows Azure storage explore工具:Azure Explorer