前言

前几天部署完 Docsify,然后利用 Github Page 绑定了域名进行访问测试,发现访问体验并不理想,用家里的 WiFi 访问还能忍受,用手机数据访问速度就很慢了。查看 Docsify 文档,发现 Docsify 可以部署在 Nginx 上。同理,部署在 Apache 上也是没有问题的。

本文记录利用 Apache 部署 Docsify,利用 Git 的钩子功能(hooks)实现服务器仓库内容到服务器站点目录的同步。当本地 push 文档项目到服务器时,服务器站点目录会自动同步本地项目,实现文档网站自动更新。

操作环境:
OS:CentOS Linux release 7.7
Apache:2.4.6


本地安装 Docsify

安装 Git 客户端

博主本地客户端为 Win10,下载 Git Windows 客户端安装包进行安装,选项默认即可,路径可以更改到 D 盘。

安装 Node

下载 Node Windows 安装包进行安装,选项默认即可,路径可以更改到 D 盘。
安装完成后,在 D 盘根目录下空白处右键选择Git Bash Here,进入 Git Bash,输入 node -vnpm -v查看 node 和 npm 版本,如下表明安装成功:

配置 Docsify

在 Git Bash 中输入以下指令全局安装 docsify-cli,可以于在本地初始化 Docsify 和预览网站:

npm i docsify-cli -g

接下来在 D 盘根目录新建 DocTest 文件夹,在 DocTest 文件夹下初始化文档项目,项目文件夹名为 docs,可根据实际需要更改:

cd DocTest
docsify init ./docs

进入 docs 文件夹,开启本地 docsify 服务器:

cd docs
docsify serve

在浏览器输入http://localhost:3000可以预览本地文档网站:

目前为止,本地 Docsify 安装完成。

服务器端 Git 配置

配置 Git

安装 Git:

sudo yum install -y git

使用 root 权限添加 git 用户,并设置密码:

sudo useradd git
sudo passwd  git 

为安全起见,禁止 git 用户使用 shell 登录服务器:

sudo vi /etc/passwd

找到 git 所在行,修改为如下配置:

git:x:1000:1000::/home/git:/usr/bin/git-shell

给 git 用户文件夹授权

sudo chown -R git:git  /home/git/

配置仓库

创建空仓库,并给仓库授权:

cd /home/git
git init --bare doctest.git
sudo chown -R git:git doctest.git

接下来为仓库配置钩子,在/doctest.git/hooks路径下新建post-receive自动拉取脚本:

vi /home/git/doctest.git/hooks/post-receive

post-receive填入以下内容,路径/var/www/doctest是要发布的文档站点目录,根据实际需要设置。

#!/bin/sh
unset GIT_DIR
cd /var/www/doctest || exit
git pull origin master

授予脚本可执行权限:

chmod +x /home/git/doctest.git/hooks/post-receive

进入 web 站点根目录,克隆上面创建的仓库,并授权:

cd /var/www
sudo git clone /home/git/doctest.git
sudo chown -R git:git /var/www/doctest

在 Git Bash 中输入以下命令,进入本地 DocTest 文件夹,新建 webdocs 文件夹,把服务器上的空仓库克隆到本地。
提示输入密码时输入 git 用户的密码。

cd d:\DocTest
mkdir webdocs
cd webdocs
git clone ssh://git@x.x.x.x:N/home/git/doctest.git

x.x.x.x 为服务器 IP 地址
N 为 SSH 端口,默认为 22,根据实际情况填写

克隆成功会提示克隆的是空仓库,忽略即可。
接下来,把D:\DocTest\docs下的所有文件复制到D:\DocTest\webdocs\doctest文件夹下,然后 push 到服务器:

cd D:\DocTest\webdocs\doctest
git add .
git commit -m"push test"
git push origin master

如下所示,push 成功,master -> FETCH_HEAD表示项目已同步到站点目录,进入/var/www/doctest文件夹下可以发现本地的文件已经同步到站点目录了。

如果提示 Permission denied,根据以上权限设置,检查与 git 用户相关的文件/文件夹的权限,保证文件/文件夹的所属用户组为 git。

到目前为止,服务器端 Git 就配置完成了。

Apache 站点配置

配置文档站点

/etc/httpd/conf.d/路径下新建虚拟主机文件docs.conf

sudo vi /etc/httpd/conf.d/docs.conf

docs.conf文件中填入以下内容:

<VirtualHost *:80>
   ServerName docs.mtycho.com
   DocumentRoot /var/www/doctest/
</VirtualHost>
<Directory "/var/www/doctest/">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

需要把域名替换成自己的域名
域名 DNS 记录记得指向服务器 IP

重启 Apache:

sudo service httpd restart

此时,可以通过 http://docs.mtycho.com 访问文档网站。

部署 SSL 证书

首先为二级域名申请 SSL 证书,这里不再赘述。
新建文件夹/etc/httpd/doc

sudo mkdir /etc/httpd/doc

将证书文件上传到/etc/httpd/doc目录下。
然后编辑虚拟主机文件docs.conf

sudo vi /etc/httpd/conf.d/docs.conf

docs.conf中增加以下内容:

<VirtualHost *:443>
DocumentRoot "/var/www/doctest"
ServerName docs.mtycho.com:443

ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log

LogLevel warn
SSLEngine on

SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

SSLCertificateFile /etc/httpd/doc/docs.mtycho.com_public.crt
SSLCertificateKeyFile /etc/httpd/doc/docs.mtycho.com.key
SSLCertificateChainFile /etc/httpd/doc/docs.mtycho.com_chain.crt

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

证书文件需要修改为自己的证书所在路径
域名需要修改为自己的域名

保存文件,重启 Apache:

sudo service httpd restart

现在,可以通过 https://docs.mtycho.com 访问文档网站了。

设置 HTTP 重定向到 HTTPS(HSTS)

继续编辑docs.conf,把<VirtualHost *:80>段修改为如下所示:

<VirtualHost *:80>
   ServerName docs.mtycho.com
   DocumentRoot /var/www/doctest/
   Redirect permanent / https://docs.mtycho.com/
</VirtualHost>

保存文件,重启 Apache:

sudo service httpd restart

到这里,Apache 环境下部署 Docsify 已经完成,最后效果如下图所示,由于博主后续对文档网站进行了编辑、设置,所以和 Dcosify 初始界面不太一样。

可通过配置 CDN,进一步提高站点访问速度,平时编写可以在本地预览,核对无误后 push 到服务器,等待 CDN 缓存刷新后即可更新站点内容,但是需要合理设置缓存时间。

Last modification:November 20th, 2020 at 11:39 am