小小狐狸 2019-06-30
由于自己搞了个vps,也搭建了vpn,日常科学上网与看看视频还是没什么压力的。想着也不能白白浪费每个月500G的流量,于是想起自己现在的hexo博客。目前还没有自己的私有域名与服务器,用的还是传统的github.io通用域名。作为it界的一员,既然有条件能变得更好就不应该不去做。于是花一天时间折腾出来的自己的专属博客系统。
下面我会将自己搭建过程中遇到的问题与步骤罗列出来,希望能够帮助有同样需求的你。
首先我的搭建是基于以下条件之上的
这里就不介绍hexo博客本地构建,想了解的推荐阅读Hexo的安装与配置
我们将要解决的主要问题是:
SSH非常强大,在我日常工作中时刻相遇。相信你也是,可能你不曾注意到它而已。日常从服务器拉取与上传代码都是通过SSH进行通信的。虽然将生成的id_rsa.pub公钥交给服务器后就再没怎么接触过它,但并不能否认它的存在。
由于SSH可以帮助我们给服务器构建一个安全与稳定的通信,所以我这里也使用SSH来连接服务器。
在连接服务器之前,你需知道自己服务器的IP地址,相信都能够拿到。
# 以root用户连接服务器 # 将12.12.12.12换成自己服务器IP # 如果你已经有自己的域名且已经进行了解析,则可以直接使用域名代替 ssh [email protected]
相信这一步大部分人都会报下面一段错
ssh: connect to host 12.12.12.12 port 22: Connection refused
这是由于你的ssh默认连接端口22与你的服务器端口不一致导致的。该问题有两种解决方法,其一是改变ssh的默认端口;其二是指定连接端口。第一中不推荐,因为我都坚持能不动默认的的就不出修改默认的。所以我们使用第二中方法,在上面的连接命令行后再加上端口
ssh [email protected] -p 端口
接下来剩下的就是输入密码了,这样我们就连接上服务器了,现在可以在自己的电脑上远程操作服务器了。
如果你客户端上没有ssh公钥,可以根据Hexo的安装与配置来进行配置。
找到公钥,公钥位置:~/.ssh/id_rsa.pub,后续会用到。
连接上服务之后,首先查看是否安装了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用户
回到服务器,对用户进行认证。用户认证使用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配置
如果你使用下面命令就安装成功,那么你是幸运的
yum install nginx
如果一切顺利,请跳过安装这部分,如果提示没有找到nginx,请接下看。
由于我是使用Centos 6,nginx位于第三方的yum源中,而nginx不在Centos 6官方yum中,解决方法安装epel(Extra Packages for Enterprise Linux)
yum install epel-release
然后再查看是否在源列表中,这非常重要,因为它可能不在源列表中。
yum repolist
只有显示了epel,接下来你执行nginx的安装命令才不会失败。
yum install nginx
如果不存在,你执行上述命令nginx还是找不到。如果没有意思到这一点,就是无头绪为什么一直报nginx找不到。如果不在,我们接着走。
打开文件epel.repo,将其中的enable=0改为enable=1
vi /etc/yum.repos.d/epel.repo
然后执行下面命令查看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的_config.xml文件,找到deploy,在之前的设置后面再添加我们的服务器仓库地址
deploy: - type: git repository: xxx # 之前的github仓库地址 branch: master - type: git # repository: [email protected]:/~/blog.git # 默认端口生效使用 # repository: ssh://[email protected]:端口/~/blog.git # 默认端口不生效使用,设置端口 branch: master
现在可以将hexo相关配置中的github.io域名都换成你自己的
最后我们再提交一遍hexo代码
hexo clean hexo g heox d
操作完之后,你会发现git将代码push到之前的github仓库与我们的搭建的服务器仓库。
部署完毕,我们就可以在浏览器中输入域名进行访问。例如:这是我的blog地址欢迎访问。
这就是我折腾了一天搭建的过程,希望对你有所帮助。如有任何问题可以随时@我。
SSH连接服务器
服务器上的 Git
hexo部署
EPEL
EPEL未激活解决方案
Shadowsocks Python版一键安装脚本