这个博客是如何被我弄出来的

前言 && 一些交代

那么现在大家也看到了,这个博客经过我前两天的各种踩坑,到现在终于慢慢地算是有些样子了。能跑起来并且可以正常地访问,并且在今天又拥有了 https 的支持,可以说基本成形了。所以我就在这里把我搭建整个 CentOS + nginx + node.js + MariaDB + ghost.js 环境的方案分享一下。

前面一篇文章里面我也说过,由于这套环境的太新,现有的很多教程都有大大小小的坑,我自己也是根据这些文章东拼西凑加自己的各种探索弄出来的。这里也只是给大家提供一个思路,遇到具体问题大家还是要具体分析。不过你们现在能看到这个博客和这篇文章,以下几个教程作为领路人还是功不可没:

作为补充,各种环境我在这里也做个交代:

  • 腾讯云服务器,单核 / 1G内存 / 20G系统盘 / 1M带宽
  • CentOS 7.2 x86
  • node.js 4.4.7 LTS(已更新至 6.9.4 LTS)
  • nginx 1.10.1 Stable
  • MariaDB 10.1.16 Stable
  • Ghost 0.8.0(已更新至 0.11.3)
1
2
3
4
5
6
7
8
9
10
11
# cat /proc/version
Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015

# nginx -v
nginx version: nginx/1.10.1

# node -v
v4.4.7

# mysql --version
mysql Ver 15.1 Distrib 10.1.16-MariaDB, for Linux (x86_64) using readline 5.1

防火墙?腾讯云自带安全组功能屏蔽端口,要防火墙做什么?

BTW,由于配环境的时候挺混乱的,也没有想到要做记录,所以这里的很多内容没有截图,都是以文字的形式描述的,还请各位看官老爷海涵。

作案动机 && 技术选型

当时想要一个云服务器纯粹是因为想自己写几个接口(比如通过服务器来中转不支持 jsonpajax 请求什么的),但是想想弄个服务器来就光做这一点事情觉得太亏,所以就有了搭这么一个博客的想法。虽然那些接口还没写出来,但我先把博客搭出来了。

既然下定决心要做这件事情,那么就可以开始做技术选型了。

熟悉我的人可能知道,我现在在长江大学党委宣传部下属的长大在线信息传媒(链接在外网可能无法访问)干活,咱们的主要工作是维护学校的新闻网,这个站的环境是 LAMP(即 Linux + Apache + MySQL + PHP )。虽然咱的头衔是 Web 前端组组长,但是无论是后台还是运维的事情我也懂一些,有时候还会给他们帮一下忙,所以 LAMP 的基本搭建和日常维护基本对我问题不大,以至于在进行技术选型的时候我差点就想直接弄个 LAMP + WordPress 算了。但是转念一想,人嘛还是要趁年轻多折腾,而且作为初出茅庐并且现在如日中天的 node.js ,作为一个 JavaScript 熟练工来说,要是不亲自体验一下这种新技术的话就可惜了,况且这个服务器本来就是作为一个游乐场而存在的,所以最后还是选择了 node.js 这个平台。

系统没啥好说的,CentOS,当服务器不知道比 Ubuntu 高到哪里去了。

再说反向代理,平时用得比较多的是 Apache , ngnix 仅仅是听说过而已。但是为了这个博客,我还是去仔细地查阅了资料,发现 nginx 似乎在性能方面表现更好,考虑到这个服务器本身配置并不高,于是选用了 nginx。

CentOS 7 把默认的数据库从 MySQL 换成了 MariaDB ,据说 MariaDB 是在 MySQL 被收购以后,其原作者担心 Oracle 使坏,然后开发的一个备用版本,现在也很好使,于是也就拿来用了。

node.js 下面比较成熟的博客平台貌似目前也就 Ghost 一家,也没啥好挑的。

开工 && 安装所需的包

第一步当然是买服务器,买域名和装系统啦,托腾讯爸爸的云+校园计划的福,服务器和域名一共只花了一块钱就全部搞定了,而且目前用着感觉也还不错。如果你有学信网的学生认证,不妨也买一台来玩玩,花一点抢红包就能抢回来的钱来弄这么一个高档玩具来玩(我还真的是用的微信零钱里的红包钱),岂不美哉?

系统弄好了,下一步当然就是连上 ssh ,把该装的什么 nginx 啊 node.js 啊 MariaDB 啊这些全都装好啦。那么问题来了……

Q: 说到给 CentOS 装包的话? \(°∀°)

A: yum 哒哟 ~ (°∀°)/

没错,yum 是在 CentOS 里装包的最棒的选择,而且没有之一——完善的依赖管理,全自动的操作流程,方便的安装和卸载,简直是像我这样的懒癌患者的福音。于是我兴冲冲地在终端里敲入了yum install mariadb-server mariadb-client nodejs nginx,然后,理所当然地,yum 会自动解析好所有的依赖,然后拿来一张列表,告诉我他马上要干什么,然后问我“Is that OK?(y/N)” 当我正准备点头,却发现有点不对劲——什么?居然拿 0.10.x 的 node.js 、 1.6.x 版的 nginx 和 10.x 的 MariaDB 就要给我装了?那我以后的 https 和 http/2 怎么办?es6 的支持怎么办?不行!坚决不行!但是,你们知道的,像我这样的懒人,能用工具是绝对不会靠自己的双手的,所以不到万不得已,我是绝对不会下源码回来手动编译的。那可如何是好?

