本文记录一些简单的 VPS 的安装过程记录和故障排除经验。

国内机器用 Docker

简而言之就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 给 Docker Service 增加一个目录
mkdir -p /etc/systemd/system/docker.service.d

# 创建文件,并添加内容
vim /etc/systemd/system/docker.service.d/http-proxy.conf

# 内容如下:
[Service]
Environment="HTTP_PROXY=http://you-proxy-domain:3128"
Environment="HTTPS_PROXY=http://you-proxy-domain:3128"

# 如果需要排除一些网址,比如私有本地仓库
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com"

# 重启
systemctl daemon-reload
systemctl restart docker

# 尝试下载
docker pull nginx

外网 HTTPS 连接超时

纯净 nginx,在 nginx.conf 加入 HTTPS 支持,浏览器访问转很久之后报 CONNECTION_RESET 错误。

在服务器中 wget https://domain,报连接超时错误;在服务器中 wget https://127.0.0.1 ,正常下载到页面 HTML。

系防火墙配置不当导致的故障。发现及解决所涉及的一系列终端命令如下:

1
2
3
firewall-cmd --list-all
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

Nginx

按照 DigitalOcean 的教程安装 Nginx。

反向代理

在 /etc/nginx/sites-available 创建 xx.com 的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name *.xx.com xx.com;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://10.x.x.x$request_uri;
}
}

建立软链接,即执行:

1
sudo ln -s /etc/nginx/sites-available/xxx.com /etc/nginx/sites-enabled/

检查一下配置文件是否都是 OK 的:

1
sudo nginx -t

重启 nginx:

1
sudo systemctl restart nginx

反代时无法将 URL 后面的东西正确转发给源站

你可以参考下面这个 config 来看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
location /xxxx/ {
proxy_pass http://ip:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Cache-Control no-cache;
}

WinSCP 以 root 权限进入服务器

按照官方教程调一下 Shell 为 sudo 后的 Shell,结果一点登录、都快成功了,却给我弹回登录信息页。经查是因为 sudo 需要再输密码,但 WinSCP 不会干这件事情而导致的。解决方法是让该用户在 sudo 的时候不需要输密码。

根据教程,在 /etc/sudoers 里面添加一行:

1
username ALL=(ALL) NOPASSWD: NOPASSWD: ALL

公钥登录

修改 /etc/ssh/sshd_config 文件,禁用密码登录:

1
PasswordAuthentication no

重启 SSH 服务:

1
sudo systemctl restart sshd

可自定义回源端口的 CDN

有一些 NAT 小鸡没有 80/443 端口用,因此外网只能通过其它端口访问 HTTP(S) 服务。但这样对于用户来说并不直观,外面套一层 CDN 作反代隐藏一下真实端口是一个好的选择。免费版的 Cloudflare 并不能实现上述需求,因此只能另寻他路。

自定义回源端口

在 DNS Records 页面,按照下图设置即可。

DNS 配置回源端口

ACME.sh

在 Arvancloud 后台 - Settings - API Keys 中可以生成一个 API Key,格式形如「Apikey xxxx-xxxx-xxxx-xxxx」。

在安装好 acme.sh 的服务器上运行:

1
2
export Arvan_Token="Apikey xxxx-xxxx-xxxx-xxxx"
acme.sh --issue --dns dns_arvan -d xxx.jonbgua.com -d *.xxx.jonbgua.com --log --dnssleep 30 --force

即可成功签发证书。安装证书的指令如下:

1
acme.sh --install-cert -d xxx.jonbgua.com -d *.xxx.jonbgua.com --key-file /home/USERNAME/nginx/ssl/xxx.jonbgua.com/xxx.jonbgua.com.key --fullchain-file /home/USERNAME/nginx/ssl/xxx.jonbgua.com/xxx.jonbgua.com.crt --ca-file /home/USERNAME/nginx/ssl/xxx.jonbgua.com/xxx.jonbgua.com.ca.crt --reloadcmd "sudo systemctl restart nginx"

Cloudflare WARP

一启动 WARP 就直接 SSH 不上机器了(内外网 IP 和 Tailscale IP 都不行),只能通过 vCenter 访问到。看到 这篇 博客发现是需要加一些白名单 IP 的原因,有点抽象了。

下面是一些可能有用的链接:

我的最后解法:

1
2
3
wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh w
# 测一下
curl -x socks5h://127.0.0.1:1080 -sL https://cloudflare.com/cdn-cgi/trace | grep warp