原文鏈接 : http://www.bugclosed.com/post/14
從零搭建個人博客網站需要包括雲服務器(虛擬主機),域名,程序環境,博客程序等方面。本博客 就是通過這幾個環節建立起來的,下面總結梳理一下環節的具體過程。
雲服務器
博客程序需要有一個服務器部署和運行,所以首先需要選購一個雲服務器。阿里雲是國內最大的雲廠商,簡單起見直接選購阿里雲的入門級ECS(1核,1G內存,1M固定帶寬,20G SSD磁盤)。初始化主機選擇centos7.2系統,可同時在后台初始化的時候設置好root初始密碼。
需要注意的是,該級別的ECS是屬於彈性網絡,即公網IP和ECS是分離的,在ECS上 ifconfig並不能看到公網IP,只能看到內網IP;阿里雲會通過自己內網的路由功能將阿里雲后台上看到的公網IP映射到具體的ECS上,所以在這樣的機器上部署程序是不能綁定公網IP的,程序只能綁定內網IP。當然也可以選購的時候選擇阿里雲的經典網絡,保持主機公網和內網IP都是綁定在ECS上,不過價格會稍微貴一點。
域名
有了雲服務器之后,就有一個地方可以部署博客程序,也有了一個公網IP可以訪問到這個機器,但是不能每次訪問都輸入晦澀難記的IP來進行,需要一個方便易用的域名來代替。域名可以通過萬網(已經被並入了阿里),godaddy等域名服務商購買。
我選擇在godaddy上購買,選擇一個沒有被注冊的購買即可,不同域名價格不一樣,選擇一個合適自己的。2018年1月1日實行的新規,只有國內域名服務商購買的域名才能備案。因為我的域名是在godaddy上, 所以需要轉移到國內服務商后,再備案。
有了域名之后,需要用到DNS服務將域名解析到IP,因為我是在godaddy上購買的域名,默認是使用godaddy的DNS服務。但是服務器在阿里雲,為了以后操作方便(godaddy有時候國內訪問不穩定),准備使用阿里雲的域名解析服務。先在godday的后台將新域名的DNS服務器設置成阿里雲的DNS服務器ns1.alidns.com和ns2.alidns.com;然后就可以再阿里雲的控制台中“雲解析DNS”里,將新域名的A記錄指向申請的ECS的公網IP,這樣就可以通過域名直接訪問到服務器。
好景不長,因為域名是要實名備案的,沒有備案的域名,會被block掉。一般新域名使用1-2天就會被block掉,除非進行實名備案。幸好阿里雲有專門的備案系統,在阿里雲主頁右上角的“備案”里面就可以找到。域名備案需要實名制,需要用到身份證照片,手機號,個人照片,家庭住址等信息,還需要填寫域名網站的基本信息,總之按照阿里雲備案系統的向導一步一步走即可。
系統軟件環境
主要軟件環境:
- 系統centos7.2
- git2.9+
- golang1.8+
- mysql5.7
- 博客程序: wbog
其中git2.9采用源代碼安裝,下載地址 為了支持https,源代碼安裝git之前,先yum安裝curl curl-devel之后,再手動安裝git。
關於博客開源程序,比較后選擇了 wbog,這套程序純golang開發,簡單易懂且可塑性強,安裝環境依賴小。wblog的安裝參照github的安裝說明即可簡單安裝。
另外需要說明的是,為了mysql能夠支持emoji表情存儲,mysql特地安裝了5.7版本,安裝參考, 簡單總結步驟如下:
- wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
- rpm -ivh mysql57-community-release-el7-8.noarch.rpm
- yum install mysql-server mysql-client mysql-devel
部署運行
程序的編譯運行很簡單,只需要在wblog的原碼目錄編譯成功后(go build),即可直接運行啟動(./wblog運行);程序默認是8090端口,需要自行修改,且在iptables上打開對應端口,以及在阿里雲后台將ECS的安全策略組中開放對應的端口即可。
我安裝了supervisor,將wblog托管其中,方便管理維護。
wblog幾處修改
wblog總體上基本滿足了個人博客的各種基本功能,能夠發帖,評論,增刪改等,且只是markdown格式編輯,不過自帶的markdown編輯器使用起來不太好用,可以考慮之后優化一下。在安裝部署調試過程中,對原始wblog庫做了幾點小調整,具體如下
1.修改存儲引擎
wblog默認使用sqlite3,修改成了鏈接mysql數據庫,需要在配置文件conf/conf.yaml中修改存儲配置:
dsn: mysql:mysql@tcp(127.0.0.1:3306)/wblog?charset=utf8&parseTime=True&loc=Local
且修改db初始化代碼models.go:InitDB():
db, err := gorm.Open("mysql", system.GetConfiguration().DSN)
conf中的mysql地區配置這里有一點小坑,默認采用的loc=Asia/Shanghai, 啟動wblog會報錯:
[main.go:45] [main.main] err open databasesdefault addr for network '/wblog?charset=utf8&parseTime=True&loc=Asia' unknown
分析原因后是因為Loc的value里面有一個反斜杠‘/’,導致啟動參數判讀出現錯誤,暫時通過修改loc=Local修改后正常運行。
2.emoji支持
為了未來支持emoji,mysql數據庫需要支持utf8mb4的5.7版本,程序orm自動生成數據庫表和創建數據庫都需要制定utf8mb4格式,數據庫創建:
create database wblog default character set utf8mb4;
程序修改models.go.InitDB():
db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&Page{}, &Post{}, &Tag{}, &PostTag{}, &User{}, &Comment{}, &Subscriber{}, &Link{})
3.orm mysql table string類型
wblog中數據庫表結構中字符串類型string,映射后的默認長度是256字節。部分場景下這個長度是合適的,但是在post表中的博客內容字段,顯然256肯定不夠,需要手動修改成映射text類型字段。修改models.go中的Post結構體:
type Post struct {
BaseModel
Title string // title
Body string `sql:"type:text;"`//---指定映射成text類型
View int // view count
IsPublished bool // published or not
Tags []*Tag `gorm:"-"` // tags of post
Comments []*Comment `gorm:"-"` // comments of post
}
4.主頁文章列表增加閱讀數
wblog默認在主頁的文章列表的摘要信息中只顯示了文章title和創建時間。為了在主頁一目了然了解文章的訪問情況,在創建時間旁邊增加了閱讀數量限制。在Post表中的view字段已經保存了閱讀量,只需要在index模板中顯示出來即可。
{{range $postkey,$postvalue:=.posts}}
<div class="articleInfo">
<span>
<a class="articleTitle" href="/post/{{$postvalue.ID}}">
{{$length := len $postvalue.Title}} {{if ge $length 40}} {{truncate $postvalue.Title 40}}... {{else}} {{$postvalue.Title}}
{{end}}
</a>
</span>
<span class="createdTime" style="margin-right: 10px;">
閱讀({{$postvalue.View}}) {{dateFormat $postvalue.CreatedAt "06-01-02 15:04"}}
</span>
</div>
<div class="articleBody">
{{$length := len $postvalue.Body}} {{if ge $length 100}} {{truncate $postvalue.Body 100}}... {{else}} {{$postvalue.Body}}
{{end}}
</div>
