Evilmass

从 Wordpress迁移到 Hexo

前言

之前有一个 cc 域名是 Wordpress 的,而me域名则是 GithubPage + Hexo,可惜 me 域名过期没钱续费了,两边更新文章也挺麻烦,遂切换到 VPS 上


VPS 基本参数

对,搬砖,最便宜的那个,现在出了 China Direct Router,内存也提升到了 512M,性价比极高,可惜不是 KVM 架构。。。

SPECIAL 10G PROMO V3 - LOS ANGELES - CHINA DIRECT ROUTE
SSD: 10 GB RAID-10
RAM: 512 MB
CPU: 1x Intel Xeon
Transfer: 1000 GB/mo
Link speed: 1 Gigabit
Location: Los Angeles (no other locations available on this plan)
Direct route via China Telecom and China Unicom

我的推荐链接:https://bandwagonhost.com/aff.php?aff=13364
China Direct Router:在地址栏最后添加 /cart.php

Shadowsocks

yum update -y
yum install python-setuptools m2crypto libtool gcc && easy_install pip
pip install shadowsocks

libsodium 依赖

curl -O -L https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
tar zxf LATEST.tar.gz
cd libsodium*
./configure
make && make install
# 修复关联
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
rm -rfv ../LATEST.tar.gz ../libsodium* && cd ~

多端口配置

{
    "server":"0.0.0.0",
    "local_address":"127.0.0.1",
    "local_port":1080,
    "port_password":{
        "9000":"password0",
        "9001":"password1",
        "9002":"password2",
        "9003":"password3"
    },
    "timeout":600,
    "method":"chacha20",
    "fast_open": true
}

配置自启动

新建启动脚本文件/etc/systemd/system/shadowsocks.service,内容如下:

[Unit]
Description=Shadowsocks

