mac+hexo+github搭建自己的博客

这是一篇详细文章来讲述用Mac搭建Hexo博客于Github上的完整历程, 也是踩了无数的坑搭起来的,现在写下些经验来分享,希望能帮大家少踩些坑。

环境配置
Hexo官网上本就有对Hexo安装及使用的详细介绍,墙裂推荐。这里来讲述自己安装的亲身步骤,或有区别。

1.Node.js

用来生成静态页面。移步Node.js官网,下载v5.5.0 Stable 一路安装即可。

2.Git

用来将本地Hexo内容提交到Github上。Xcode自带Git,这里不再赘述。如果没有Xcode可以参考Hexo官网上的安装方法。

安装Hexo
当Node.js和Git都安装好后就可以正式安装Hexo了,终端执行如下命令:

1
$ sudo npm install -g hexo
输入管理员密码(Mac登录密码)即开始安装 (sudo:linux系统管理指令 -g:全局安装)

注意坑一:Hexo官网上的安装命令是$ npm install -g hexo-cli,安装时不要忘记前面加上sudo,否则会因为权限问题报错。

初始化

终端cd到一个你选定的目录,执行hexo init命令:

1
$ hexo init blog
blog是你建立的文件夹名称。cd到blog文件夹下,执行如下命令,安装npm:

1
$ npm install
执行如下命令,开启hexo服务器:

1
$ hexo s
此时,浏览器中打开网址http://localhost:4000,能看到如下页面:

http://localhost:4000

本地设置好后,接下来开始关联Github。

关联Github
1.创建仓库

