随着各种SNS流行,写博客的人也越来越少,就连“博客伴侣”–Google Reader也关停了,写博客作为一个很好的分享和个人积累平台,一直坚持下来了,还将坚持下去。本文介绍自己如何在VPS上搭建自己的博客,这里使用”老派”的LAMP。随着云计算的流行,相信类似需求的人会增多,希望这篇博客能对其他人有点作用。
1. 选择虚拟主机(VPS)
这就是一件很烦人(因为穷)的事情。
如果选择国内主机,则可以考虑阿里云,基础配置单核/512MB/5Mb带宽每年价格大概在650左右,如果放弃独享带宽(个人博客应该无所谓),则可以降价到460块。
如果是国外主机的话,选择就比较多了,常见的有Linode,内存1GB的每年月1300元左右,因为有日本机房,所以对国外的主机来说,通常Linode速度更快(通常100ms-200ms);Dreamhost的VPS低配,300MB内存,每年约900元左右。常见选择还有Godaddy、budgetvm(便宜)等。
我选择的是digitalocean,因为便宜,使用1个月了,速度也很稳定。
digitalocean是最近兴起的极简云主机,号称55秒完成部署。整个购买、使用、付款都非常简洁,最大的特点是便宜,另外SSD硬盘也是一个亮点,经测磁盘性能确实不错,不过因为机房主要在欧美(纽约、旧金山、阿姆斯特丹)离国内都比较远,所以延迟较大,约300ms(ping一下我的博客就知道了,想想每次放我的博客,数据都从纽约过来,也就不觉得慢了)。价格比较便宜,360元每年,512MB内存,20GB磁盘。今年8月,digitalocean获得种子投资3百万美元,2012年从TechStars孵化出来。非常喜欢digitalocean的极简原则,别人在把功能做多,他在把功能做少。希望,自己以后的工作也能够是这个样子,现在这份工作是没戏了,不好意思,说多了。
2. 安装httpd+MySQL+PHP
博客使用的是WordPress,需要PHP环境运行,这里选择了LAMP。安装非常快捷:
yum install httpd
yum install mysql
yum install php
yum install php-mysql
service httpd restart
service mysqld restart or mysqld_safe &
在MySQL中建好Wordpress需要使用的数据库和用户。然后将Wordpress代码放到httpd的web目录中,在通过浏览器访问Wordpress就可以完成其配置。
3. 配置httpd和MySQL的内存使用
默认按照通常都能够跑起来,不过,如果按照默认配置跑,512MB很快会爆掉,从而出现OOM:
Out of memory: Kill process 27968 (mysqld) score 146 or sacrifice child
Killed process 27968, UID 27, (mysqld) total-vm:264472kB, anon-rss:73204kB, file-rss:36kB
3.1 MySQL的配置
设置50MB的InnoDB缓存空间,用于将Wordpress的内存缓存到内存中:
innodb_log_buffer_size=30MB
InnoDB的日志文件设置两组,每组50MB(这是消耗磁盘空间):
innodb_log_file_size=50M
innodb_log_files_in_group=2
这样MySQL内存使用能够限制在约50MB。
3.1 httpd的配置
httpd配置需要特别注意,默认配置内存消耗可能很容易超过512MB的限制。httpd2.2版本,默认情况httpd使用模块置prefork来多线程管理。它的默认配置是:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000</IfModule>
这意味httpd最多可以起256个进程处理请求,每个进程约占用35MB(RES),而且只有闲置进程超过20个(MaxSpareServers)才会清理,所以,这个配置下,通常都有20个进程常驻,内存使用就很容易超过512MB了。
下面是修改后的配置:
<IfModule prefork.c>
StartServers 3
MinSpareServers 2
MaxSpareServers 4
ServerLimit 256
MaxClients 10
MaxRequestsPerChild 100</IfModule>
这样最大并发是10个进程,当限制进程超过4个的时候,就开始kill。对于我这种低压力个人博客,已经够了。
最后,通常httpd使用模块prefork或者worker维护多线程,在这篇文章中Apache – prefork vs. worker mode, how to check mode and more,介绍了:(a)如何区分你使用哪个模块;(b)如何配置使用哪个模块;(c)他们的优缺点。
4. 配置swap
digitalocean的VPS默认是没有swap,所以内存一旦超出,则会立刻发生OOM。因为digitalocean以ssd为特点,所以直接用其磁盘来做一个swap分区弥补内存补足是非常好的。
操作参考:Linux Add a Swap File – Howto
在这自己购买VPS之前,一直蹭用Ningoo的Dreamhost主机,感谢。
后续还会再考虑测试使用Google App Engine和Amazon AWS。