一直以来都在Qzone、CSDN等上面写博客,偶尔有些想法就在Paas平台上搭建服务,新浪和曾经的google上都用过其appengine。但是在别人的平台上写东西,总归有些不方便,有受制于人的感受。《深刻理解Nginx》这本书的在线支持站点,当时由于时间紧,就随便在weebly平台弄了个下载示例代码和写做勘误的页面,毕竟离有效的在线支持网站仍是有差距的,至少读者不容易在网站上反馈。想到毕竟在阿里云的弹性计算工做,总不能都不用本身开发的产品吧?因而就买了阿里云的低端服务器,开始了个人第一次完整的建站历程。html
做为一个10年互联网后台开发经验的程序员,对于后台开发天然没有问题,但是仔细查了查本身的知识储备与建站所需的知识点,还真是不太匹配。我所熟悉的大规模分布式、高性能服务器设计,其实在流量极小的我的站点上用不上什么,小站点更强调的快速堆砌功能反而是我欠缺的。前端网页设计经验的缺少实际上是最大难题,对于HTTP协议和基本的HTML知识虽然熟,但是最须要了解的CSS、jQuery、JavaScript等却几乎就是门外汉。怎么入手呢?前端
先选定语言吧。虽然终年在C和C++上打滚,但对Python并不陌生,尤为是很是喜欢它的语法,很漂亮!更重要的一点是,它的开发效率正是这种小站点所须要的,运行效率差点反而无所谓。选定python,就选择了一条不断“找前人肩膀站立”之路了,不像C语言的项目经常须要“本身动手、丰衣足食”的完成各类组件,python项目就是找各类已完成组件,找到其相应的、与本身软件匹配版本的使用方法。python
先要选定web框架,而获得普遍应用的django就迈入了眼帘。如今它已经发展到了django1.6版本,就用最新的了,后面发现其新版本每每不兼容老版本上的组件,这好像是python世界的惯例,真够BT的(因此,virtualEnv才有市场,因此才须要在每一个python工程上使用virtualEnv虚拟python环境,以支持多个项目下同一个python组件的不一样版本并行存在)。有了django,其实不少web开发的组件都具有了。首先,django是一个“关系数据库驱动”的WEB框架,可见,其先天就是为小站点而生。安装了MySQL-python库后,就能够利用django的框架来快速操做mysql数据库了。django的模板系统也是必用的,它将表现层与业务层分离,即,将html与数据分离了,它的各类用法能够在djangobook中找到,固然,这本书的中文版有些老了,1.6的django须要找英文资料。有了模板和数据库的MTV架构,站点已经能够慢慢的边coding边调试了,咱们再来看环境。mysql
阿里云服务器实在是小站点的首选,我真不是在作广告:-)jquery
一、足够便宜。最低配是每个月55元,年付费还能便宜点。在最低配上如今负载都达不到0.1。linux
二、带宽不是按量计费的,而是限定了带宽的速度上限。对于没法预估流量的新网站,仍是适合的。并且,我能够把图片等耗流量的文件放在服务器上,而不用去考虑为了计费去把图片放在其余平台上,增长复杂度。nginx
三、IO虽然差,但是可靠性高,写磁盘时是强制3份数据写成功,潜台词就是我不用天天备份mysql数据、静态图片等资源了。这种小站点也用不到什么磁盘IO。程序员
四、若是真的站点访问量上来了,服务器资源不够了,加钱在线升级服务器配置呗。web
五、云监控是免费的。颇有用的东东,关键是不怎么消耗本就是低端服务器的linux资源,后文再详述。sql
六、带宽稳定。阿里巴巴的ABTN骨干网络仍是很靠谱的,对电信、联通网络的支持都很好。
七、备案方便,后文再详述。
购买阿里云服务器固然选择了linux系统,稳定高效的无二选择,随系统阿里云对linux赠送了20G的系统盘。通常来讲是够用了,主要是目前咱们在作云磁盘,使得用户购买的数据盘之后能够脱离虚拟机而存在。我但愿一些数据仍是放在数据盘方便之后的管理,就又买了块数据盘。须要注意的是,拿到root及密码、公网IP的服务器,SSH登上去会找不到数据盘,至少从容量上是找不到的,这是由于须要手工挂载。这个真的是阿里云弹性计算须要改进的地方。挂载方式在阿里云官网FAQ里都有。
接下来,就是要充分使用云主机了。目前云盾和云监控是免费的,云盾自动生效,而云监控是要安装一个agent在本身的服务器上,这个agent会按期的上报一些检查信息到云监控服务里,这样从WEB管理控制台上就能够设置监控阀值。每月有1000条免费通知短信,当服务器的监控项发生变化时,例如进程挂掉、磁盘写满等,就能够及时手机获得通知了。
下面开始讨论网站框架,以下图所示:
前端放Nginx基本是必须的,django没有并发处理能力,而Nginx能够处理十万百万级的并发链接。静态文件特别是大量的图片都交由Nginx加本地磁盘处理,其执行效率不用担忧,至少在如今的访问量下是无所谓的。Nginx的access访问日志很关键,它能够给出颇有意义的数据分析,因此,慎重设置它的格式,把想统计的信息都记录下来。而后安装awstats这个软件,配置好解析access日志的格式。将access按天来切分文件是个很好的处理方式,awstats的crontab脚本会分析、累加每一个过去日子的统计结果,使在页面上能够看到网站的运行状况。
若是是图片服务器,Nginx还能够承担更重要的责任,咱们常见的缩略图功能就颇有必要。原始图片可能以M为单位,传输这样的图片而后在浏览器上压缩为缩略图,这显示会耗尽咱们本就很少的带宽。将Nginx的proxy cache功能和image filter引入,就能够把图片在服务器端压缩后再缓存到硬盘里,下次拉取只取压缩过的图片,减小带宽的损耗。实际上image filter模块功能很弱,只支持一种压缩率,而Nginx的rewriter模块提供了脚本式的变量赋值功能,综合起来就能够很方便的提供各类压缩分辨率,例以下面这段配置,就能够根据URI内容来指定分辨率,并将压缩图缓存之:
location /static/resize { alias /mnt/nginx/resize_image; set $width 550; set $height 500; set $dimens ""; if ($uri ~* "^/static/resize_(\d+)x(\d+)/(.*)" ) { set $width $1; set $height $2; set $image_path $3; set $demins "_$1x$2"; } if ($uri ~* "^/static/resize/(.*)" ) { set $image_path $1; } set $image_uri static/image_resize/$image_path?width=$width&height=$height; if (!-f $request_filename) { proxy_pass http://127.0.0.1:9000/$image_uri; break; } proxy_store /mnt/nginx/resize$demins/$image_path; proxy_store_access user:rw group:rw all:r; proxy_temp_path /mnt/tmp/images; proxy_set_header Host $host; } location /static/image_resize { alias /mnt/images/; image_filter resize $arg_width $arg_height; image_filter_jpeg_quality 75; allow 127.0.0.0/8; deny all; error_log /tmp/test.log debug; } location /static/image { alias /mnt/images/; }
django定位为处理动态内容,其实也就是除了静态文件外的全部URL。由django的模板设计HTML,而由mysql里的数据来渲染模板输出HTML页面。这套系统在django book中有详细描述,这里不提。同时,mysql的访问速度是较慢的,用全内存的memcached服务来缓存mysql表数据也是一个很好的选择。django book里仍然有说过用法。
站长管理站点内容时,使用admin功能来直接修改mysql数据库是个几乎最佳选择。django先天对此支持的极好。因此,站点内容尽可能向mysql里放吧,这样能够彻底在web页面上来管理站点,而不用ssh登上后操做。
对于我最不熟悉的CSS就彻底靠bootstrap了。这套系统把常见的CSS、js、jquery都封装成各类CSS类了,使用起来很简单,轻松把一些复杂的页面功能搞定。
若是是博客,那么评论系统就很是重要。固然,本身搞一个用户系统确定不靠谱,多少用户会在一个小站点上在注册用户记住密码呢?使用已有的如微博、QQ等账户系统确定是利人利己的。基于这样的登录系统再存储评论数据固然是王道,但是时间有限啊,实在没功夫了,这时看到了多说,这个平台就是为小站点们建立的,它把各站点的评论数据放在它的数据库里,这也是多说能拿风投的核心竞争力了吧?使用多说很方便,直接复制一些代码就搞定了。
怎样录入博客呢?输入字符串加回车?太简单了,这样的博客太难看。输入HTML代码?太复杂了,每篇博客使用html的各类标签,效率过低了。因而,在python世界就主推了一个文档语言,叫作reStructureText格式,简写为RST格式。使用它来录入博客内容,再用一些python库将RST格式转到HTML格式便可。在django1.6中,我使用了rstify库来完成转换工做。
一个技术站点最重要的就是展现源代码了。若是能把源代码按语法来展现,相似“printf“这样的关键字高亮显示,岂不是很好?已经有pygments库完成这件事了,同时,rstify就集成了这一功能,使得在rst格式的输入中直接在HTML加CSS指定样式里能够高亮显示源码。
最后说说备案那些事。web服务调试经过,域名也买好了,但是用公网IP访问就是好的,用taohui.org.cn域名访问却老是失败!查看access日志看到错误码是499,很诡异,这是客户端程序主动关链接,可能吗?客户端是浏览器,不会干这事的。那必定是云主机前端的网络出问题了。查了下才发现,原来是国内的Iaas提供商都强制域名必须先在国家备案才容许访问!因而开始查如何备案。阿里云的备案算是很是替小站长考虑了,一系列流程均可以在家用电脑搞定,发拍照的备案幕布速度很快,基本一周搞定,域名可使用了。
转自:http://blog.csdn.net/russell_tao/article/details/20065881