一直以來都在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