5

由于自己搞了个vps,也搭建了vpn,日常科学上网与看看视频还是没什么压力的。想着也不能白白浪费每个月500G的流量,于是想起自己现在的hexo博客。目前还没有自己的私有域名与服务器,用的还是传统的github.io通用域名。作为it界的一员,既然有条件能变得更好就不应该不去做。于是花一天时间折腾出来的自己的专属博客系统。

下面我会将自己搭建过程中遇到的问题与步骤罗列出来,希望能够帮助有同样需求的你。

前提条件

首先我的搭建是基于以下条件之上的

  1. 本地hexo博客已完成(github.io可以访问)
  2. 有自己的vps
  3. 服务器系统Centos 6 x86_64
  4. 有自己的域名
  5. 域名已进行解析
这里就不介绍hexo博客本地构建,想了解的推荐阅读Hexo的安装与配置

我们将要解决的主要问题是:

  1. SSH连接服务器
  2. 下载git与创建git服务器
  3. 下载nginx与配置nginx环境
  4. 本地hexo与服务器关联

SSH连接服务器

SSH非常强大,在我日常工作中时刻相遇。相信你也是,可能你不曾注意到它而已。日常从服务器拉取与上传代码都是通过SSH进行通信的。虽然将生成的id_rsa.pub公钥交给服务器后就再没怎么接触过它,但并不能否认它的存在。

由于SSH可以帮助我们给服务器构建一个安全与稳定的通信,所以我这里也使用SSH来连接服务器。

在连接服务器之前,你需知道自己服务器的IP地址,相信都能够拿到。

# 以root用户连接服务器
# 将12.12.12.12换成自己服务器IP
# 如果你已经有自己的域名且已经进行了解析,则可以直接使用域名代替
ssh root@12.12.12.12

相信这一步大部分人都会报下面一段错

ssh: connect to host 12.12.12.12 port 22: Connection refused

这是由于你的ssh默认连接端口22与你的服务器端口不一致导致的。该问题有两种解决方法,其一是改变ssh的默认端口;其二是指定连接端口。第一中不推荐,因为我都坚持能不动默认的的就不出修改默认的。所以我们使用第二中方法,在上面的连接命令行后再加上端口

ssh root@12.12.12.12 -p 端口

接下来剩下的就是输入密码了,这样我们就连接上服务器了,现在可以在自己的电脑上远程操作服务器了。

插曲

如果你客户端上没有ssh公钥,可以根据Hexo的安装与配置来进行配置。

找到公钥,公钥位置:~/.ssh/id_rsa.pub,后续会用到。

git服务器

连接上服务之后,首先查看是否安装了git,没有的使用yum进行按照即可

yum install git

裸库

在开始搭建git服务器之前,我们需要将现有的仓库导出为裸仓库。意思就是一个不包含当前工作目录的仓库。主要是使用git的--bare。在操作之前我们先回到客户端,再执行如下命令:

git clone --bare my_project blog.git

my_project如果为远程仓库就使用远程仓库的ssh链接, blog.git可以随便命名但必须以.git结尾。

现在我们已经有了仓库的裸库了,接下来需要将客户端的裸库copy到服务器上,本质也是通过ssh进行通信。

假设你的服务器上已经有/opt/git/目录,可以通过如下命令copy到服务器

scp -r blog.git user@Ip:/opt/git

user为连接用户,例如root。如果又遇到端口问题,替换成下面的命令

scp -P 端口 -r blog.git user@IP:/opt/git
注意大写P

如果通过ssh连接的用户对blog.git拥有可读权限,那么他就可以通过如下命令克隆你的仓库

git clone user@IP:/opt/git/blog.git

当然如拥有可写权限,他也可以进行推送。所以如果后续你发现操作不了仓库时,很大可能是该用户没有读或写权限

为了防止这一点,我们接下来创建git用户

git用户与认证

回到服务器,对用户进行认证。用户认证使用authorized_keys进行,首先,创建一个操作系统用户git,并为它建立.ssh目录。

sudo adduser git
su git
cd
mkdir .ssh && chomd 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

为了防止权限问题,终极解决方法,可以将git添加到sudo用户组

# 切换到root用户
su root
sudo vi /etc/sudoers

打开文件,使用:/root进行搜索,在root下添加git用户

## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
git     ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

回到认证,我们为系统用户git的authorized_keys文件添加操作用户的ssh公钥,就是上面我们客户端生成的公钥。假设你已经将id_rsa.pub保存到临时文件/tmp/id_rsa.pub中。执行如下命令,将公钥加入到authorized_keys文件的末尾

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

设置完之后,返回客户端,执行如下命令,测试是否可以连接上服务器

ssh -v git@IP -p 端口

