從零搭建基於golang的個人部落格網站

pert發表於2018-05-24

原文連結 : 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版本,安裝參考, 簡單總結步驟如下:

部署執行

程式的編譯執行很簡單,只需要在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>

相關文章