好在各个软件的提供者都意识到了自带 yum 源版本更新慢的问题,并且很贴心地自建了 yum 源和指南供我们使用。由于之后这样的地址和指南针对不同系统有所不同,并且可能会频繁更新,我就不在这里一一细说了,感兴趣的同学可以去查阅下面的官方指南:

配置服务

包都装好了,接下来当然是配置各种东西啦,首先是 MariaDB ,我这么懒的人肯定是用官方提供的设置向导 mysql_secure_installion 啦。首先当然是输入 root 用户的密码,新装好的数据库是不会有密码的,所以直接敲回车就可以了。然后接下来它会引导你做一些最基本的安全设置,比如问你要不要禁用匿名用户啦,要不要禁止 root 用户远程登录啦,要不要删除测试数据库啦等等。这些如果你没有特别需求的话(比如远程数据库需要允许 root 远程登录),一路 enter 下去就好,这里就不再多说。

接下来还要改一点东西,把数据库的默认编码改成我们常用的 “UTF_8” ,防止在日后的使用中出现麻烦。输入 vim /etc/my.cnf 来修改 MariaDB 的配置文件,在相应的字段下添加以下内容:

1
2
3
4
5
6
7
[client]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

保存(:wq)之后咱们先输入 systemctl restart mariadb 重启一下数据库,再来输入 mysql -u root -p 登录试试看:

1
2
3
4
5
6
7
8
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 29
Server version: 10.1.16-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

输入密码之后看到这样的界面,说明我们已经登陆进了数据库,然后我们来看一下我们用两句查询来看一看我们的字符编码是否已经改好了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

MariaDB [(none)]> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

这样我们的字符编码就改好了,接下来我们来给我们的博客配备一个专用的数据库和用户:

1
2
3
4
5
6
7
8
MariaDB [(none)]> create database ghost;  
...

MariaDB [(none)]> grant all privileges on ghost.* To 'ghost'@'localhost' identified by 'password';
...

MariaDB [(none)]> exit
Bye

数据库的配置就此完成,接下来是 nginx,输入 vim /etc/nginx/conf.d/default.conf 修改 nginx 配置文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
# 需要监听的端口,这里一般都是:80
listen 80;
# 服务器名,如果你有域名,就像我下面这样写,否则把你服务器的 IP 写在这里即可
server_name peterwang1996.cn www.peterwang1996.cn;
# 默认的字符编码
charset utf-8;
# 下面这些用来把 Ghost 项目反向代理到我们希望的位置
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:2368;
}
}

然后输入 systemctl restart nginx 重启 nginx ,nginx 就配置完成了。

安装 ghost.js

接下来的事情就简单得多了。我们来安装 Ghost,这里我用的是英文原版:

1
2
3
4
cd /usr/share/nginx/
wget https://ghost.org/zip/ghost-0.9.0.zip
unzip -d ./ghost ghost-0.9.0.zip
npm install --production

接着来配置我们的博客,输入以下命令:

1
2
cp config.example.js  config.js
vim config.js

编辑我们的配置文件,基本上只改动 production 对象就可以了,我自己的核心配置是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
production: {
url: 'http://peterwang1996.cn', // 你的域名
mail: {}, // 关于邮件服务器,这里没配置
database: { // 关于数据库
client: 'mysql', // 数据库类型
connection: { // 数据库连接参数
host: 'localhost', // 数据库主机地址
user: 'ghost', // 数据库用户名
password: '******', // 对应用户的密码
database: 'ghost', // 要使用的数据库名
charset: 'utf8' // 字符编码,注意一定不能写成 `utf-8` ,要不然会爆炸
},
debug: false
},

server: {
host: '127.0.0.1',
port: '2368'
}
},

现在,执行这条命令

1
npm run --produnction

然后用浏览器打开你的域名,如果你能看到一个类似于这样的页面(应该会有一篇类似 “Welcome” 的英文文章):

第一次访问

那么整个博客系统基本上可以宣告搭建成功了。不过这里我们还是会遇到一点问题,就是我们必须一直挂着这个命令在前台执行,如果结束掉这个命令的话,博客也就不再运行了。这显然是不行的。我们可以把我们的博客程序变成系统的一个服务。执行 vim /etc/systemd/system/ghost.service 生成一个配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=ghost
After=network.target

[Service]
Type=simple
# Ghost installation Directory
WorkingDirectory=/usr/share/nginx/ghost/
User=root
Group=root
ExecStart=/usr/bin/npm start --production
ExecStop=/usr/bin/npm stop --production
Restart=always
SyslogIdentifier=Ghost

[Install]
WantedBy=multi-user.target

接着就可以用 systemctl 把我们的博客程序当作服务来管理啦 ~

1
2
3
4
systemctl enable ghost    # 随系统启动而启动
systemctl start ghost # 启动服务
systemctl stop ghost # 停止服务
systemctl restart ghost # 重启服务

用浏览器访问你的域名下的 /ghost 目录(本例是 www.peterwang1996.cn/ghost/ ),开始你的独立博客之旅吧 ~

#EOF

赏我点钱让我去看 7777777 吧!