前面我们已经完成了博客网站项目的功能开发,并且在本地测试通过使用了。那么现在我们还需要将它发布的到服务器生产环境上,才能绑定域名给其他用户看到。下面介绍如何将我们开发好的博客网站部署的服务器上。
服务器的购置和域名的购买
需要部署到线上服务器,我们首先需要购置一台云服务器。云服务器可以从阿里云、腾讯云、百度云、华为云、小鸟云等云服务器提供商上购买。他们有服务上的优势、价格上的优势等各不相同,根据个人需求来购买。
默认情况下,一个博客的流量并不会太大,因此我们只需要购买最低配置即可,如果有活动价,也可以购买更高点的配置,比如1核心2G内存3M带宽,2核心4G内存5M带宽等。重要一点,服务器尽量不要安装windows系统,我们尽量使用Linux使用来作为云服务器的操作系统,CentOS、Ubuntu系统任选一个都可以。下面我们将以使用CentOS操作系统为例,说明怎么部署。
上面几个云服务器商,同样支持域名的购买,例如我们现在在上面买了一个 kandaoni.com 域名,后面我们的配置就以这个域名为例。购买了域名之后,将域名 @ 和 www 都解析到上面购买的服务器ip上,域名就可以使用了。国内购买的域名,是需要实名认证的,自行认证即可。
在购买了域名之后,我们最好是给域名申请一个https,https的重要性这里不做赘述,上面的服务商都有提供免费的https证书的服务的。后面的配置中,默认是购买了https证书。
服务器生成环境的配置
同样,服务器上我们也需要安装MySQL、Nginx、Go环境,也要安装Git工具。
Git工具的安装
为了方便,我们先安装和配置Git。我们通过ssh登录到服务器之后,使用root权限账号进行操作,执行命令:
yum install git
安装期间,如果有提示 N/Y 选择项的,输入Y即可安装完成。等待安装完毕后,我们测试下git是否能正常使用:
[root@localhost ~]# git --version
git version 1.8.3.1
[root@localhost ~]#
看到version信息,表示可以正常使用。接着,我们还需要配置一下git用户信息:
//配置基本信息
[root@localhost ~]# git config --global user.name "sinclair"
[root@localhost ~]# git config --global user.email tpyzlxy@163.com
//查看配置
[root@localhost ~]# git config --list
user.name=sinclair
user.email=tpyzlxy@163.com
[root@localhost ~]#
go环境的安装
全面的golang安装介绍中介绍过windows、linux的安装方法。这里我们使用linux的CentOS的安装方法:
sudo yum -y install golang
等待安装完毕后,我们再配置一下一下path环境:
# 创建GOPATH目录
mkdir /data/go
# 打开
vim /etc/profile
在打开的文件结尾处,增加如下代码:
export GOPATH=/data/go
export PATH=$PATH:$GOPATH/bin
export GOPROXY=https://goproxy.cn,direct
这样子,我们就将GOPATH 设置到 /data/go
文件夹了,并且给golang设置了一个https://goproxy.cn
的代理地址,这样我们下载外部不可访问的包的时候,就可以通过国内的代理下载了。
LNMP 环境的安装
LNMP 是Linux、Nginx、MySQL、PHP的 首字母,它是指在Linux上安装Nginx、MySQL、PHP三个软件。
为了简单方便,我们使用LNMP一键安装包来安装。
LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RHEL/Fedora/Aliyun/Amazon、Debian/Ubuntu/Raspbian/Deepin/Mint Linux VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQL/PHP/Apache)、LAMP(Apache/MySQL/PHP)生产环境的Shell程序。
通过访问 https://lnmp.org/ 可以获得最新的LNMP一键安装包。
首先,我们使用wget命令将lnmp一键安装包下载回来:
cd ~
# 如果wget没有安装,我们可以先安装wget命令:
yum install wget
# 获取lnmp一键安装包
wget http://soft.vpser.net/lnmp/lnmp1.7-full.tar.gz
# 解压lnmp一键安装包
tar zxvf lnmp1.7-full.tar.gz
# 进入安装目录
cd lnmp1.7-full
# 执行安装命令
./install.sh
在安装过程中,每一样都选择最新的即可。安装过程中需要设置mysql的root密码,请务必要记住这个密码,后面安装博客的时候需要使用到。最好是将这个密码设置尽量复杂,并使用一个文本记录下来,养成使用复杂密码和记录密码的习惯,这样可以减少密码忘记的风险。
更详细的安装教程可以访问 lnmp.org 来获取。安装过程出错也可以在上面找到解决方法。
lnmp安装完毕后,我们到nginx的配置文件中配置一下代理:
# 进入nginx配置目录
cd /usr/local/nginx/conf/vhost
# 创建博客配置文件
vim kandaoni.conf
在打开的kandaoni.conf 文件中,增加如下代码:
upstream goblog {
server 127.0.0.1:8001;
}
server{
listen 80;
server_name kandaoni.com;
rewrite ^/(.*)$ https://www.kandaoni.com/$1 permanent;
}
server{
listen 80;
server_name www.kandaoni.com;
root /data/goblog/public;
index index.html;
error_page 404 /404.html;
location / {
try_files $uri $uri/index.html @go;
}
location @go {
proxy_pass http://goblog;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log off;
return 301 https://$host$request_uri;
}
server
{
listen 443 ssl;
server_name www.kandaoni.com;
index index.html;
root /data/goblog/public;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /data/ssl/kandaoni.pem;
ssl_certificate_key /data/ssl/kandaoni.key;
error_page 404 /404.html;
location / {
try_files $uri $uri/index.html @go;
}
include enable-php.conf;
location @go {
proxy_pass http://goblog;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|svg|webp)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 30d;
}
access_log /home/wwwlogs/kandaoni.log;
}
首先我们给使用upstream模块定义一个节点:
upstream goblog {
server 127.0.0.1:8001;
}
接着将不带www的顶级域名301跳转到www开头的域名中:
server{
listen 80;
server_name kandaoni.com;
rewrite ^/(.*)$ https://www.kandaoni.com/$1 permanent;
}
紧接着配置80端口可访问的配置
server{
listen 80;
server_name www.kandaoni.com;
root /data/wwwroot/goblog/public;
index index.html;
error_page 404 /404.html;
location / {
try_files $uri $uri/index.html @go;
}
location @go {
proxy_pass http://goblog;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log off;
# 如果开启了https,则将它301 到https上。如果没有开启,则将它注释掉
return 301 https://$host$request_uri;
}
上面我们购买了https证书,因此我们再配置https
server
{
listen 443 ssl;
server_name www.kandaoni.com;
index index.html;
root /data/wwwroot/goblog/public;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /data/ssl/kandaoni.pem;
ssl_certificate_key /data/ssl/kandaoni.key;
error_page 404 /404.html;
location / {
try_files $uri $uri/index.html @go;
}
include enable-php.conf;
location @go {
proxy_pass http://goblog;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|svg|webp)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 30d;
}
access_log /home/wwwlogs/kandaoni.log;
}
在配置完了https配置之后,我们还需要创建一下wwwlogs文件夹
mkdir /home/wwwlogs/
还需要将https证书放到服务器的/data/ssl文件夹
mkdir /data/ssl
# 将 pem 文件里的内容放到 kandaoni.pem 中
vim /data/ssl/kandaoni.pem
# 将 key 文件里的内容放到 kandaoni.key 中
vim /data/ssl/kandaoni.key
到了这一步,我们就已经部署好nginx了,mysql也可以使用了。php先不管,目前用不到。 nginx的启动、关闭命令如下:
# 启动nginx
service nginx start
# 重启nginx
service nginx restart
# 重载nginx配置
service nginx reload
# 停止nginx
service nginx stop
mysql的启动、关闭命令:
# 启动mysql
service mysql start
# 关闭mysql
service mysql stop
# 重启mysql
service mysql restart
博客网站系统发布上线
上面环境配置一切就绪,最后,我们就可以将我们的博客网站发布在服务器上上线使用了。
一般上,网站需要限定在www账号下执行,而不是root账号下。一般安装完lnmp后,它已经给我们创建好了www账号了,但是现在www账号还不能登录,因为默认它是禁止登录的。为了可以使用www账号,我们还需要先将www账号允许登录:
vim /etc/passwd
找到www用户,将后面的/sbin/nologin
改成/bin/bash
。这样子www用户就可以使用了。为了安全起见,我们还需要给www用户设置一个复杂的密码:
passwd www
然后连续输入两次一样的密码就可以了。
博客代码的获取
前面我们配置好www用户了,我们现在先创建网站目录,并切换到www用户:
# 先创建data文件夹
mkdir /data
# 接着创建wwwroot文件夹
mkdir /data/wwwroot
# 将/data目录的权限分配给www
chown -R www:www /data
# 切换到www用户
su www
接着,我们用Git工具,将博客代码拉到服务器的/data/wwwroot/目录上:
# 进入wwwroot文件夹
cd /data/wwwroot
# 执行git命令
git clone https://github.com/fesiong/goblog.git
# 进入goblog目录
cd goblog
这样子我们就将博客代码拉取到服务器上了。接着我们就可以编译项目使用了。
博客网站项目的编译
在服务器上编译:
我们进入到 /data/wwwroot/goblog
文件夹中,执行以下命令:
# 加载依赖包到本地cache
go mod tidy
# 将依赖包放置到vendor目录下
go mod vendor
# 执行编译操作
go build -o goblog main/main.go
很好,执行完上面三个命令后,我们就在goblog不了下生成了一个goblog的二进制文件,这就是一个可执行文件。现在我们还不能运行它,因为我们还没有安装数据库。
在本地电脑上跨操作系统交叉编译:
除了在服务器上编译外,我们还可以通过在本地编译的方式来编译成二进制文件。这样可以减少代码的泄露情况,同时也可以省去了服务器上部署golang环境的问题。
# 在本地编译 linux 可执行文件需要执行下面命令:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o goblog main/main.go
# 在本地编译 windows 可执行文件需要执行下面命令:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o goblog.exe main/main.go
# 在本地编译 Mac OS 可执行文件需要执行下面命令:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o goblog main/main.go
跨平台编译,首先需要禁用CGOCGO_ENABLED=0
,然后再将GOOS设置为对应目标系统,就可以编译出不同的系统可执行的文件了。
编译完成后,将编译文件、template文件夹、public文件夹一起打包,并上传到服务器/data/wwwroot文件夹上加压,就可以使用了。
博客网站项目的运行
正常的运行命令很简单,只需要执行这个二进制文件就可以了:
./goblog
但是这样执行运行下,只要我们关闭终端,项目就停止了。因此,我们还需要将它放到后台去执行。这里我们使用linux的nohup命令来保持博客网站后台运行:
nohup /data/goblog/goblog&
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup命令的使用格式是:
nohup Command [ Arg … ] [ & ]
参数说明:
- Command:要执行的命令。
- Arg:一些参数,可以指定输出文件。
- &:让命令在后台执行,终端退出后命令仍旧执行。
默认情况下,它会在当前目录下生成一个nohup.out 的输出文件。如果想使用其他文件名可以这么用:
比如重定向输出到 goblog.log 文件:
nohup /data/goblog/goblog > goblog.log 2>&1 &
2>&1 解释:
将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。
- 0 – stdin (standard input,标准输入)
- 1 – stdout (standard output,标准输出)
- 2 – stderr (standard error,标准错误输出)
上面已经启动了,但是如果要关闭它如何操作呢?
我们可以使用进程查找命令,找到进程的PID,然后将PID杀掉:
ps -def | grep "goblog"
在找到PID后,我们就可以使用kill命令干掉。比如我们搜索到PID为:3251
# kill -9 进程号PID
kill -9 3251
又因为我们的博客项目监听了8001端口,我们也可以根据端口来查找进程PID:
# lsof -i:端口号
lsof -i:8001
如果lsof命令没有安装,可以先安装它:
# 安装的时候记得切换到root用户来安装
yum install lsof
初始化博客
现在一切就绪了,我们通过域名 https://www.kandaoni.com 访问博客,并初始化它:
这个时候需要注意输入你填写的数据库信息,千万别输入错误了。数据密码在上面安装数据库的时候已经设置过。由于博客初始化程序没有包含创建数据库这一操作,因此这里使用的数据库,需要事先创建好。比如我们可以在终端登录数据库,并创建好我们需要用的数据库:
mysql -u root -p
# 接着输入密码,就登录了数据库了。输入密码过程中,我们是看不到光标在动的,直接输完按回车就行。
# 然后执行创建数据库操作。我们创建的数据库名称叫做irisweb
create schema irisweb;
查看有没有创建成功:
show databases;
如果有列出irisweb数据库,表示创建成功。
接着在初始化界面输入更多的信息,设置好管理员账号和管理员密码。这个也是要记住的。记不住的自己将它记录到本地一个记事本中,以防止后面忘记了。
初始化完成后,我们再在根目录下的config.json 中,增加首页的tdk信息:
"server": {
"site_name": "看到你博客",
"env": "development",
"port": 8001,
"log_level": "debug",
"title": "看到你博客:Golang实战开发入门图文教程、Golang实战技术在线学习网站",
"keywords": "golang,golang实战开发,golang实战学习",
"description": "网上有很多的golang开发教程,他们都是从最基础的安装环境、golang语法开始的,对于一个小白,他是有帮助的。然而大家都知道,一味地接受学习,是一个枯燥到让人窒息的过程。更多的时候是,学完就完了,该忘的、不该忘的大部分都忘记了,没有根据自己的实际需求学习,大多都记忆不够深刻。为了打破这种低效率的学习过程,我将从这里开始,介绍一种带着需求学习的golang实战学习方式。",
"icp": "粤ICP备19130249号-2"
}
修改了config.json,我们需要重启博客才能让他生效。回到上面启动和关闭命令,执行一遍就可以了。
至此,这个博客网站项目的部署就完成了。恭喜你,成功拥有了一个新的博客网站。
完整的项目示例代码托管在GitHub上,需要查看完整的项目代码可以到github.com/fesiong/goblog 上查看,也可以直接fork一份来在上面做修改。