Hexo+Nginx+Trojan-Go搭建总结(Debian环境)

由于平时在找资料时会经常用到一些科学上网工具,但在使用过程中发现大厂服务较贵,而其他一些个人或者小团体维护的服务虽然价格相对低廉,但没有大厂稳定。当然,还是因为价格为主等其他的原因导致体验没有达到预期的效果,所以这里自己搭建一个廉价梯子。由于之前搭建梯子时使用过SS、VMESS、VLESS等其他协议,且经常发生端口被禁的现象导致网上冲浪体验就没了,所以不沿用之前的方案,又因为这个博客有一个域名,加上想把博客移到个人服务器上等原因,所以这次选择Trojan-Go协议来搭建。

  • 科学上网不同协议的比较选择参考

科学上网工具哪个好?一灯不是和尚为您科普VPN/SS/SSR/V2Ray/Xray/Trojan/Trojan-Go和WireGuard的前世今生、区别和关系以及梯子软件的前景 - 一灯不是和尚 (iyideng.vip)

科学上网的主流协议大对比!这里面有你在使用的吗? | TechFen’s Blog (techfens.com)

考虑到只有一个域名且已经被用于博客了,而一个域名通常来说只解析到一个网站上。所以使用二级域名给Trojan-Go进行HTTPS的伪装,又由于想实现Hexo在个人服务器上的部署则需要使用,于是将博客同时部署到GitHub和VPS上实现网站备份的效果和科学上网。

在开始之前需要在原来的域名解析条目中添加一个指向VPS的IP条目,记录值是VPS的IP地址,效果类似如下。

阿里云域名解析控制台

这里使用的是阿里云的域名,其中主机记录为@表示直接解析域名(d-veda.top),如果存在多条记录值相同的记录会产生冲突(如果解析路线不同则可以消除冲突,最好一个域名对应一个地址)。

注意:由于VPS只有IP能访问所以这里添加的是A记录,而原来域名解析指向的是域名(d-veda.github.io),所以用的是CNAME记录。这里用的境外解析路线只是避免冲突(文本所使用的方法),推荐使用二级域名指向VPS的IP地址(例如,主机记录为abc,已有域名为xxx.com,则abc.xxx.comxxx.com的二级域名,添加一个这样的A记录指向VPS的IP地址即可)。

添加完成后再将Hexo部署到VPS上。若不需要Hexo部署至VPS可以跳过下一节。

Hexo部署推送

Hexo是通过git推送静态网页文件到仓库的,因此,需要在VPS搭建一个git仓库(使用root用户)。

1
2
3
4
5
apt install git # 安装git。
adduser git # 添加用户git,专用于git仓库管理。这里会提示添加用户信息和对应的密码。
su git # 使用git用户进行操作。
cd ~
git init --bare blog.git # 创建名称为blog的空仓库。

这里使用git作为新添加的用户名是为了和常用的git代码托管平台统一,用户名可以是其他内容。使用--bare创建空仓库方便将仓库内容和git数据分离。

在创建好git仓库后,可以尝试在本地终端git clone一下VPS的仓库(这里会提示输入相关用户的密码)。

1
git clone git@IP:/home/git/blog.git

这里的IP就是VPS的IP地址,如果VPS中的git仓库所有者不是git则需要将git修改为对应的用户名称。终端若出现如下所示的内容,则表示VPS上的仓库建立成功了。

1
warning: You appear to have cloned an empty repository.

现在需要向本地的Hexo博客配置文件_config.yml中的部署参数添加VPS的git仓库信息,内容如下。

1
2
3
4
5
6
deploy:
type: git
repo:
github: https://github.com/D-Veda/D-Veda.github.io.git
VPS: git@IP:/home/git/blog.git # 新添加的git仓库地址。
branch: master

注意缩进会影响Hexo生成静态网页。IP替换VPS对应的IP地址,这里有两个部署的地址,前面的名称(githubVPS)是自己添加的,且可以自己定义。

配置好Hexo的部署地址后需要将VPS上新建的git仓库配置git hook(git钩子)。这么做是为了实现git仓库的自动部署。若不做git钩子进行自动部署,则在VPS中会找不到推送过来的文件(当然也可以不用git钩子,用自定义的脚本也可以实现对应的自动部署功能)。

配置git hook操作如下(使用git用户,不要用root)。

1
vim ~/blog.git/hooks/post-update.sample # 修改post-update.sample文件中的命令。

post-update.sample文件中将原有的内容修改成如下所示的内容保存。

1
2
3
4
5
6
7
8
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

exec git --work-tree=/var/www/blog --git-dir=/home/git/blog.git checkout -f

注意:这里的--work-tree对应git仓库的工作区目录(这里使用/var/www/blog作为工作区目录是为了对应之后的Nginx所提供的目录,也可以使用其他目录且需要自行创建),--git-dir对应git仓库目录,checkout-f用于强制覆盖原有文件。

工作区目录需要根据自己的定义的位置进行创建(这里使用root用户进行工作区目录的创建)。

1
2
3
4
cd /var
mkdir www && cd ./www # 若有www目录则不用创建,cd进入即可。
mkdir blog
chown -R git:git ./blog # 将blog目录的所有者变为git用户。

编辑好post-update.sample和创建好工作区目录后再进行如下操作。

1
2
3
su git # 使用git用户进行操作。
mv ~/blog.git/hooks/post-update.sample ~/blog.git/hooks/post-update # 重命名,去掉sample后缀。
chmod +x ~/blog.git/hooks/post-update # 给post-update文件添加可执行权限。

上述操作原理参考Git - Git 钩子 (git-scm.com)

配置完成后可以尝试使用hexo d进行部署,按照提示输入git用户密码后,将静态网页文件推送到VPS的git仓库中。推送成功后在之前的工作区目录(/var/www/blog)可以找到推送的文件,Hexo双部署到此就实现完成了。如果VPS工作区没有收到对应的推送文件则是前几步有误,需要自己排查。

注意:由于Hexo是增量推送更新,所以每次hexo g -d如果文件内容都没有改动,Hexo不会触发git钩子进行自动部署。若要触发git钩子进行自动部署,则需要在Hexo部署前将任意内容文件稍微改动一下(随便一篇文章稍微改一下内容)并先hexo cleanhexo g -d进行生成部署。如果上述操作不能触发git钩子,则需要检查VPS中仓库的post-update文件、hooks目录和工作区目录对于git用户来说是否具有相应权限,还有相应文件的配置是否有误。

Nginx搭建部署

在Hexo成功部署到VPS后需要使用HTTP服务将静态网页文件显示出来,这里使用Nginx的HTTP服务,操作(使用root用户)如下。

1
apt install nginx # 安装Nginx。

安装完成后修改Nginx配置文件信息。

1
vim /etc/nginx/nginx.conf # 修改nginx.conf文件配置信息。

nginx.conf文件第一行的用户名改成root后保存,如下图所示。

nginx.conf文件配置信息
1
vim /etc/nginx/sites-available/default # 修改default文件信息。

default文件中root改为自己git工作区目录,server_name改为自己的域名(此域名需要解析指向VPS的IP地址),如下图所示。

default文件配置信息1

default文件最下面的server段内容去掉注释后把侦听端口号、服务器域名、根目录都修改成相应信息,这里使用的是8080端口避免Nginx默认情况下的80端口被占用,如下图所示。

default文件配置信息2

配置好文件后保存。使用nginx -t检测Nginx配置是否有误,以便故障排查。


在Nginx完成HTTP服务配置之前需要确认VPS防火墙中相应的端口是否开启。

1
ufw status # 使用ufw查看防火前端口规则列表。

例如这里使用的是22、80、443、8080端口。22端口用于本地终端与VPS的SSH协议连接,80,8080用于Nginx的HTTP服务端口,443端口用于之后Trojan-Go协议的HTTPS伪装。

ufw status输出信息

如果防火墙端口规则列表中没有相应的端口规则,则需要手动开启相应的规则,操作如下所示。

1
ufw allow PORT

这里的PORT替换需要放开的端口号。检查无误后重启Nginx服务,命令如下。

1
nginx -s reload

如果Nginx提示端口被占用的错误,则可以使用netstat -nlp查看相应的端口占用情况,使用ps -ef | grep namename需要被占用对应端口的应用名称替换)将对应占用端口的进程清除即可开启Nginx服务。现在可以直接使用IP访问网站,如果加载失败则需要在之前几步进行故障排查。

申请获取SSL证书

参考Trojan-Go官方文档,从Let’s Encrypt证书颁发机构中获取证书。根据Let’s Encrypt的建议,推荐使用Certbot ACME 客户端。它可以在不下线您的服务器的前提下自动执行证书颁发和安装。

根据Certbot 说明 |Certbot (eff.org)描述,需要先将系统自带的certbot版本进行删除,然后安装snap商店中的certbot进行使用,具体操作如下(使用root用户)。

