前两天买了一台百度云服务器花了11块钱,花了点时间学了下如何部署hexo博客以及一些服务器方面的配置,没用hexo推荐的方式部署。专门记一个文章。系统用的是centos,先上图和链接
博客地址
sunqx的博客
步骤
- 先用hexo快捷搭建本地blog,再把项目上传到github
- 本地ssh无密码登陆远程服务器,把服务器的防火墙打开并配置指定端口才可以登陆
- 远程服务器配置 ssh key 后再把项目从git clone到云服务器
- 再用pm2,直接本地快捷部署项目到服务器并重启
- 使用nginx 转发端口
配置要点
先用hexo快捷搭建本地blog
首先解释下
hexo 基于nodejs的快速、简洁且高效的博客框架,它是帮人快速搭建个人博客的。
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。就是一开始上手感觉好容易报错。
这里只将一些官网上没有的,如何本地跑起来一个hexo 项目和部署一个主题请看官网 hexo官网
hexo server
是项目 的启动命令 ,默认hexo启动端口是4000。但这样启动项目,nodejs是一个单线程项目,万一某一次程序出错,那整个服务就挂了。所以需要pm2 来监控这项线程,万一出错pm2还能自动重启。
pm2 启动命令一般是pm2 start app.js
那如何用pm2 来管理hexo呢,可以通过在项目目录下新建一个 app.js
var spawn = require('child_process').spawn;
free = spawn('hexo', ['server', '-p 4000']);/* 其实就是等于执行hexo server -p 4000*/
free.stdout.on('data', function (data) {
console.log('hexo standard output:\n' + data);
});
free.stderr.on('data', function (data) {
console.log('hexo standard error output:\n' + data);
});
free.on('exit', function (code, signal) {
console.log('hexo child process eixt ,exit:' + code);
});
如此一来在项目根目录下 就能用 pm2 start app.js
来跑hexo项目了
本地ssh无密码登陆远程服务器,服务器 ssh key 配置
初次配置的云服务器需要安装这些工具包
sudo yum install vim openssl build-essential libssl-dev wget curl git
yum install gcc-c++
本地配置ssh key
- 本地 cd /
- cd .ssh 或者 open ~/.ssh
- ls
id_rsa id_rsa.pub known_hosts
- 备份
mv id_rsa id_rsa_backup
mv id_rsa.pub id_rsa_backup.pub
- 生成ssh公钥
ssh-keygen -t rsa -b 4096 -C "[email protected]"
- 查看
cat id_rsa
cat id_rsa.pub
- key作用生效
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
- 然后在连上远程服务器
cd ~/.ssh
,编辑服务器端授权文件vi authorized_keys
- 在在客户端 输入
cat id_rsa.pub
将带有邮箱的公钥复制进去,再:wq!退出authorized_keys - 配置生效
sudo service sshd restart
- 然后就可以直接通过 ssh [email protected] 来免密码 登陆了
注意点:
- 因为我连上云服务器后也没创建新用户,直接用root 编辑的,其他人配置是要注意一下 权限问题,我看网上也有不少人因为权限问题而生效失败
- 如果还是配置没生效,需要看一下 sshd_config配置详解
RSAAuthentication yes
PubkeyAuthentication yes
这两项不能为no - 还有一个地方,每次ssh登陆输ip太过于麻烦,当然你用secureCRT这样的工具当我没说, 在mac下面 可以配置快捷连接云服务器的命令
-- 在sudo vim ~/.bashrc
-- 新加alias ssh_baiduyun="ssh [email protected]"
--source .bashrc
以后即可通过ssh_baiduyun
连接服务器 - 再重申一点 本地的
id_rsa.pub
对应的是 服务器上的authorized_keys
,两个复制错了就尴尬了
在服务器配置ssh并clone git 项目
生成服务器端公钥 和本地一样
cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "[email protected]"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
生效,centos 下service sshd restart
把 id_rsa.pub
里面的内容 放到git 账户里面ssh 配置里
注意!! 在服务器里你准备clone 项目的文件夹里 先用ssh clone 一遍
[email protected]:SHpoi/my-blog.git
第一次git clone 会有确认项,不然后面用pm2部署老是会遇到一个拉取项目为空的报错。
在服务器配置nodejs环境
服务器配置nodejs 用的是nvm,安装nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
nvm 安装以后重新连接云服务器,不然环境变量不会生效
nvm安装nodejs,依次执行以下命令
nvm install v8.9.0
nvm use v8.9.0
nvm alias default v8.9.0
npm --registry=https://registry.npm.taobao.org install -g npm
拉取完以后记得先试用hexo server
着能不能跑起来,进入文件夹先npm install
再看还差什么其他的全局依赖
在本地使用pm2 一键部署云服务器上的项目
这一块真的是血泪啊,就2行命令行,报的错查了一下午。
- 在本地项目目录下新建一个 ecosystem.json,与app.js平级
{
"apps" : [{
"name": "myApp",
"script": "app.js",
"instances": 1,
"autorestart": true,
"env": {
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
}
}],
"deploy" : {
"production" : {
"user" : "root",
"host" : "xx.xx.xx.xx",
"port" : "22",
"ssh_options": "StrictHostKeyChecking=no",
"ref" : "origin/master",
"repo" : "[email protected]:SHpoi/my-blog.git",
"path" : "/root/www/myblog/",
"env": {
"NODE_ENV": "production"
},
"pre-setup": "rm -rf /var/www/myblog/production/source",
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production",
"env" : {
"NODE_ENV": "production"
}
}
}
}
然后运行2行命令 第一行在云服务器搭建运行环境,第二行每次重新发布项目需要
pm2 deploy ecosystem.json production setup
注意有巨坑,第一次ssh clone 会校验,要先在该目录下clone 一遍git ssh 连接,之后才会成功。不然会一直报空链接
pm2 deploy ecosystem.json production --force
force一定要加不然git会报冲突不解决
以后每次发布博客
hexo new '记一次hexo 博客上线 经验总结'
生成md文件,写完以后提交到git仓库
再用命令行在本地项目执行下 pm2 deploy ecosystem.json production --force
即可
pm2 配置注意点
-
pm2 deploy ecosystem.json production --force
force一定要加不然git会报冲突不解决 - 运行setup命令时 第一次ssh clone 会校验,要先在该目录下clone 一遍git ssh 连接,之后才会成功。不然会一直报空链接。第一次clone完删了即可。
- 启动前先删了source里面的git 代码,不然pm2 会报冲突不解决而部署失败
"pre-setup": "rm -rf /var/www/myblog/production/source",
- 部署后运行 命令进行项目依赖包安装 再跑起来hexo项目
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production",
-
"script": "app.js"
为了让json 找到app.js,所以放平级,这个json文件如果不是私有仓库不建议提交,当然我是提了,不过你们有高手千万别看了我的git项目的配置文件就攻击它,活动买的加上域名服务就12块钱。 -
/root/www/myblog/
我是为了方便我登进去就能找项目才放root下的。还有这个目录需先创建,不然pm2不知道部署在哪。
nginx配置
这一块没啥说的 无非就是端口转发, 80转4000
nginx 安装
sudo yum install nginx
安装完重连服务器,不然怎么输命令配置都不生效
upstream myblog{
server localhost:4000;
}
server {
listen 80 ;
server_name www.sunqx.top;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://myblog;
proxy_redirect off;
}
}
nginx 配置生效
sudo nginx -t
sudo nginx -s reload