ShiningDan的博客

博客服务器配置

本文记录的是博客中系统的配置情况。使用的虚拟机是阿里云提供的 Ubuntu(16.04) 虚拟机,使用的数据库为 MongoDB(3.4.4)。

MongoDB 配置

博客使用 MongoDB 作为博客后台的数据库,MongoDB 的版本为 3.4.4

首先下载 MongoDB:

1
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.4.4.tgz

然后把 MongoDB 安装到 /root/mongodb 中:

1
tar -zxvf mongodb-linux-x86_64-3.4.4.tgz

配置环境变量

修改/etc/profile.zshrc, 添加如下内容

1
2
export MONGODB_HOME=/root/mongodb/mongodb-linux-x86_64-ubuntu1604-3.4.4
export PATH=$MONGODB_HOME/bin:$PATH

执行命令:

1
2
vim /etc/profile
source /etc/profile

然后可以通过 mongod -v 查看 MongoDB 的版本信息。

启动

创建数据库目录

MongoDB需要自建数据库文件夹.

1
touch /var/log/mongodb.log

添加配置文件

新建mongodb.conf配置文件, 通过这个配置文件进行启动.

1
touch /root/mongodb/mongodb-linux-x86_64-ubuntu1604-3.4.4/mongo.conf

配置文件参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mongodb的参数说明:
--dbpath 数据库路径(数据文件)
--logpath 日志文件路径
--master 指定为主机器
--slave 指定为从机器
--source 指定主机器的IP地址
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 日志文件末尾添加
--port 启用端口号
--fork 在后台运行
--only 指定只复制哪一个数据库
--slavedelay 指从复制检测的时间间隔
--auth 是否需要验证权限登录(用户名和密码)

注:mongodb配置文件里面的参数很多,定制特定的需求,请参考官方文档

配置文件内容:

1
2
3
4
5
6
dbpath=/data/db
logpath=/var/log/mongodb.log
logappend=true
port=27017
fork=true
##auth = true #先关闭, 创建好用户再启动

通过配置文件启动

1
2
3
4
5
mkdir /data/db
mongod -f /root/mongodb/mongodb-linux-x86_64-ubuntu1604-3.4.4/mongo.conf
about to fork child process, waiting until server is ready for connections.
forked process: 2814
child process started successfully, parent exiting

出现successfully表示启动成功了.

使用 mongo 命令可以通过命令行登录 MongoDB,如果想要关闭 Mongodb,需要先登录:

1
2
use admin;
db.shutdownServer();

创建用户

现在可以给 MongoDB 创建一个博客使用的用户,并且给该用户读写数据库的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// root用户
// root账号
use admin;
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [
{ role: "root", db: "admin" }
]
}
)
//博客用户
//读写帐号
use blog;
db.createUser(
{
user: "zyc",
pwd: "zyc",
roles: [
{ role: "readWrite", db: "blog" }
]
}
)

具体的权限有以下几点:

1
2
3
4
5
6
7
8
9
10
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

如果用户在登录的时候需要验证,则进入用户注册的数据库下,用 auth() 函数来进行用户验证:

1
2
use admin;
db.auth('admin', 'admin');

配置防火墙

将27017端口添加到防火墙中,80是指web服务器端口,22是指SSH远程管理端口,9615 是 PM2的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vi /etc/iptables.rules

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:syn-flood - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8000 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9615 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
-A INPUT -p icmp -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
-A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn-flood
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A syn-flood -p tcp -m limit --limit 3/sec --limit-burst 6 -j RETURN
-A syn-flood -j REJECT --reject-with icmp-port-unreachable
COMMIT
1
2
3
4
5
6
7
8
9
10
11
12
# iptables-restore < /etc/iptables.rules #使防火墙规则生效

# vi /etc/network/if-pre-up.d/iptables #创建文件,添加以下内容,使防火墙开机启动

//iptables
#!/bin/bash
iptables-restore < /etc/iptables.rules


# chmod +x /etc/network/if-pre-up.d/iptables #添加执行权限

# iptables -L -n查看规则是否生效.

同时,要添加对 8000 端口的地址转换:

1
sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000

顺便在 .zshrc 里面设置 startmongo 命令:

1
alias startmongo="mongod -f /root/mongodb/mongodb-linux-x86_64-ubuntu1604-3.4.4/mongo.conf"

MongoDB 数据迁移

注意,数据迁移的时候,不能迁移 auth 用户,所以用户权限需要重新创建。

MongoDB 的数据迁移主要分为两部分,第一部分是使用 mongoexport 导出数据,第二部分是使用 mongoimport 来导入数据。

也可以使用 mongodump 导出数据,使用 momgoresotre 导入数据。

mongoexportmongodump 的区别: Mongodump可以backup整个数据库,而mongoexport要对每个collection进行操作,最主要的区别也是选择的标准是mongoexport输出的JSON比Mongodump的BSON可读性更高,进而可以直接对JSON文件进行操作然后还原数据(BSON转换JSON存在潜在兼容问题)。

MongoDB Docs 可以搜索以上工具的使用方法以及需要提供的参数信息。

