程序员如何搭建本身的我的博客

我从2016年开始写博客,陆陆续续写了大概两百篇博客。写博客有不少好处,其一是它可以迫使你总结你学习的知识,你需不但的消化本身的知识点,使你对知识有了更深入的认识;其二是你的博客如同你的我的简历,记录了你的学习历程,经过写博客,可让别人认识你,能够结交更多的行业朋友;其三,博客起到了传播知识的做用,特别是技术类的博客可以帮助别人解决技术问题,帮助人是一件快乐的事,何乐而不为。因此写博客对于程序员来讲相当重要,在我以前的文章,我已经讲述过了,写博客给我带来了什么,再次不在赘述。html

我一开始写博客是从简书开始的,当时被简书优雅的markdown写做方式所吸引。刚开始写文章网的阅读量,一篇可以达到几百的阅读量是很是开心的事情,若是可以被简书推荐到首页可以开心好几天。在简书我认识了木东居士仗剑走天涯,并在那时创建了简书圈,并保持了很是好的友谊关系,很是的珍贵。node

大概17年初我将本身的写博客主要阵地转移到了CSDN,缘由是CSDN在百度搜索引擎中占据了最高的权重。后面证实个人判断是正确的,个人CSDN博文阅读量一路飙升,让更多的人能够的阅读个人博客。linux

就在上个月我阅读了纯洁的微笑的博文 技术人如何搭建本身的技术博客这篇文章,我决定折腾一下搭建一下本身的我的博客。nginx

其实在17年,我就开始搭建了本身的我的博客,采用Jekyll静态博客,托管在github上面的,而且买了本身的域名fangzhipeng.com,cname到github上。因为github网络不稳定,体验实在是太差,一直没有怎么打理,处于一种无人管理的状态。c++

就在月初,我将我的的博客迁移到了本身的服务器,并在群里放出来,有人就让我写篇博文,让他参考下如何搭建属于本身的我的博客。因而我抽空写出了这篇文章。git

这篇文章详细的介绍了如何搭建个人我的博客。程序员

使用Github托管博客

在github上托管博客上很是简单的一件事,只须要fork一个你喜欢的博客的主题,并将fork的工程名修改成{github-username}.github.io,并将原博主的文章删除,并放上本身的博文,就能够了。github

好比个人博客使用的是https://github.com/Huxpro/huxpro.github.io的主题,首先我将这个项目fork一下,并将fork后的项目更名字为forezp.github.io,读者须要将forezp替换成本身的github用户名。web

而后打开网页forezp.github.com就能够访问该主题的博客了。将修改后项目git clone下来,按照主题说明进行配置的修改,将原博主的文章删除,替换成本身的博文,git push修改后的工程到github上面,github pages就会自动构建,根据你的修改内容生成页面,访问{github-username}.github.io就能够看到修改后的内容。shell

若是你须要本身的域名,能够在阿里云上申请本身的域名,好比的个人域名为fangzhipeng.com。在阿里云的控制台的域名解析配置如下的内容:

github域名解析.png

并在项目中的根目录上加CNAME文件,写上本身申请的域名,好比的个人:

www.fangzhipeng.com

大概过10-20分钟以后,就能够经过域名访问你的我的博客了,经过{github-username}.github.io访问我的博客也会显示你申请的域名。

须要注意的是,域名须要备案哦。

使用本身的服务器部署博客

使用Gthub搭建我的博客简单、快捷、方便,可是Github在国外啊,网络极其不稳定,访问速度慢,让人抓狂,这时能够将本身的博客部署在阿里云的ECS上。ECS须要购买哦,须要购买的同窗点击这里,领取代金券

本人使用Jekyll进行搭建的博客,因此须要在服务中安装Jekyll环境,个人服务器系统版本为entOS 7.2,安装的jekyll版本为3.8.4。

安装jekyll主要参考了https://jekyllcn.com/docs/installation/,由于安装过程比较繁琐和报的错比较多,如今详细讲解下,在我安装jekyll的过程和所遇到的坑。

安装Node

安装Node环境,执行如下命令:

wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz
xz -d node-v8.12.0-linux-x64.tar.xz
tar -xf node-v8.12.0-linux-x64.tar 
ln -s ~/node-v8.12.0-linux-x64/bin/node /usr/bin/node
ln -s ~/node-v8.12.0-linux-x64/bin/npm /usr/bin/npm
node -v 
npm

