前面我们已经完成了博客网站项目的功能开发,并且在本地测试通过使用了。那么现在我们还需要将它发布的到服务器生产环境上,才能绑定域名给其他用户看到。下面介绍如何将我们开发好的博客网站部署的服务器上。

服务器的购置和域名的购买

需要部署到线上服务器,我们首先需要购置一台云服务器。云服务器可以从阿里云、腾讯云、百度云、华为云、小鸟云等云服务器提供商上购买。他们有服务上的优势、价格上的优势等各不相同,根据个人需求来购买。

默认情况下,一个博客的流量并不会太大,因此我们只需要购买最低配置即可,如果有活动价,也可以购买更高点的配置,比如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 访问博客,并初始化它:

 design-install

这个时候需要注意输入你填写的数据库信息,千万别输入错误了。数据密码在上面安装数据库的时候已经设置过。由于博客初始化程序没有包含创建数据库这一操作,因此这里使用的数据库,需要事先创建好。比如我们可以在终端登录数据库,并创建好我们需要用的数据库:

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一份来在上面做修改。