我在迁移的时候,使用的是 mongoexport 工具导出 blog 数据库下面所有的表,因为在之前给数据库设置了权限,所以在导出的时候,需要使用权限验证:

1
mongodump -d blog -o /Users/yuchenzhang/Desktop/blog.dat --username zyc --password zyc

然后把该文件夹传到云主机的 /data/db 下,使用 mongorestore 来恢复数据库中的数据,在目的主机上也需要对 blog 数据库进行用户权限验证:

1
mongorestore -d blog /data/db/blog.dat/blog --username zyc --password zyc

此时,目的主机上就有我们迁移过来的数据了。

Node 配置

在服务器上,使用 nvm 来安装和管理 Node.js 的版本。

首先运行 nvm 的安装脚本:

1
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash

可以使用 nvm --version 查看安装的 nvm 版本。

然后使用 nvm 来安装指定版本的 Node.js,由于我的开发环境使用的是 7.3.0 版本,所以在服务器上也安装这个版本:

1
nvm install 7.3.0

然后我们可以运行

1
2
nvm ls // 查看安装的 node 的版本
node -v // 查看

PM2 配置

首先来看 PM2 是做什么的呢?

根据官网的介绍,PM2 是一个 Node.js 的生产环境下的进程管理程序,并且自带负载均衡,实现的功能有保证程序的永久运行,并且在程序停止的时候自动进行重载。

首先安装 PM2:

1
npm install pm2 -g

我们可以通过 PM2 来运行自己的 Node.js 程序:

1
pm2 start app.js

在运行了程序以后,PM2 会返回一个当前程序占用的资源和运行的情况:

1
2
3
4
5
┌──────┬──────┬────────┬───┬─────┬───────────┐
│ Name │ mode │ status │ ↺ │ cpu │ memory │
├──────┼──────┼────────┼───┼─────┼───────────┤
│ app │ fork │ online │ 0 │ 19% │ 23.0 MB │
└──────┴──────┴────────┴───┴─────┴───────────┘

当然,除此以外,我们还可以使用 PM2 运行多个程序。

查看运行情况

运行 pm2 list,可以查看现在所有的 PM2 运行的程序:

1
2
3
4
5
6
pm2 list        
┌──────┬──────┬────────┬───┬─────┬───────────┐
│ Name │ mode │ status │ ↺ │ cpu │ memory │
├──────┼──────┼────────┼───┼─────┼───────────┤
│ app │ fork │ online │ 0 │ 0% │ 62.2 MB │
└──────┴──────┴────────┴───┴─────┴───────────┘

同样,运行 pm2 monit,可以获得一个实时追踪的运行情况。

如果想查看其中一个应用的详细运行情况,可以使用 pm2 show <id|name>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pm2 show app
┌───────────────────┬─────────────────────────────────┐
│ status │ online │
│ name │ app │
│ restarts │ 0 │
│ uptime │ 6m │
│ script path │ /root/blog/new-blog/app.js │
│ script args │ N/A │
│ error log path │ /root/.pm2/logs/app-error-0.log │
│ out log path │ /root/.pm2/logs/app-out-0.log │
│ pid path │ /root/.pm2/pids/app-0.pid │
│ interpreter │ node │
│ interpreter args │ N/A │
│ script id │ 0 │
│ exec cwd │ /root/blog/new-blog │
│ exec mode │ fork_mode │
│ node.js version │ 7.3.0 │
│ watch & reload │ ✘ │
│ unstable restarts │ 0 │
│ created at │ 2017-05-15T07:48:17.228Z │
└───────────────────┴─────────────────────────────────┘

查看日志

可以使用 log

1
pm2 log

WEB 查看界面

运行:

1
pm2 web

后,可以通过 IP:9615 查看 PM2 中监控的应用运行情况。注意要设置 iptables 来添加对 9615 端口的允许规则。

此时使用 pm2 list 可以看见 PM2 新生成了一个应用 pm2-http-interface,来提供 9615 端口的服务:

1
2
3
4
5
6
7
pm2 list
┌────────────────────┬──────┬────────┬───┬─────┬───────────┐
│ Name │ mode │ status │ ↺ │ cpu │ memory │
├────────────────────┼──────┼────────┼───┼─────┼───────────┤
│ app │ fork │ online │ 0 │ 0% │ 65.5 MB │
│ pm2-http-interface │ fork │ online │ 0 │ 0% │ 44.8 MB │
└────────────────────┴──────┴────────┴───┴─────┴───────────┘

重启应用

1
pm2 restart app

终止应用:

1
pm2 stop app

域名解析

我们的博客选择使用 DNSPod 进行域名解析。首先要注册 DNSPod 的账号,

首先在 DNSPod 上创建需要解析的域名,详情请参考DNSPod | 学会使用DNSPod

其中有一些名词需要了解,比如什么是主机记录,记录类型等。具体的名词解释可以参考主机记录和记录值怎么填写

我的域名是在 GoDaddy 上买的,所以还需要在 GoDaddy 上设置 nameserver 为 DNSPod 的域名服务器:f1g1ns1.dnspod.netf1g1ns2.dnspod.net

等待时间刷新即可。

参考

本文参考的文章有: