Hexo+Nginx+Trojan-Go搭建总结(Debian环境)
由于平时在找资料时会经常用到一些科学上网工具,但在使用过程中发现大厂服务较贵,而其他一些个人或者小团体维护的服务虽然价格相对低廉,但没有大厂稳定。当然,还是因为价格为主等其他的原因导致体验没有达到预期的效果,所以这里自己搭建一个廉价梯子。由于之前搭建梯子时使用过SS、VMESS、VLESS等其他协议,且经常发生端口被禁的现象导致网上冲浪体验就没了,所以不沿用之前的方案,又因为这个博客有一个域名,加上想把博客移到个人服务器上等原因,所以这次选择Trojan-Go协议来搭建。
- 科学上网不同协议的比较选择参考
考虑到只有一个域名且已经被用于博客了,而一个域名通常来说只解析到一个网站上。所以使用二级域名给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.com
为xxx.com
的二级域名,添加一个这样的A
记录指向VPS的IP地址即可)。
添加完成后再将Hexo部署到VPS上。若不需要Hexo部署至VPS可以跳过下一节。
Hexo部署推送
Hexo是通过git推送静态网页文件到仓库的,因此,需要在VPS搭建一个git仓库(使用root
用户)。
1 | apt install git # 安装git。 |
这里使用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 | deploy: |
注意缩进会影响Hexo生成静态网页。IP
替换VPS对应的IP地址,这里有两个部署的地址,前面的名称(github
和VPS
)是自己添加的,且可以自己定义。
配置好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 |
|
注意:这里的--work-tree
对应git仓库的工作区目录(这里使用/var/www/blog
作为工作区目录是为了对应之后的Nginx所提供的目录,也可以使用其他目录且需要自行创建),--git-dir
对应git仓库目录,checkout
和-f
用于强制覆盖原有文件。
工作区目录需要根据自己的定义的位置进行创建(这里使用root
用户进行工作区目录的创建)。
1 | cd /var |
编辑好post-update.sample
和创建好工作区目录后再进行如下操作。
1 | su git # 使用git用户进行操作。 |
上述操作原理参考Git - Git 钩子 (git-scm.com)。
配置完成后可以尝试使用hexo d
进行部署,按照提示输入git用户密码后,将静态网页文件推送到VPS的git仓库中。推送成功后在之前的工作区目录(/var/www/blog
)可以找到推送的文件,Hexo双部署到此就实现完成了。如果VPS工作区没有收到对应的推送文件则是前几步有误,需要自己排查。
注意:由于Hexo是增量推送更新,所以每次hexo g -d
如果文件内容都没有改动,Hexo不会触发git钩子进行自动部署。若要触发git钩子进行自动部署,则需要在Hexo部署前将任意内容文件稍微改动一下(随便一篇文章稍微改一下内容)并先hexo clean
再hexo 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
后保存,如下图所示。
1 | vim /etc/nginx/sites-available/default # 修改default文件信息。 |
将default
文件中root
改为自己git工作区目录,server_name
改为自己的域名(此域名需要解析指向VPS的IP地址),如下图所示。
将default
文件最下面的server
段内容去掉注释后把侦听端口号、服务器域名、根目录都修改成相应信息,这里使用的是8080端口避免Nginx默认情况下的80端口被占用,如下图所示。
配置好文件后保存。使用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伪装。
如果防火墙端口规则列表中没有相应的端口规则,则需要手动开启相应的规则,操作如下所示。
1 | ufw allow PORT |
这里的PORT替换需要放开的端口号。检查无误后重启Nginx服务,命令如下。
1 | nginx -s reload |
如果Nginx提示端口被占用的错误,则可以使用netstat -nlp
查看相应的端口占用情况,使用ps -ef | grep name
(name
需要被占用对应端口的应用名称替换)将对应占用端口的进程清除即可开启Nginx服务。现在可以直接使用IP访问网站,如果加载失败则需要在之前几步进行故障排查。
申请获取SSL证书
参考Trojan-Go官方文档,从Let’s Encrypt证书颁发机构中获取证书。根据Let’s Encrypt的建议,推荐使用Certbot ACME 客户端。它可以在不下线您的服务器的前提下自动执行证书颁发和安装。
根据Certbot 说明 |Certbot (eff.org)描述,需要先将系统自带的certbot
版本进行删除,然后安装snap
商店中的certbot
进行使用,具体操作如下(使用root
用户)。
1 | apt update # 更新源列表。 |
这里采用只获取证书不修改Nginx服务配置是因为若certbot修改了Nginx服务配置则会让Nginx服务开启HTTPS协议,Nginx会占用443端口,而Trojan-Go需要伪装HTTPS也要占用443。这样会造成端口冲突,所以certbot不能直接修改Nginx服务配置。在certbot获取证书失败时,需要检查域名解析是否正常工作。至此SSL证书可以成功获取。
Trojan-Go对端搭建
Trojan-Go使用Go
实现的完整Trojan
代理,兼容原版Trojan协议
及配置文件格式。安全、高效、轻巧、易用。参考p4gefau1t/trojan-go和Trojan-Go Docs文档进行相应配置(使用root
用户)。
1 | cd ~ |
解压完成后,官方在./example
目录中提供了相关的配置参考文件和服务启动参考文件,根据提供的参考文件稍作修改即可使用,操作如下。
1 | ln -s /root/trojan-go/trojan-go /usr/bin/trojan-go # 创建软连接,方便运行 |
将相关的配置文件放到对应的位置后,对Trojan-Go配置进行修改,操作如下。
1 | vim /root/trojan-go/config/server.json # 修改Trojan-Go配置文件信息 |
参考配置如下:
1 | { |
注意:这里的remote_port
需要和Nginx配置的8080端口相对应,cert
和key
填写由certbot获取到的两个密钥文件地址,fallback_port
作为当Trojan-Go检测到通信异常时会将数据转发到对应的端口,这里需要和Nginx所配置的8080端口对应。
配置完成后尝试开启trojan-go服务端,查看是否运行正常,操作如下。
1 | trojan-go -config /root/trojan-go/config/server.json |
若出现如下提示且没有[ERROR]
提示,则表示trojan-go服务端工作正常。
然后配置trojan-go的开机启动服务,操作如下。
1 | vim /usr/lib/systemd/system/trojan-go.service |
将启动服务文件中的User
中的nobody改为root,检查配置文件所在地址无误保存即可。
1 | [Unit] |
注册开机启动服务,并检测trojan-go服务运行状态。
1 | systemctl enable trojan-go # 开机启动 |
trojan-go服务端的基本配置就都结束了。
这里使用Qv2ray作为trojan-go客户端,在安装Qv2ray后需要将其添加QvPlugin-Trojan-Go插件才能进行连接。参考使用插件 | Qv2ray文档安装trojan-go插件后,新建连接,需要填写的内容只有主机(填服务器的IP地址或域名)和Password(填设trojan-go服务端设置的密码),点击OK保存。
完成设置后双击新建好的连接,成功即搭建完成。
若仍有其他问题则检查服务端和客户端的相关配置是否一致等其他问题,完成整体搭建。
Qv2ray其他配置参考
Hexo+Nginx+Trojan-Go的整体部署方案仅供参考,本文仅对搭建过程进行相关记录。
Hexo+Nginx+Trojan-Go搭建总结(Debian环境)