登录你的Github帐号,新建仓库,名为用户名.github.io固定写法,如gonghonglou.github.io即下图中1所示:

](http://localhost:4000

本地的blog文件夹下内容为:

1
2
3
4
5
6
7
_config.yml
db.json
node_modules
package.json
scaffolds
source
themes
终端cd到blog文件夹下,vim打开_config.yml,命令如下:

1
$ vim _config.yml
打开后往下滑到最后,修改成下边的样子:

1
2
3
4
deploy:
type: git
repository: https://github.com/gonghonglou/gonghonglou.github.io.git
branch: master
你需要将repository后gonghonglou换成你自己的用户名,地址在上图2位置获取。hexo 3.1.1版本后type:值为git。

注意坑二:在配置所有的_config.yml文件时(包括theme中的),在所有的冒号:后边都要加一个空格,否则执行hexo命令会报错,切记 切记

在blog文件夹目录下执行生成静态页面命令:

1
$ hexo generate 或者:hexo g
此时若出现如下报错:
ERROR Local hexo not found in ~/blog
ERROR Try runing: ‘npm install hexo –save’

则执行命令:
npm install hexo –save

若无报错,自行忽略此步骤。
再执行配置命令:

1
$ hexo deploy 或者:hexo d
注意坑三:若执行命令hexo deploy仍然报错:无法连接git或找不到git,则执行如下命令来安装hexo-deployer-git:

$ npm install hexo-deployer-git –save
再次执行hexo generate和hexo deploy命令。

若你未关联Github,则执行hexo deploy命令时终端会提示你输入Github的用户名和密码,即

1
2
Username for ‘https://github.com‘:
Password for ‘https://github.com‘:
hexo deploy命令执行成功后,浏览器中打开网址http://gonghonglou.github.io(将gonghonglou换成你的用户名)能看到和打开http://localhost:4000时一样的页面。

为避免每次输入Github用户名和密码的麻烦,可参照第二节方法

2.添加ssh key到Github

1.1.检查SSH keys是否存在Github

执行如下命令,检查SSH keys是否存在。如果有文件id_rsa.pub或id_dsa.pub,则直接进入步骤1.3将SSH key添加到Github中,否则进入下一步生成SSH key。

1
$ ls -al ~/.ssh
1.2.生成新的ssh key

执行如下命令生成public/private rsa key pair,注意将your_email@example.com换成你自己注册Github的邮箱地址。

1
$ ssh-keygen -t rsa -C “your_email@example.com”
默认会在相应路径下(~/.ssh/id_rsa.pub)生成id_rsa和id_rsa.pub两个文件。

1.3.将ssh key添加到Github中

Find前往文件夹~/.ssh/id_rsa.pub打开id_rsa.pub文件,里面的信息即为SSH key,将这些信息复制到Github的Add SSH key页面即可。

进入Github –> Settings –> SSH keys –> add SSH key:

Title里任意添一个标题,将复制的内容粘贴到Key里,点击下方Add key绿色按钮即可。

3.发布文章

终端cd到blog文件夹下,执行如下命令新建文章:

1
$ hexo new “postName”
名为postName.md的文件会建在目录/blog/source/_posts下,postName是文件名,为方便链接不建议掺杂汉字。你当然可以用vim来编辑文章。我在用Mou编辑器,支持预览,虽然其预览主题并非我喜欢,如果你有好用的markdown编辑器请推荐给我,感激不尽!

文章编辑完成后,终端cd到blog文件夹下,执行如下命令来发布:

1
2
3
hexo generate //生成静态页面

hexo deploy //将文章部署到Github
至此,Mac上搭建基于Github的Hexo博客就完成了。下面的内容是介绍安装theme和绑定个人域名,如果有兴趣且还有耐心的话,请继续吧。

安装theme
你可以到Hexo官网主题页去搜寻自己喜欢的theme。这里以hexo-theme-next为例

终端cd到 blog 目录下执行如下命令:

1
$ git clone https://github.com/iissnan/hexo-theme-next themes/next
将blog目录下_config.yml里theme的名称landscape修改为next

终端cd到blog目录下执行如下命令(每次部署文章的步骤):

1
2
3
4
5
$ hexo clean //清除缓存文件 (db.json) 和已生成的静态文件 (public)

$ hexo g //生成缓存和静态文件

$ hexo d //重新部署到服务器
至于更改theme内容比如名称、描述、头像等去修改blog/_config.yml文件和blog/themes/next/_config.yml文件中对应的属性名称即可, 不要忘记冒号:后加空格。 NexT 使用文档里有极详细的介绍。

绑定个人域名
现在使用的域名是Github提供的二级域名,也可以绑定为自己的个性域名。购买域名,可以到GoDaddy官网,网友亲切称呼为:狗爹,也可以到阿里万网购买。我是在万网买的,可直接在其网站做域名解析。

1.Github端

在/blog/themes/next/source目录下新建文件名为:CNAME文件,注意没有后缀名!直接将自己的域名如:gonghonglou.com写入。

终端cd到blog目录下执行如下命令重新部署:

1
2
3
4
5
$ hexo clean

$ hexo g

$ hexo d
注意坑四:网上许多都是说在Github上直接新建CNAME文件,如果这样的话,在你下一次执行hexo d部署命令后CNAME文件就消失了,因为本地没有此文件嘛。

2.域名解析

如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。登录万网,在你购买的域名后边点击:解析 –> 添加解析

记录类型:CNAME

主机记录:将域名解析为example.com(不带www),填写@或者不填写

记录值:gonghonglou.github.io. (不要忘记最后的.,gonghonglou改为你自己的用户名),点击保存即可,如下图:

域名解析](http://localhost:4000

此时,点击访问http://gonghonglou.com和访问http://gonghonglou.github.io效果一致。

大功告成!

——11.10更新 以下————————————————

1、解决 deploy 后博客空白问题

昨晚更新了一下 blog 做了个部署,结果blog就挂了,打开 gonghonglou.com 页面显示一片空白。然而 hexo s 开启本地服务器 localhost:4000 访问是没问题的。
上网查了一下,原来是 GitHub Pages 禁止了 source/vendors 目录的访问。Github 在 11 月 3 日更新了版本。其中包括升级了 Jekyll 到 3.3。Jekyll 为了加快构建速度,忽略 vendor 和 node_modules 文件夹。所以部署到 GitHub 后,识别不到本地下的的这个文件夹 blog/themes/next/source/vendor,你只需要给这个文件夹换个名字再重新部署一次就 OK 了。nexT 在 GitHub 上的 isusses 已经给出了解决方案:#1214

#1214

还有另一种解决方案就是升级 nexT 主题,cd 到 blog/themes/next/ 下执行命令 git pull 更新。
然而,有可能升级后多说评论等第三方工具会失效,慎用。

2、将个人博客同时部署到 GitHub 和 Coding

1、首先到 Coding 上注册并开一个项目,项目名称和用户个性后缀相同(方便二级域名访问博客),拿到项目的 https 地址

2、打开本地 blog 目录下的 _config.yml 文件,修改如下

1
2
3
4
5
6
deploy:
type: git
repository:
github: https://github.com/gonghonglou/gonghonglou.github.io.git
coding: https://git.coding.net/gonghonglou/gonghonglou.git
branch: master
3、cd 到本地 blog/source 目录下执行如下命令新建 Staticfile 文件

1
$ touch Staticfile #名字必须是Staticfile
原因是 coding.net 需要以这个文件来作为静态文件部署的标志,就是说看到这个 Staticfile 就知道按照静态文件来发布。

4、执行发布命令 hexo g 、 hexo d

5、个人域名添加两条 CNAME 解析。将 gonghonglou.github.io. 解析为 [海外] ,将 gonghonglou.coding.me. 解析为 [默认]

这样就是为了从国内访问 gonghonglou.com 就是访问 Coding 上的博客项目,从国外访问 gonghonglou.com 就是访问 GitHub 上的博客项目。

6、到 Coding 上的博客项目主页,点击 Pages服务 输入部署分支 master 立即开启

这样就可以访问自己在 Coding 上的个人博客了 gonghonglou.coding.me/gonghonglou 如果像这样你的用户后缀名与博客项目名称相同你还可以省略项目名称直接访问 gonghonglou.coding.me

7、添加域名绑定,输入个人域名就 OK 了,可能需要耐心等待几分钟,这样在国内访问自己的博客就快得多了。

试了一下在国内访问 gonghonglou.com 拦不住 要飞起来了😂

——11.10更新 以上————————————————

后记
以上便是我搭建与佳期的个人博客(gonghonglou.com)的全过程,希望对大家有所帮助,欢迎吐槽~

转载请保留原文地址:http://gonghonglou.com/2016/02/03/firstblog

Reference
Hexo官网
HEXO
如何生成SSH key
由丢失一部iPhone6引发的祸端
文章目录 站点概览
© 2016 - 2017 与佳期
由 Hexo 强力驱动 主题 - NexT.Mist

什么是ETag

ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思。在HTTP1.1协议中其实就是请求HEAD中的一个属性而已。

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: “3f80f-1b6-3e1cb03b”
Accept-Ranges: bytes
Connection: close


An Example Page


Hello World, this is a very simple HTML document.


请注意第8行的 ETag: “3f80f-1b6-3e1cb03b”配置,那么为什么要用ETag呢?

ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把”3f80f-1b6-3e1cb03b” 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: “3f80f-1b6-3e1cb03b” 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。

注:HTTP中并没有指定如何生成ETag,哈希是比较理想的选择。

作者:ntop
链接:https://www.jianshu.com/p/a3ea9619c38d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

nginx 如何解析一个请求

会用到的概念:

默认虚拟主机:在多个server的情况下,被设置了default_server监听端口属性的server为默认虚拟主机(v0.8.21前监听端口属性的关键字为default) ,如果没有被设置的主机,则第一个server为默认虚拟主机。

server {
listen 80 default_server;
server_name example.net www.example.net;

}

首先会用到nginx的配置文件 nginx.conf

首先根据host找到指定server,如果没有host或没有找到指定的server,

就会找到默认的虚拟主机。

如果不允许请求中缺失host头可以定义如下主机,丢弃这些请求

server {
listen 80;
server_name “”;
return 444;
}
可以设置主机名为空来匹配缺失host头的请求,而且返回了一个nginx特有的,非http标准的返回码4444,可以关闭连接。

从0.8.48版本开始,这已成为主机名的默认设置,所以可以省略server_name “”。而之前的版本使用机器的hostname作为主机名的默认值

下面让我们来看一个复杂点的配置,在这个配置里,有几个虚拟主机在不同的地址上监听:

server {
listen 192.168.1.1:80;
server_name example.org www.example.org;

}

server {
listen 192.168.1.1:80;
server_name example.net www.example.net;

}

server {
listen 192.168.1.2:80;
server_name example.com www.example.com;

}
这个配置中,nginx首先测试请求的IP地址和端口是否匹配某个server配置块中的listen指令配置。接着nginx继续测试请求的Host头是否匹配这个server块中的某个server_name的值。如果主机名没有找到,nginx将把这个请求交给默认虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问www.example.com的请求将被监听192.168.1.1:80端口的默认虚拟主机处理,本例中就是第一个服务器,因为这个端口上没有定义名为www.example.com的虚拟主机。

默认服务器是监听端口的属性,所以不同的监听端口可以设置不同的默认服务器:

server {
listen 192.168.1.1:80;
server_name example.org www.example.org;

}

server {
listen 192.168.1.1:80 default_server;
server_name example.net www.example.net;

}

server {
listen 192.168.1.2:80 default_server;
server_name example.com www.example.com;

}

现在我们来看在一个典型的,简单的PHP站点中,nginx怎样为一个请求选择location来处理:

server {
listen 80;
server_name example.org www.example.org;
root /data/www;

location / {
    index   index.html index.php;
}

location ~* \.(gif|jpg|png)$ {
    expires 30d;
}

location ~ \.php$ {
    fastcgi_pass  localhost:9000;
    fastcgi_param SCRIPT_FILENAME
                  $document_root$fastcgi_script_name; // host:192.0.0.1/index.php   /data/www/index.php  $document_root = /data/www , $fastcgi_script_name = /index.php
    include       fastcgi_params;
}

}
首先,nginx使用前缀匹配找出最准确的location,这一步nginx会忽略location在配置文件出现的顺序。上面的配置中,唯一的前缀匹配location是”/“,而且因为它可以匹配任意的请求,所以被作为最后一个选择。接着,nginx继续按照配置中的顺序依次匹配正则表达式的location,匹配到第一个正则表达式后停止搜索。匹配到的location将被使用。如果没有匹配到正则表达式的location,则使用刚刚找到的最准确的前缀匹配的location。

请注意所有location匹配测试只使用请求的URI部分,而不使用参数部分。这是因为写参数的方法很多,比如:

/index.php?user=john&page=1
/index.php?page=1&user=john
除此以外,任何人在请求串中都可以随意添加字符串:

/index.php?page=1&something+else&user=john
现在让我们来看使用上面的配置,请求是怎样被处理的:

请求”/logo.gif”首先匹配上location “/“,然后匹配上正则表达式”.(gif|jpg|png)$”。因此,它将被后者处理。根据”root /data/www”指令,nginx将请求映射到文件/data/www/logo.gif”,并发送这个文件到客户端。
请求”/index.php”首先也匹配上location “/“,然后匹配上正则表达式”.(php)$”。 因此,它将被后者处理,进而被发送到监听在localhost:9000的FastCGI服务器。fastcgi_param指令将FastCGI的参数SCRIPT_FILENAME的值设置为”/data/www/index.php”,接着FastCGI服务器执行这个文件。变量$document_root等于root指令设置的值,变量$fastcgi_script_name的值是请求的uri,”/index.php”。
请求”/about.html”仅能匹配上location “/“,因此,它将使用此location进行处理。根据”root /data/www”指令,nginx将请求映射到文件”/data/www/about.html”,并发送这个文件到客户端。
请求”/“的处理更为复杂。它仅能匹配上location “/“,因此,它将使用此location进行处理。然后,index指令使用它的参数和”root /data/www”指令所组成的文件路径来检测对应的文件是否存在。如果文件/data/www/index.html不存在,而/data/www/index.php存在,此指令将执行一次内部重定向到”/index.php”,接着nginx将重新寻找匹配”/index.php”的location,就好像这次请求是从客户端发过来一样。正如我们之前看到的那样,这个重定向的请求最终交给FastCGI服务器来处理。

安装nginx的一些参数

configure命令用来配置nginx编译环境。 该命令定义了系统各方面功能,包括允许nginx使用的连接处理方式。 其执行结果是生成一个Makefile文件。 configure命令支持如下参数:

–prefix=path — 定义服务器文件的完整路径,该路径同时也是configure命令设置的 相对路径(除类库源文件外)以及nginx.conf文件定义的相对路径的基准路径。其默认 值是/usr/local/nginx。

–sbin-path=path — 设置nginx可执行文件的完整路径,该路径仅在安装期间使用, 默认路径为prefix/sbin/nginx。

–conf-path=path — 设置配置文件nginx.conf的完整路径。如有必要,总是可以 在nginx启动时通过命令行参数-cfile指定一个不同的配置文件路径。 默认路径为prefix/conf/nginx.conf。

–pid-path=path — 设置nginx.pid文件的完整路径,该文件存储了主进程的进程ID。安装完成后, 该路径总是可以在nginx.conf文件中用 pid指令来修改。 默认路径为prefix/logs/nginx.pid。

–error-log-path=path — 设置记录主要错误、警告以及调试信息日志的完整路径。安装完成后, 该路径总是可以在nginx.conf文件中用 error_log 指令来修改。 默认路径为prefix/logs/error.log。

–http-log-path=path — 设置记录HTTP服务器主要请求日志的完整路径。安装完成后, 该路径总是可以在nginx.conf文件用 access_log 指令来修改。 默认路径为prefix/logs/access.log

–user=name — 设置工作进程以某非特权用户的身份运行。安装完成后,该用户名总是可以在 nginx.conf文件用user指令来修改。 其默认值为nobody。

–group=name — 设置工作进程以某非特权用户的身份运行。安装完成后,该用户名总是可以在 nginx.conf用user指令来修改。 其默认名称与未授权用户名称相同。

–with-select_module
–without-select_module — 设置是否将select()方法模块编译进nginx中。如果系统平台不支持kqueue、epoll、rtsig或/dev/poll等更合适的方法, 该模块会被自动编译。

–with-poll_module
–without-poll_module — 设置是否将poll()方法模块编译进nginx中。如果系统平台不支持kqueue、epoll、rtsig或/dev/poll等更合适的方法, 该模块会被自动编译。

–without-http_gzip_module — 不编译http_gzip_module模块。该模块可以压缩HTTP服务器的响应,该模块需要zlib库才能编译和运行。

–without-http_rewrite_module — 不编译http_rewrite_module模块。该模块允许HTTP服务器重定向请求,改变请求的URI地址 。创建并运行该模块需要PCRE库支持。

–without-http_proxy_module — 不编译HTTP服务器的代理模块。

–with-http_ssl_module — 为HTTP服务器编译HTTPS协议支持的模块。该模块默认是不编译的。它需要OpenSSL库才能编译和运行。

–with-pcre=path — 设置PCRE库源文件的路径地址。PCRE库的发行版(version 4.4 — 8.30)需要先从PCRE站点下载并解压缩。 剩下的安装工作由nginx的./configure和make命令来完成。该库应用于location 指令的正则表达式支持以及ngx_http_rewrite_module模块。

–with-pcre-jit — 编译PCRE库时增加“实时编译(pcre_jit)”支持。

–with-zlib=path — 设置zlib库源文件的路径地址。zlib库的发行版(version 1.1.3 — 1.2.5)需要先从zlib站点下载并解压缩。 剩下的安装工作由nginx的./configure和make命令来完成。该库应用于 ngx_http_gzip_module模块。

–with-cc-opt=parameters — 设置将会添加额外参数到CFLAGS变量中。当在FreeBSD使用系统PCRE库时,需要指定 –with-cc-opt=”-I /usr/local/include”。 如果需要增加select()方法所支持的文件数量,也可以参照如下方式指定: –with-cc-opt=”-D FD_SETSIZE=2048”。

–with-ld-opt=parameters — 设置将会在链接(linking)过程中使用的额外参数。当在FreeBSD使用系统PCRE库时,需要指定 –with-ld-opt=”-L /usr/local/lib”。

以下是参数使用示例(注意不应有换行):

./configure
–sbin-path=/usr/local/nginx/nginx
–conf-path=/usr/local/nginx/nginx.conf
–pid-path=/usr/local/nginx/nginx.pid
–with-http_ssl_module
–with-pcre=../pcre-4.4
–with-zlib=../zlib-1.1.3