1
2
3
4
5
6
7
8
9
apt update # 更新源列表。
apt install snapd # 安装snapd。
snap install core # 获取最新的core snapd。
snap refresh core # 检查snap是否为最新版本。
apt remove certbot # 删除系统自带的certbot。
apt autoremove # 删除多余的依赖程序。
snap install --classic certbot # 使用snap安装certbot。
ln -s /snap/bin/certbot /usr/bin/certbot # 为certbot创建软连接,便于执行。
certbot certonly --nginx # 只获取证书不修改Nginx服务配置

这里采用只获取证书不修改Nginx服务配置是因为若certbot修改了Nginx服务配置则会让Nginx服务开启HTTPS协议,Nginx会占用443端口,而Trojan-Go需要伪装HTTPS也要占用443。这样会造成端口冲突,所以certbot不能直接修改Nginx服务配置。在certbot获取证书失败时,需要检查域名解析是否正常工作。至此SSL证书可以成功获取。

Trojan-Go对端搭建

Trojan-Go使用Go实现的完整Trojan代理,兼容原版Trojan协议及配置文件格式。安全、高效、轻巧、易用。参考p4gefau1t/trojan-goTrojan-Go Docs文档进行相应配置(使用root用户)。

1
2
3
4
cd ~
wget https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-amd64.zip # 下载Trojan-Go可执行文件。
apt install unzip # 安装unzip解压工具。
unzip -d ./trojan-go trojan-go-linux-amd64.zip # 解压官方压缩包。

解压完成后,官方在./example目录中提供了相关的配置参考文件和服务启动参考文件,根据提供的参考文件稍作修改即可使用,操作如下。

1
2
3
4
5
ln -s /root/trojan-go/trojan-go /usr/bin/trojan-go # 创建软连接,方便运行
cd ~/trojan-go
mkdir config
cp ./example/server.json ./config
cp ./example/trojan-go.service /usr/lib/systemd/system/

将相关的配置文件放到对应的位置后,对Trojan-Go配置进行修改,操作如下。

1
vim /root/trojan-go/config/server.json # 修改Trojan-Go配置文件信息

参考配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 8080,
"password": [
"Your password"
],
"ssl": {
"cert": "/path/to/your/fullchain",
"key": "/path/to/your/privkey",
"fallback_port": 8080
}
}

注意:这里的remote_port需要和Nginx配置的8080端口相对应,certkey填写由certbot获取到的两个密钥文件地址,fallback_port作为当Trojan-Go检测到通信异常时会将数据转发到对应的端口,这里需要和Nginx所配置的8080端口对应。

配置完成后尝试开启trojan-go服务端,查看是否运行正常,操作如下。

1
trojan-go -config /root/trojan-go/config/server.json

若出现如下提示且没有[ERROR]提示,则表示trojan-go服务端工作正常。

trojan-go运行提示

然后配置trojan-go的开机启动服务,操作如下。

1
vim /usr/lib/systemd/system/trojan-go.service

将启动服务文件中的User中的nobody改为root,检查配置文件所在地址无误保存即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Trojan-Go - An unidentifiable mechanism that helps you bypass GFW
Documentation=https://p4gefau1t.github.io/trojan-go/
After=network.target nss-lookup.target

[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/bin/trojan-go -config /root/trojan-go/config/server.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

注册开机启动服务,并检测trojan-go服务运行状态。

1
2
3
systemctl enable trojan-go # 开机启动
service trojan-go start # 立即启动服务
systemctl status trojan-go # 检测服务运行状态

trojan-go服务端的基本配置就都结束了。


这里使用Qv2ray作为trojan-go客户端,在安装Qv2ray后需要将其添加QvPlugin-Trojan-Go插件才能进行连接。参考使用插件 | Qv2ray文档安装trojan-go插件后,新建连接,需要填写的内容只有主机(填服务器的IP地址或域名)和Password(填设trojan-go服务端设置的密码),点击OK保存。

新建连接设置

完成设置后双击新建好的连接,成功即搭建完成。

若仍有其他问题则检查服务端和客户端的相关配置是否一致等其他问题,完成整体搭建。

Qv2ray其他配置参考

Qv2ray高级路由设置策略

解决UWP应用在Qv2ray连接时不能上网的问题

高级路由设置规则

v2ray局域网共享方案(Qv2ray类似)


Hexo+Nginx+Trojan-Go的整体部署方案仅供参考,本文仅对搭建过程进行相关记录。

Hexo+Nginx+Trojan-Go搭建总结(Debian环境)

https://d-veda.top/2022/49cb7788a599/

作者

D-Veda

发布于

2022-03-18

更新于

2022-03-19

许可协议

评论