复制代码

安装ruby

Jekyll依赖于Ruby环境,须要安装Ruby,执行如下命令便可:

wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.4.tar.gz
 mkdir  -p /usr/local/ruby
 tar -zxvf ruby-2.4.4.tar.gz 
 cd ruby-2.4.4
 ./configure --prefix=/usr/local/ruby
 make && make install
 cd ~
 vim .bash_profile 
 source .bash_profile

复制代码

安装gcc

安装gcc执行如下命令:

yum -y update gcc
yum -y install gcc+ gcc-c++

复制代码

安装jekyll

最后安装Jekyll,执行如下命令

gem install jekyll
jekyll --version
gem update --system

复制代码

能够经过jekyll --version查看版原本验证是否安装成功,若是安装成功,则会显示正确的版本号。

安装过程当中可能存在的问题

使用jekyll建立一个博客模板,并启Server服务,执行如下的命令:

jekyll new myblog
cd myblog/
jekyll serve

复制代码

当执行jekyll serve命令,我服务器环境报来如下的错误:

`block in verify_gemfile_dependencies_are_found!': Could not find gem 'minima (~> 2.0)' in any of the gem sources listed in your Gemfile. (Bundler::GemNotFound)
	from /usr/local/ruby/lib/ruby/site_ruby/2.4.0/bundler/resolver.rb:257:in `each'

复制代码

查了相关的资料,须要安装bundler和minima插件,安装命令以下:

gem install bundler
gem install minima

复制代码

部署个人博客

部署博客须要在服务器中编译博客,而后编译后的博客放在Nginx服务的静态路径上

编译博客

须要git工具,下载在github上面的代码,执行如下命令:

git clone https://github.com/forezp/forezp.github.io
cd forezp.github.io
jekyll serve

复制代码

jekyll serve命令会编译我从github上下载的源码,在这一步,第一次执行会报如下的错误:

Deprecation: The 'gems' configuration option has been renamed to 'plugins'. Please update your config file accordingly.
  Dependency Error: Yikes! It looks like you don't have jekyll-paginate or one of its dependencies installed. 
复制代码

是由于博客须要用到sitemap和paginate插件,安装下便可。

gem install jekyll-sitemap
gem install jekyll-paginate

复制代码

从新执行jekyll serve,运行成功,此时能够经过curl命令查看服务器里部署的博客。

部署到Nginx服务器上:

经过Jekyll编译后的静态文件须要挂载到Nginx服务器,须要安装Nginx服务器。 安装过程参考了http://nginx.org/en/linux_packages.html#mainline

按照文档,新建文件/etc/yum.repos.d/nginx.repo,在文件中编辑如下内容并保存:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
复制代码

而后执行安装nginx命令,以下:

yum install nginx

复制代码

Nginx配置成功后,须要设置Nginx的配置,配置文件路径为/etc/nginx/conf.d/default.conf,配置的内容以下:

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page  404              /404.html;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
   
   }

复制代码

安装Nginx服务器成功后,将Jekyll编译的博客静态html文件输出到Nginx服务器上,执行如下的命令:

jekyll build --destination=/root/blog/html

复制代码

启动Nginx服务器,就能够正常的博客网页了,若是须要在浏览器上访问,须要在阿里云ECS控制台的安全组件暴露80端口。若是想经过域名访问,须要将域名解析设置指向你的服务器。

非www域名的重定向到www

好比我想访问http://fangzhipeng.com重定向到http://www.fangzhipeng.com上,须要在Nginx的配置文件/etc/nginx/conf.d/default.conf,修改配置如下内容:

listen       80;
    server_name  fangzhipeng.com www.fangzhipeng.com;


    if ( $host != 'www.fangzhipeng.com' ) {
          rewrite "^/(.*)$" http://www.fangzhipeng.com/$1 permanent;
         }

复制代码

自动化部署

经过设置github的webhook能够实现自动化构建和部署。过程是,提交博文或者配置到github仓库,仓库会触发你设置的webhook,会向你设置的webhook地址发送一个post请求,好比我设置的请求是在服务器的跑的一个Nodejs程序,监听gitub webhook的请求,接受到请求后,会执行shell命令。

首先设置github仓库的webhook,在github仓库的项目界面,比个人个人项目界面https://github.com/forezp/forezp.github.io,点击Setting->Webhooks->Add Webhook,在添加Webhooks的配置信息,个人配置信息以下:

这样Webhook就设置成功了,如今在博客所在的服务端去监听Github Webhook发送的请求,我采用的开源组件去监听github-webhook-handler,项目地址为:github.com/rvagg/githu…

npm install -g github-webhook-handle
复制代码

安装成功后,在/root/node-v8.12.0-linux-x64/lib/node_modules/github-webhook-handler下新建deploy.js文件:

var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/incoming', secret: 'a123456' }) 
 
function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";
 
  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}
 
http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(3001)
 
handler.on('error', function (err) {
  console.error('Error:', err.message)
})
 
handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
  run_cmd('sh', ['./start_blog.sh'], function(text){ console.log(text) });
})

复制代码

上述代码中,指定了nodejs服务的践踏端口为3001,监听了path/incoming,Secret为a123456,这和以前Github Webhook设置的要保持一致。代码run_cmd('sh', ['./start_blog.sh'],指定了接受到请求后执行./start_blog.sh,start_blog.sh文件的代码以下,首先进入到博客的代码文件,拉代码,编译。

echo `date`
cd /root/forezp.github.io
echo start pull from github 
git pull
echo start build..
jekyll build --destination=/usr/share/nginx/html

复制代码

而后须要使用forever来启动deploy.js的服务,执行命令以下:

sudo npm install forever -g   #安装
$ forever start deploy.js          #启动
$ forever stop deploy.js           #关闭
$ forever start -l forever.log -o out.log -e err.log deploy.js   #输出日志和错误
/root/node-v8.12.0-linux-x64/lib/node_modules/forever/bin/forever start -l forever.log -o out.log -e err.log deploy.js

若是报错:
/root/node-v8.12.0-linux-x64/lib/node_modules/forever/bin/forever start -a -l forever.log -o out.log -e err.log deploy.js

复制代码

最后一步,须要在nginx服务器的配置文件,须要将监听的/incoming请求转发到nodejs服务上,配置代码以下:

location = /incoming {
     proxy_pass http://127.0.0.1:3001/incoming;
}
复制代码

这样,当你提交了文章或者修改的配置到gitub上,github经过webhook向你所在的服务器发送请求,服务器接收到请求后执行 sh命令,sh命令包括了从新pull代码和编译代码的过程,这样自动化部署就完成了,你只需提交代码,服务器就触发pull代码和从新编译的动做。

补充

博客能够设置百度统计、谷歌分析、不蒜子统计、Gittalk留言板等功能,这些功能须要本身申请帐号,实现起来比较简单,具体本身百度。

另外,若是博客须要上https协议,须要在阿里云申请免费的SSL证书,申请完以后,能够在阿里云上查看Nginx安装SSL证书的教程,并作配置,按照它的提示来,比较简单。最后涉及到了涉一个重定向的问题,好比个人网站,我须要将 fangzhipeng.comwww.fangzhipeng.comfangzhipeng.com 所有重定向到https://www.fangzhipeng.com,这时须要修改nginx的配置文件default.conf,如今我贴出个人完整的配置以下:

server {
        listen       80;
        server_name  fangzhipeng.com www.fangzhipeng.com;
        return 301 https://www.fangzhipeng.com$request_uri;
    }
server {
        listen 443;
        server_name fangzhipeng.com;
        return 301 https://www.fangzhipeng.com$request_uri;
    }

server {
    listen 443 default_server ssl;
    server_name  www.fangzhipeng.com;
    #if ( $host != 'www.fangzhipeng.com' ) {
    #      rewrite "^/(.*)$" http://www.fangzhipeng.com/$1 permanent;
    #  }

    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   cert/215042476190582.pem;
    ssl_certificate_key  cert/215042476190582.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
     location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

复制代码

到此,个人博客搭建过程所有讲解完毕,若是有任何问题欢迎加我微信miles02(备注博客疑问)和我讨论,若是问的人多,我考虑建一个交流群,你们一块儿讨论答疑。你们也能够在留言版上留下本身的博客,让你们互相访问。

写博客贵在坚持,贵在有一颗分享的心。我是看了纯洁的微笑的博文,才有动力折腾了一下本身的博客,但愿你看了个人这篇博文,会有本身搭建博客的冲动,而后本身动手完整的搭建,谢谢你们。


扫码关注有惊喜

(转载本站文章请注明做者和出处 方志朋的博客

相关文章
相关标签/搜索