从零搭建基于golang的个⼈博客⽹站
从零搭建个⼈博客⽹站需要包括云服务器(虚拟主机),域名,程序环境,博客程序等⽅⾯。就是通过这⼏个环节建⽴起来的,下⾯总结梳理⼀下环节的具体过程。
云服务器
博客程序需要有⼀个服务器部署和运⾏,所以⾸先需要选购⼀个云服务器。阿⾥云是国内最⼤的云⼚商,简单起见直接选购阿⾥云的⼊门级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上购买,选择⼀个没有被注册的购买即可,不同域名价格不⼀样,选择⼀个合适⾃⼰的。2018年1⽉1⽇实⾏的新规,只有国内域名服务商购买的域名才能备案。因为我的域名是在godaddy上,所以需要转移到国内服务商后,再备案。
有了域名之后,需要⽤到DNS服务将域名解析到IP,因为我是在godaddy上购买的域名,默认是使⽤godaddy的DNS服务。但是服务器在阿⾥云,为了以后操作⽅便(godaddy有时候国内访问不稳定),准备使⽤阿⾥云的域名解析服务。先在godday的后台将新域名的DNS服务器设置成阿⾥云的DNS服务器ns1.alidns和ns2.alidns;然后就可以再阿⾥云的控制台中“云解析DNS”⾥,将新域名的A记录指向申请的ECS的公⽹IP,这样就可以通过域名直接访问到服务器。
好景不长,因为域名是要实名备案的,没有备案的域名,会被block掉。⼀般新域名使⽤1-2天就会被block掉,除⾮进⾏实名备案。幸好阿⾥云有专门的备案系统,在阿⾥云主页右上⾓的“备案”⾥⾯就可以到。域名备案需要实名制,需要⽤到⾝份证照⽚,⼿机号,个⼈照⽚,家庭住址等信息,还需要填写域名⽹站的基本信息,总之按照阿⾥云备案系统的向导⼀步⼀步⾛即可。
系统软件环境
主要软件环境:
系统centos7.2
git2.9+
golang1.8+
mysql5.7
博客程序:
其中git2.9采⽤源代码安装,为了⽀持https,源代码安装git之前,先yum安装curl curl-devel之后,再⼿动安装git。
关于博客开源程序,⽐较后选择了,这套程序纯golang开发,简单易懂且可塑性强,安装环境依赖⼩。wblog的安装参照github的安装说明即可简单安装。
另外需要说明的是,为了mysql能够⽀持emoji表情存储,mysql特地安装了5.7版本,, 简单总结步骤如下:
wget
rpm -arch.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初始化代码:InitDB():
db, err := gorm.Open("mysql", system.GetConfiguration().DSN)
conf中的mysql地区配置这⾥有⼀点⼩坑,默认采⽤的loc=Asia/Shanghai, 启动wblog会报错:
[:45] [main.main] err open databasesdefault addr for network '/wblog?charset=utf8&parseTime=True&loc=Asia' unknown
分析原因后是因为Loc的value⾥⾯有⼀个反斜杠‘/’,导致启动参数判读出现错误,暂时通过修改loc=Local修改后正常运⾏。
为了未来⽀持emoji,mysql数据库需要⽀持utf8mb4的5.7版本,程序orm⾃动⽣成数据库表和创建数据库都需要制定utf8mb4格式,数据库创建:
create database wblog default character set utf8mb4;
程序修改InitDB():
db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&Page{}, &Post{}, &Tag{}, &PostTag{}, &User{}, &Comment{}, &Subscriber{}, &Link{})
< mysql table string类型
wblog中数据库表结构中字符串类型string,映射后的默认长度是256字节。部分场景下这个长度是合适的,但是在post表中的博客内容字段,显然256肯定不够,需要⼿动修改成映射text类型字段。修改中的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" >
阅读({{$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>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论