通过git服务器、用户认证与操作权限,我们就可以实现对仓库的人员添加与仓库分支等的操作权限限制。该功能就也市面上的代码托管平台类似。感兴趣的可以去研究。

现在我们已经完成一大半了,剩下的就是服务器指向域名与代码上传服务器。

Nginx配置

nginx相信或多或少都有一点接触吧,主要是服务端与前端。最近学习了前端,所以自己对nginx也不是那么陌生。我们公司前端主要是用nginx来进行本地代理,方便本地测试。

话不多说,现在进行nginx配置

安装

如果你使用下面命令就安装成功,那么你是幸运的

yum install nginx

如果一切顺利,请跳过安装这部分,如果提示没有找到nginx,请接下看。

由于我是使用Centos 6,nginx位于第三方的yum源中,而nginx不在Centos 6官方yum中,解决方法安装epel(Extra Packages for Enterprise Linux)

yum install epel-release

然后再查看是否在源列表中,这非常重要,因为它可能不在源列表中。

yum repolist

clipboard.png

只有显示了epel,接下来你执行nginx的安装命令才不会失败。

yum install nginx

如果不存在,你执行上述命令nginx还是找不到。如果没有意思到这一点,就是无头绪为什么一直报nginx找不到。如果不在,我们接着走。

打开文件epel.repo,将其中的enable=0改为enable=1

vi /etc/yum.repos.d/epel.repo

clipboard.png

然后执行下面命令查看epel是否存在

yum repolist 2>&1 | grep epel
epel          Extra Packages for Enterprise Linux 6 - x86_64              12,517

如果展示了epel,代表已经存在。这时你再执行安装nginx的命令就可以成功了。

安装完之后,我们再将其启动

service nginx start
# 设置开机启动
chkconfig nginx on

进行到这里,你可以将服务器的ip复制到浏览器,如果你看到nginx的welcome界面,说明nginx已经安装成功。

配置

接下来我们要配置nginx,让其指向我们的blog地址。打开nginx的配置文件

vi /etc/nginx/conf.d/default.conf

安装如下说明替换自己的信息

#
# The default server
#
 
server {
    listen       80;
    # listen       [::]:80 default_server;
    server_name  rousetime.com; # 替换成自己的域名
    root         /usr/share/nginx/html/blog; # 博客所在目录
 
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
 
    location / {
        root /usr/share/nginx/html/blog; # 博客所在目录
        index index.html index.htm;
    }
 
    error_page 404 /404.html;
        location = /40x.html {
        root /usr/share/nginx/html/blog; # 博客所在目录
    }
 
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /usr/share/nginx/html/blog; # 博客所在目录
    }
 
}

/usr/share/nginx/html/blog是我服务器上存放博客的目录,你可以改成自己的目录。这样nginx就配置完成。

本地与服务器同步

现在就剩最后一步了,将本地hexo文件上传到服务器,同时每次通过git更新代码后都会同步到服务器。

之前我们已经建立了git服务器与git裸库,为了之后的上传代码关联操作,我们借助git的服务钩子post-receive。它可以在仓库收到push代码后,进行一些相关操作,例如通知与更新等。

我们在blog.git/hooks中新建post-receive文件 (这里我已将blog.git转移到git用户下/home/git)

su git
vi ~/blog.git/hooks/post-receive

向其中添加如下代码,指明git的工作树路径与仓库路径

#! /bin/sh
git --work-tree=/usr/share/nginx/html/blog --git-dir=/home/git/blog.git checkout -f

保存后退出,再给其赋予可执行权限

chmod +x ~/blog.git/hooks/post-receive

hexo代码同步

返回客户端,打开hexo的_config.xml文件,找到deploy,在之前的设置后面再添加我们的服务器仓库地址

deploy:
- type: git
  repository: xxx # 之前的github仓库地址
  branch: master
- type: git
  # repository: git@rousetime.com:/~/blog.git # 默认端口生效使用
  # repository: ssh://git@rousetime.com:端口/~/blog.git # 默认端口不生效使用,设置端口
  branch: master
现在可以将hexo相关配置中的github.io域名都换成你自己的

最后我们再提交一遍hexo代码

hexo clean
hexo g
heox d

操作完之后,你会发现git将代码push到之前的github仓库与我们的搭建的服务器仓库。

部署完毕,我们就可以在浏览器中输入域名进行访问。例如:这是我的blog地址欢迎访问。

这就是我折腾了一天搭建的过程,希望对你有所帮助。如有任何问题可以随时@我。

资料

SSH连接服务器
服务器上的 Git
hexo部署
EPEL
EPEL未激活解决方案

clipboard.png


午后一小憩
2.9k 声望838 粉丝