声明

  • 本篇教程介绍的是如何将Hexo部署在自己的VPS上,并顺便配置为Xray伪装站流程,并非科学上网教程或翻墙教程。
  • 本篇教程的Xray搭建模式并非手动搭建,博主使用了Xray脚本,方便一键搭建Nginx网站服务、自动申请并更新域名证书、开启BBR加速等。
  • 本篇教程并非面向小白,需要有少量Linux基础。
  • 本篇教程只适用于国外VPS。

前言

从Vercel向VPS转移的契机

其实一直以来我就有想把Hexo部署在自己的VPS上的想法,只不过之前的Vercel静态部署大陆访问速度差强人意,并且去年为了加快网站的加载,博主开通了阿里云OSS存储桶作为图床使用,部署计划就暂时搁置了下来。

近期Vercel上的网站遭到封锁和DNS污染的情况越来越严重,本站点的正常加载时间已经超过了20秒,这还是在有阿里云OSS做图床的前提下。正巧博主在一个多月前收了一台还不错的VPS,也就是搬瓦工大名鼎鼎的”THE PLAN v2“,当时本来想用这台VPS尝试下截稿为止最强的翻墙协议”REALITY“搭建VLESS-XTLS-uTLS-REALITY节点,但后来几经考虑之下还是转投了专线机场,于是这台VPS就这样被闲置了。

为什么想到配置为Xray伪装站

我在研究如何在VPS上配置Hexo的时候发现,VPS上的操作除了Git相关的安装和配置,其他的安装流程与Xray的安装流程基本重合,例如Nginx网站服务的搭建和配置、网站证书的申请和更新等,甚至还能用上一些在翻墙领域用得较多的加速技术,不仅可以让我们顺利搭建起Hexo部署VPS需要的环境,而且还附赠一个Xray节点用于特殊时期备用,一石二鸟,这才有了这篇教程。


教程环境声明

在教程开始前,按照惯例,先贴上博主的配置环境:

配置环境的名称环境值
VPS服务商搬瓦工
方案THE PLAN v2
机房美国洛杉矶 USCA_6
线路CN2 GIA
Xray核心版本1.8.3
加密协议TLS
传输协议TCP
系统系统信息Ubuntu-20.04-x86_64

VPS端配置

配置SSH密钥登录

如果VPS初始化之后是传统root用户账密登录模式(例如搬瓦工VPS),为了博客安全起见建议关闭密码登录,修改VPS配置为仅允许SSH密钥登录。

  1. 使用账密登录VPS。

  2. 使用以下命令生成一个SSH密钥对。

    1
    ssh-keygen

    全程回车即可,没必要配置额外的密钥密码,生成完毕后会显示生成的公钥和私钥路径。

    1
    2
    Your identification has been saved in /root/.ssh/id_rsa.    //私钥路径
    Your public key has been saved in /root/.ssh/id_rsa.pub. //公钥路径
  3. 把私钥文件下载到本地,保存备用。

    这里一定要注意,私钥文件必须妥善保管,这是之后登录VPS以及Git用户连接VPS的唯一办法。

  4. 将公钥文件导入到同目录下的authorized_keys文件中。

    1
    cat .ssh/id_rsa.pub >> .ssh/authorized_keys
  5. 配置root用户的.ssh文件夹权限,确保可以登录。

    1
    2
    chmod 700 .ssh
    chmod 600 .ssh/authorized_keys
  6. 编辑SSH配置文件。

    1
    vim /etc/ssh/sshd_config

    RSAAuthenticationPubkeyAuthentication两个参数的值都修改为yes,如果被注释了就取消注释,修改为以下状态:

    1
    2
    RSAAuthentication yes 
    PubkeyAuthentication yes

    如果没有这两个参数,就手动添加进配置文件中。

  7. 重启SSH服务

    1
    service sshd restart
  8. 断开VPS连接,尝试使用私钥登录,确认无误之后,编辑SSH配置文件,关闭账密登录,即修改PasswordAuthenticationno

    1
    PasswordAuthentication no

搭建Xray节点

博主选择的Xray脚本是大佬kirin10000开发的Xray-TLS+Web搭建/管理脚本。这个脚本是我自从2021年接触Xray以来最为青睐的脚本,脚本作者的设计思路也是让人眼前一亮,并且这也是我用过的这么多脚本中兼容性最好,最稳定的一个脚本。

需要注意的是,最新版本的脚本使用的是最新的REALITY协议。理论上REALITY协议相较于传统的Xray安全性更高,但可惜的是作者并没有提供自定义静态网站为伪装站的功能,不适用于今天的教程,所以本篇教程还是使用传统的TLS+Web的模式搭建节点。这里博主摘取大佬README-TLS.md脚本的介绍中并贴出来:

脚本特性

  1. 支持 (VLESS/VMess)-(TCP/gRPC/WebSocket)-(XTLS/TLS) + Web 的搭建/管理,支持多种协议并存

  2. 集成 多版本bbr/锐速 安装选项

  3. 支持多种系统 (Ubuntu CentOS Debian deepin fedora …)

  4. 支持多种指令集 (x86 x86_64 arm64 …)

  5. 支持ipv6only服务器 (需自行设置dns64)

  6. 集成删除阿里云盾和腾讯云盾功能 (仅对阿里云和腾讯云服务器有效)

  7. 使用Nginx作为网站服务

  8. 使用Xray作为前置分流器

  9. 使用acme.sh自动申请/更新域名证书

  10. 支持选择搭建个人网盘作为伪装网页

注意事项

  1. 此脚本需要一个解析到服务器的域名 (支持cdn)

  2. 此脚本安装时间较长,见安装时长说明

  3. 此脚本设计为个人VPS用户使用,不适合机场主使用 (此脚本没有多用户管理/流量统计等功能)。

  4. 建议在纯净的系统上使用此脚本 (VPS控制台-重置系统)

安装时长说明

此脚本的安装时间比较长,适合安装一次后长期使用,不适合反复重置系统安装,这会消耗您的大量时间。如果需要更换配置和域名等,在管理界面都有相应的选项。

如果有快速安装的需求,推荐在 Xray-core#Installation 中选择其他脚本

安装时长参考

安装流程:

[升级系统组件]->[安装bbr]->[安装php]->安装Nginx->安装Xray->申请证书->配置文件->[配置伪装网站]

其中[]包裹的部分是可选项。

这是一台单核1G的服务器的平均安装时长,仅供参考:

项目时长
升级已安装软件0-10分钟
升级系统10-20分钟
安装bbr0-3分钟
安装phpCentos8(gcc8.3 4.18内核):20-60分钟
Ubuntu20.10(gcc10.2 5.11-rc3内核):15-20分钟
Debian10(gcc8.3 4.19内核):10-15分钟
安装Nginx13-15分钟
安装Xray<半分钟
申请证书1-2分钟
配置文件<100毫秒
配置伪装网站Nextcloud:1-3分钟
Cloudreve:1-2分钟

为什么脚本安装时间那么长?

之所以时间相比别的脚本长,有三个原因:

1.集成了安装bbr的功能
2.集成更新系统及软件包的功能
3.(主要原因) 脚本的Nginx和php是采用源码编译的形式,其它脚本通常直接获取二进制程序

之所以采用编译的形式,主要考虑的原因为:

1.便于管理
2.便于适配多种系统

编译相比直接安装二进制文件的优点有:

1.运行效率高 (编译时采用了-O3优化)
2.软件版本新 (可以对比本脚本与其他脚本Nginx的版本)

缺点就是编译耗时长

开始安装Xray前,请确保已经把自己博客原来使用的域名解析到了VPS上,以前的Vercel绑定的域名可以新建一条DNS的A记录暂时代替,以防部署时间过长或者部署失败。

  1. 首先安装wgetca-certificates
    Debian基系统(包括Ubuntu、Debian、deepin)安装代码如下:
    1
    apt --no-install-recommends -y install wget ca-certificates || (apt update && apt --no-install-recommends -y install wget ca-certificates)
    Red Hat基系统(包括CentOS、fedora)安装代码如下:
    1
    dnf -y install wget ca-certificates || yum -y install wget ca-certificates
  2. 获取/更新脚本。
    1
    wget -O Xray-TLS+Web-setup.sh https://github.com/kirin10000/Xray-script/raw/main/Xray-TLS+Web-setup.sh
  3. 执行脚本。
    1
    bash Xray-TLS+Web-setup.sh
  4. 根据脚本提示,输入1开始脚本安装。
  5. 根据脚本提示,完成Xray节点搭建,这里说几个需要注意的地方:
    • 系统组件建议选择2,更新已安装软件。
    • 安装bbr版本建议选择1,安装最新稳定版bbr。
    • 如果不使用CDN,选择TCP为传输层协议的话,TCP传输配置建议选择VLESS+TCP+TLS
    • 域名选择建议选择单个域名(不带www),如果按照脚本的推荐选择同时DNS解析两个域名,最终的
    • 最后的伪装站选择一定要选择4,自定义静态页面。 之后我们会把Hexo生成的静态网站文件拷贝到脚本提示的/usr/local/nginx/html/你的博客域名文件夹下,实现利用自己的Hexo博客作为伪装站。

创建用户并配置密钥登录

  1. 创建的用户,用户名自定义,这里博主的用户名设置为“lywyc”,与我GitHub的用户名保持一致,你也可以使用“git”之类的用户名,这里以“git”举例。
    1
    adduser git
    创建第一步需要输入用户密码,这个随便设置就可以了,之后我们会使用私钥登录,就不需要这个密码了。
    后面的配置项一路回车即可。
  2. 赋予用户sudo权限。
    1
    chmod 740 /etc/sudoers  
  3. 编辑sudoers文件
    1
    vim /etc/sudoers
    找到代码root ALL=(ALL:ALL) ALL,在下方加入一条git ALL=(ALL:ALL) ALL,赋予我们的新用户root权限。
    1
    git ALL=(ALL:ALL) ALL
    加好后保存并退出。
  4. 撤回用户sodo权限。
    1
    chmod 440 /etc/sudoers
  5. 在新用户的SSH目录下创建authorized_keys文件,导入本地Git的公钥文件id_rsa.pub
    如果本地还没有公钥文件可以使用Git Bath,同样的ssh-keygen命令生成公私钥文件,文件会存储在C盘用户目录下的.ssh目录中。使用cat ~/.ssh/id_rsa.pub命令可以查看内容,复制内容到VPS自建用户的authorized_keys文件中即可。
    切换到自己创建的用户的目录,这里同样以“git”为例。
    1
    cd /home/git
    创建.ssh目录。
    1
    mkdir .ssh
    进入.ssh目录。
    1
    cd .ssh
    创建并编辑authorized_keys文件。
    1
    vim authorized_keys
    粘贴完公钥文件id_rsa.pub的内容之后,保存并退出。

复制过程中千万不要自作聪明自行更改数据,例如敲一个空格或者提个行啥的,不然等待你的只有无尽的痛苦,别问我为什么知道(づ-̩̩̩-̩̩̩_-̩̩̩-̩̩̩)づ。

安装并配置Git

最后我们就剩下把Hexo生成的静态网站上传到VPS中的特定目录下,要实现这个效果我们需要先在VPS新建一个Git仓库,便于接受我们在本地push上去的public文件夹。

  1. 执行以下命令安装Git。
    1
    apt-get install git
    安装完成后可以使用以下命令查看Git的版本信息。
    1
    git --version
  2. 初始化Git仓库。
    切换到自己创建的用户的目录,这里同样以“git”为例。
    1
    cd /home/git
    创建Git仓库的文件夹,这里博主设置的文件夹为”LYwyc-blog“,与我GitHub上的博客仓库名保持一致,你也可以自定义自己的仓库名,这里以”blog.git“为例。
    1
    mkdir blog.git
    进入仓库目录。
    1
    cd blog.git
    使用--bare参数初始化为裸仓库。
    1
    git init --bare

裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区。并且服务器上的Git仓库通常都以.git结尾。

  1. 确保相关目录的用户组权限为用户名:用户名,这里同样以”git“为例。
    1
    2
    3
    chown -R git.git /home/git/blog.git/  
    chown -R git.git /home/git/.ssh/
    chown -R git.git /usr/local/nginx/html/你在Xray脚本配置的博客域名/

安装并配置Git Hooks

最后一步,我们需要配置Git Hooks,让Git把我们的仓库拷贝到Xray脚本生成的静态网站目录下,VPS端的所有配置就大功告成了。

  1. 创建并切换到hooks目录下,这里同样以"git"用户名和”blog.git“仓库名举例。
    1
    cd /home/git/blog.git/hooks
  2. 创建并编辑post-receive文件。
    1
    vim post-receive 
    复制以下内容到文件中,同样注意替换自定义的用户名和仓库名。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash  
    echo "post-receive hook is running..."

    GIT_REPO=/home/git/blog.git
    TMP_GIT_CLONE=/tmp/blog
    PUBLIC_WWW=/usr/local/nginx/html/你在Xray脚本配置的博客域名

    rm -rf ${TMP_GIT_CLONE}
    git clone $GIT_REPO $TMP_GIT_CLONE
    rm -rf ${PUBLIC_WWW}/*
    cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
  3. 赋予post-receive文件可执行的权限。
    1
    chmod +x post-receive

至此,VPS端的所有配置就完成了,之后只要在本地端稍微配置一下,Hexo就可以成功部署到我们的VPS上了。


本地端配置

VPS端配置好之后,本地端只需要修改几个地方即可。

删除”known_hosts“文件

我们找到之前使用Git Bath生成的公钥和私钥文件目录,如果有看到文件known_hosts,删除该文件,否则等下Git可能连接不上。

SSH密钥登录是基于非对称的密钥技术,当我们使用本地的终端或者Git Bath与VPS首次建立连接时,双方都会记录对方的公钥并存储在.ssh文件夹下的known_hosts文件中。而这种情况下,如果VPS重装了系统或者使用ssh-keygen重新生成了新的公钥,本地与VPS便无法通过密钥的形式建立连接,因为known_hosts文件记录的对方的公钥信息不匹配。

安装并配置hexo-deployer-git

  1. 在终端使用以下命令安装hexo-deployer-git
1
npm install hexo-deployer-git --save
  1. 修改_config.yml文件的配置,同样注意替换自己的用户名和仓库目录,这里以”git“和”blog.git“为例。
    如果SSH的端口为默认端口,也就是22,使用以下配置。
    1
    2
    3
    4
    deploy:
      type: git
      repo: git@[自己VPS的IP]:/~/blog.git
      branch: master
    如果SSH的端口不是22,使用以下配置。
    1
    2
    3
    4
    deploy:
      type: git
      repo: ssh://git@[自己VPS的IP]:[自定义的端口]/~/blog.git
      branch: master
    注意在替换自己的配置时去掉[]
  2. 在终端使用命令部署Hexo,如果一切正常,则大功告成。
    1
    hexo d ; hexo clean
    第一次与VPS建立连接的时候会让我们确认指纹信息,输入yes后回车即可。

至此,所有的配置都已完成了,我们可以修改Vercel上的域名,并在域名的管理后台更换DNS解析,这样我们可以使用VPS上的伪装站作为主站,Vercel上的网站作为备用,以防VPS端口被封。

至于Xray节点的使用,以及Xray相关的具体配置流程,本篇文章暂不提及。