我租了个巨便宜的VPS

前几天不能面向搜索编程了,码农一旦没法使用Stack Overflow就萎了。于是调研了一晚上VPS……打算能跑点没啥算力的程序,顺便也将科学技术掌握在自己手中。

仅限技术交流!

1 背景环境

最终在某论坛老帖某乎某浪里发现,有个来自毛熊的VPS,按汇率一年115¥,速度、延迟都能接受,就冲动消费了。经过实测延迟发现,其TTK机房(新西伯利亚,据说针对5%-10%的中国线路友好)和DataLine机房(号称CN2对大多中国线路友好)对我的陕西电信来说,延迟/丢包最优,因此,目前把主机建在TTK机房了。

家里有个刷了Openwrt的树莓派,以前用老科学工具,配置的影子R,搜了搜,准备docker个影子R镜像在VPS上。影子R作为一种生产力工具,不值得在部署环节浪费太多精力,毕竟编译部署也挺麻烦的,docker沙箱又方便又相对安全,很适合我这种懒汉。

这个justhost.ru据说是个老服务商了,主攻低端市场(比如我),虽然延迟和丢包有点多,但是不太影响使用,美中不足的是,网站是纯俄语的 🤦‍♀️ 不翻译完全不知道在说什么……(像我这种语言小天才,看日语拉丁系都能连蒙带猜,但俄语真特么是异星语言……)此外,他们家的售后也挺给力的。

2 部署影子R

VPS选用的最常见的CentOS 7。

2.1 部署docker镜像

首次登录好习惯改密码(为了方便,应该把zshgitoh-my-zshvimtmux装上。):

1
2
3
4
5
6
7
8
# VPS上改密码
passwd
# 电脑上上传秘钥进行ssh免密登录
ssh-copy-id root@193.38.xxx.xxx

sudo yum update && sudo yum -y install zsh git vim tmux
chsh -s $(which zsh)
sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

安装docker:

1
2
3
4
5
6
# 安装docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker

拉影子R镜像,写默认配置启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker pull teddysun/shadowsocks-r
mkdir -p /etc/shadowsocks-r
cat > /etc/shadowsocks-r/config.json <<EOF
{
"server":"0.0.0.0",
"server_ipv6":"::",
"server_port":9000,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"xxxxxxxxxxx",
"timeout":120,
"method":"aes-256-cfb",
"protocol":"origin",
"protocol_param":"",
"obfs":"plain",
"obfs_param":"",
"redirect":"",
"dns_ipv6":false,
"fast_open":true,
"workers":1
}
EOF

docker run -d -p 9000:9000 -p 9000:9000/udp --name ssr9000 --restart=always -v /etc/shadowsocks-r:/etc/shadowsocks-r teddysun/shadowsocks-r

2.2 安装BBR加速

BBR是谷歌开源的一个TCP拥堵问题解决方案。

2.2.1 一键部署

1
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

2.2.2 手动部署(参考) - 升级内核

一键部署真相不明,也可以自己部署,并不麻烦。首先检查自己的系统内核版本:

1
2
➜  ~ uname -r
3.10.0-514.2.2.el7.x86_64

低于4.10的得升内核,可使用 ELRepo 源更新:

1
2
3
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install kernel-ml -y

确认升级结果:

1
2
3
4
5
6
7
8
9
➜  ~ rpm -qa | grep kernel
kernel-ml-5.7.9-1.el7.elrepo.x86_64
kernel-tools-libs-3.10.0-1127.13.1.el7.x86_64
kernel-debug-devel-3.10.0-1127.13.1.el7.x86_64
kernel-3.10.0-1062.el7.x86_64
kernel-tools-3.10.0-1127.13.1.el7.x86_64
kernel-headers-3.10.0-1127.13.1.el7.x86_64
kernel-3.10.0-1127.el7.x86_64
kernel-3.10.0-1127.13.1.el7.x86_64

通过设置默认引导为 grub2 ,来启用5.7.9内核,显示 grub2 菜单中的所有条目,结果类似下面的输出:

1
2
3
4
5
6
➜  ~ sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
CentOS Linux (3.10.0-1127.13.1.el7.x86_64) 7 (Core)
CentOS Linux (5.7.9-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-1cfc3bd119f34aa79df425015ceaaeee) 7 (Core)

我想用的5.7.9在输出菜单的第二行,而菜单条目索引是从0开始的,因此我需要选择菜单索引为1的条目5.7.9作为grub2启动项:

1
2
sudo grub2-set-default 1
reboot

完成重启后检查内核:

1
2
➜  ~ uname -r
5.7.9-1.el7.elrepo.x86_64

2.2.3 手动部署 - 启动BBR

要启用 BBR,要修改sysctl配置:

1
2
3
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

检查结果,出现类似的输出即为成功:

1
2
3
4
➜  ~ sudo sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = reno cubic bbr
➜ ~ sudo sysctl -n net.ipv4.tcp_congestion_control
bbr

检查模块加载状态:

1
2
➜  ~ lsmod | grep bbr
tcp_bbr 20480 15

清理无用老旧内核(可选):

1
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))

3 编译Python 3.8(参考

最近3.8用习惯了,想整个不然不舒服。在VPS上编译很快的,可不是树莓派这种便宜货上的速度 😏。

更新并安装依赖:

1
2
3
sudo yum -y update
sudo yum -y groupinstall "Development Tools"
sudo yum -y install openssl-devel bzip2-devel libffi-devel

确认gcc已安装(上面清理老旧内核的可能把gcc顺道清理了,得装回来……):

1
2
3
4
5
➜  ~ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

下载Python3.8.5:

1
2
3
4
sudo yum -y install wget
wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
tar xvf Python-3.8.5.tgz
cd Python-3.8.5/

运行configure文件准备安装环境、make并安装:

1
2
./configure --enable-optimizations
sudo make altinstall

确认安装结果:

1
2
3
4
➜  ~ python3.8 --version
Python 3.8.5
➜ ~ pip3.8 --version
pip 20.1.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)

4 安装Nginx

我装Python3,其中一个原因就是想试一下python -m http.server 8000这个单进程单线程的简易http服务器。用aria2c去拖大文件,不论split配多少都是单块下载。因此,要进行segmented文件下载,得要整个简约而不简单的发布。

辣么,Linux下大家自然而然会想到,大红大紫到快过气的Nginx啦~

安装并查看EPLE源:

1
2
sudo yum install epel-release
sudo yum repolist

安装nginx:

1
sudo yum install nginx

设置服务:

1
sudo systemctl enable nginx

启动/重启服务:

1
2
sudo systemctl start nginx
sudo systemctl restart nginx

开防火墙服务并刷新防火墙配置使生效:

1
2
sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd --reload

查看防火墙服务/端口策略:

1
2
sudo firewall-cmd --list-service
sudo firewall-cmd --list-ports

安装netcat进行连接测试:

1
2
yum install nmap-ncat
nc -zv 193.x.x.x 80

5 配置Nginx

配置文件在:

1
vim /etc/nginx/nginx.conf

一开始八成都会有403错误,因为配置第一行user nginx指的是使用nginx用户运行nginx服务。那么,我们使用root用户新建的文件夹和文件都不能访问,为了懒省事,干脆改成user root

http域中,添加连接数限制,每秒并发16个连接:

1
2
limit_conn_zone $binary_remote_addr zone=connaddr:10m;
limit_req_zone $binary_remote_addr zone=reqaddr:10m rate=16r/s;

server域中详细定义connaddrreqaddr,每个地址允许16个连接,每个请求允许并发16个连接,这玩意调大调小得自己试:

1
2
limit_conn connaddr 16;
limit_req zone=reqaddr burst=16;

server域指定该虚拟主机的根目录:

1
2
root         /root/webroot;
index index.html;

添加一个location块作为静态文件服务,开启auto_index自动文件索引,需要注意的是,其中的alias如果换成root,则访问的路径会变成/root/webroot/downloads/downloads/,即root会使url自动加上location后面的路径。因此,我选用alias加强可读性:

1
2
3
4
5
6
7
8
9
10
location /downloads {
alias /root/webroot/downloads;
charset utf-8;
limit_conn connaddr 16;
limit_req zone=reqaddr burst=16;
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
}

如此,一个简约而不简单的文件下载服务就搭好了,访问http://193.x.x.x/downloads就可以看到简陋的”index of downloads”了。当然,这个文件服务器还是可以继续升级改造的,网上似乎有美化教程,我懒得弄了,值得一提的就是,可以简单的在上面location域最后再加两行:

1
2
3
4
5
location /downloads {
...
auth_basic "Authorized users only";
auth_basic_user_file /etc/nginx/htpasswd;
}

然后新建一个/etc/nginx/htpasswd文件,里面写一行用在线htpasswd生成工具生成的加密用户名密码,重启nginx再次访问http://193.x.x.x/downloads就会发现弹出输入用户名密码的窗口了。至此,文件服务端的基本功能已经完备。

接下来,就是用aria2c多线程拖文件了,其最主要的配置(参考)有

1
2
3
4
5
6
7
8
# 单个任务最大分片数,默认为5,我们可以改成16
split=16
# 断点续传
continue=true
# 最小文件分片大小,添加任务时可指定,取值范围1M - 1024M,默认为20M
# 假定size=10M,文件为20MB,则使用两个来源下载;文件为15MiB 则使用一个来源下载;
# 这个属性的大小应该按照任务的实际情况即网速进行调整。
min-split-size=10M

使用Nginx作为文件服务器的思路为:找到大文件,先下载到vps上(因为vps在外面的速度很快,我这个贱民vps都号称200M带宽),然后使用vps的Nginx作为文件服务器,从里面利用文件分片,并发多连接拖。自己搭文件服务的好处是没有并发连接数、下载超时、重传次数之类的限制,想连多少,想下多久,想断点续传多少次,都随自己。

总结

国家强大了,我们的汇率买美帝的vps,至少三五百一年,而我们的汇率买毛熊的vps,只要一百出头,也许美帝主机确实性能和网络状态要好一些,但比起价钱,毛熊的主机就跟白嫖差不多。

再次祝愿祖国母亲繁荣昌盛!生生不息!Live Long and Prosper!

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×