[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target

启动 shadowsocks

systemctl enable shadowsocks  #开机启动
systemctl start shadowsocks  #开启服务

为了检查 shadowsocks服务是否已成功启动,可以执行以下命令查看服务的状态:

systemctl status shadowsocks -l

优化

Openvz 用户可以不用看这部分的优化

shadowsocks 参数优化

KVM 架构 的 VPS 建议安装 Google_BBR
目前看来 BBR 比锐速强势

Kcptun–Openvz的救星
FinalSpeed–同上


###在 Centos 配置 ngrok

服务器监控 UptimeRobot 简明使用手册


Git

建议手动编译安装较新版本的 Git,以便配置 ngrok

SSH-Keygen


Nginx

yum install nginx
systemctl start nginx
systemctl enable nginx


NodeJS

建议 yum 直接安装,否则在后面部署 pm2(forever)过程中会出现如下错误:/usr/bin/env: node: No such file or directory

yum install nodejs


Hexo

npm install hexo-cli -g
hexo init blog
cd blog
npm install


Next主题


让 Hexo 在后台运行

npm install pm2 -g  # 全局安装 pm2

当然,用 forever 也是可以的,只是 pm2 更强大更好用而已

创建一个app.js写入以下内容

var spawn = require('child_process').spawn;
    free = spawn('hexo', ['server']);

free.stdout.on('data', function (data) {
    console.log('standard output:\n' + data);
});

free.stderr.on('data', function (data) {
    console.log('standard error output:\n' + data);
});

free.on('exit', function (code, signal) {
    console.log('child process exit, exit: ' + code);
});

使用

pm2 list              # 查看已运行的服务
pm2 show <id or name> # 查看启动服务的详细信息
pm2 monit             # 查看pm2在服务器上的占用
pm2 start app.js      # 启动hexo
pm2 kill app.js       # 停止hexo
pm2 save              # 保存当前设置
pm2 startup           # 开机启动hexo服务


crontab 注意事项

crond 是 Centos 系统的一个服务,也就也就意味着:crontab -e 之后 Command 不执行的原因之一是系统没有开启crond服务

systemctl start crond
systemctl enable crond #加入开机启动


Let’s Encrypt 证书自动续期

vim /home/ssl_renew.sh

#!/bin/bash
/home/letsencrypt/certbot-auto renew

#添加到crontab每月运行一次
crontab -e

* * */1 * * sh /home/ssl_renew.sh


配置 Nginx 代理

作为一个对外公开的网站,使用 4000 端口显然是不合适的。可以直接改成 80 端口,但是这样直接把 Hexo 服务暴露给用户,并不恰当。更好的办法是使用 Nginx 做代理。

vim /etc/nginx/nginx.conf

server {
location / {
    proxy_pass http://localhost:4000;
}
access_log  /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
}

重启 Nginx:

service nginx restart


GZip

vim /etc/nginx/nginx.conf

http {
    gzip on; #开启Gzip
    gzip_min_length  1k;  #当返回内容大于此值时才会使用gzip进行压缩,以K为单位,当值为0时,所有页面都进行压缩
    gzip_buffers     4 16k;  #gzip文件缓存大小
    gzip_http_version 1.0;
    gzip_comp_level 6;  #gzip压缩等级,数值越高压缩得越狠,也越占资源
    gzip_types  text/plain application/x-javascript text/css application/xml;  #gzip压缩文件格式,以下涵盖了一般所需的类型
    gzip_vary on;  #跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding"
    gzip_types         text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
}


本地配置

说Windows没有运行脚本环境的,你们似乎忘了 Git-Bash
Git-Bash


包含密码的私有文件或者 ssh 密匙不能推送到公共仓库,会造成隐私泄漏等安全问题

.gitignore 写入以下内容

.DS_Store
Thumbs.db
*.log
*./           #隐藏文件夹,这里为了防止推送node_modules/.bin目录
sync.sh       #本地推送文章的脚本
node_modules/ #Hexo的运行环境
public/ #hexo generate产生的静态页面
.deploy_git/  #之前hexo-deploy-git方式产生的文件夹

Hexo目录包含hexo的运行环境,我们并不需要把这些文件都推送上去,这样整个仓库会变得很大,不利于其他服务器部署

多机器配置(需要 NodeJS 环境)

git clone 仓库
npm install


服务器配置

创建同步脚本 deploy.sh, 该脚本在 VPS 的主要操作如下

等待被deploy.js调用
kill heox-pid 关闭当前正在运行的hexo进程
git-pull 得到仓库的更新文章
hexo clean
hexo generate #生成更新文章的页面
hexo server & 重新启动hexo并在后台运行


deploy.sh
#!/bin/bash
PORT=4000
WEB_PATH='/path_to_blog'  # Hexo目录
WEB_USER='noroot' #用户
WEB_USERGROUP='noroot'  # 用户组

echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
# git clean -f 这一句请注释掉,否则服务器端的 deploy.sh deploy.js 在执行 git pull 操作时被删除
git pull
git checkout master
echo "changing permissions..."
chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
NUM=`ps -ef | grep 'hexo' | head -n1 | awk '{print$2}'` #请验证该行代码能否取出hexo进程的pid,若不能,则需要根据环境修改
if [ -n "$NUM" ];then
    echo "kill hexo process pid: $NUM"
    kill -9 $NUM
else
    echo "hexo process not found"
fi
HEXO_BASH=`which hexo`
HEXO_CLEAN=${HEXO_BASH}" clean"
HEXO_GENERATE=${HEXO_BASH}" generate"  # 执行hexo generate命令
HEXO_START_SERVER=${HEXO_BASH}" server -p $PORT &"  # 在后台启动hexo服务
echo "HEXO_CLEAN: $HEXO_CLEAN"
eval $HEXO_CLEAN
echo "HEXO_GENERATE: $HEXO_GENERATE"
eval $HEXO_GENERATE
echo "HEXO_START_SERVER: $HEXO_START_SERVER"
eval $HEXO_START_SERVER
echo "Finished."

启动

pm2 start deploy.js  # 启动服务


文章更新工作流

在本地 sync.sh 写入一行

ssh [email protected] -p port ‘sh ./deploy.sh’

-p 代表端口,默认22, 引号内代表连接上服务器后执行的命令,需要用 ssh-keygen 实现免密码登录

那么整个工作流就很简单了: 开启启动hexo服务 pm2 startup,crontab 定时执行 pm2 restart app,本地 sync.sh 推送,服务器端实时更新文章~

在 Shell 中执行 Ctrl - C

CTRL-A \001   十进制1
CTRL-B \002   十进制2
....
CTRL-Z \032   十进制26
那么`echo -e "\003"` 代表在Shell中输入Ctrl - C

添加 echo -e "\003"到deploy.sh最后就可以达到本地推送完成之后自动退出 VPS 的 Shell 连接

备份

Hexo根目录下的 _config.yml

要使用的主题目录下的 _config.yml

保存文章的 md 文件

本地推送的脚本 sync.sh

服务器端的 deploy.sh deploy.js blog_run.sh

七牛 qshell

创建一个私有空间(服务器在国外建议选择北美的空间,已经有空间的,先创建再设置成私有即可),在个人面板 -> 密钥管理找到 AccessKeySecretKey

下载服务器可用的 qshell 并初始化
./qshell_linux_amd64 init AK SK
在当前目录下创建 config.txt 并写入如下内容
{
    "src_dir"            :   "待同步的目录",
    "access_key"         :   "AK",
    "secret_key"         :   "SK",
    "bucket"             :   "私有空间名",
    "zone"               :   "na0",
    "rescan_local"       :   true,
    "skip_path_prefixes" :   ".qshell"
}

各机房对应的 zone 值

华东      nb
华北      bc
华南      hn
北美      na0
上传备份文件到私有空间

一般选择 source/_posts 里面的文章做备份,配置文件 _config.yml 不建议上传

./qshell_linux_amd64 qupload config.txt
写成脚本最后加入到 crontab 一天更新一次
* 22 * * * sh ~/hexo-backup/backup2qiniu.sh
更多细节请参考 qshell官方文档


这个打赏二维码好像有什么不对

支付宝
alipay

微信
wechat