前几天不能面向搜索编程了,码农一旦没法使用Stack Overflow就萎了。于是调研了一晚上VPS……打算能跑点没啥算力的程序,顺便也将科学技术掌握在自己手中。
CAUTION仅限技术交流!
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镜像
首次登录好习惯改密码(为了方便,应该把zsh、git、oh-my-zsh、vim和tmux装上。):
# VPS上改密码passwd# 电脑上上传秘钥进行ssh免密登录ssh-copy-id root@193.38.xxx.xxx
sudo yum update && sudo yum -y install zsh git vim tmuxchsh -s $(which zsh)sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"安装docker:
# 安装dockersudo yum install -y yum-utilssudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce docker-ce-cli containerd.iosudo systemctl enable dockersudo systemctl start docker拉影子R镜像,写默认配置启动:
docker pull teddysun/shadowsocks-rmkdir -p /etc/shadowsocks-rcat > /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-r2.2 安装BBR加速
BBR是谷歌开源的一个TCP拥堵问题解决方案。
2.2.1 一键部署
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh2.2.2 手动部署(参考) - 升级内核
一键部署真相不明,也可以自己部署,并不麻烦。首先检查自己的系统内核版本:
➜ ~ uname -r3.10.0-514.2.2.el7.x86_64低于4.10的得升内核,可使用 ELRepo 源更新:
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgsudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpmsudo yum --enablerepo=elrepo-kernel install kernel-ml -y确认升级结果:
➜ ~ rpm -qa | grep kernelkernel-ml-5.7.9-1.el7.elrepo.x86_64kernel-tools-libs-3.10.0-1127.13.1.el7.x86_64kernel-debug-devel-3.10.0-1127.13.1.el7.x86_64kernel-3.10.0-1062.el7.x86_64kernel-tools-3.10.0-1127.13.1.el7.x86_64kernel-headers-3.10.0-1127.13.1.el7.x86_64kernel-3.10.0-1127.el7.x86_64kernel-3.10.0-1127.13.1.el7.x86_64通过设置默认引导为 grub2 ,来启用5.7.9内核,显示 grub2 菜单中的所有条目,结果类似下面的输出:
➜ ~ 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启动项:
sudo grub2-set-default 1reboot完成重启后检查内核:
➜ ~ uname -r5.7.9-1.el7.elrepo.x86_642.2.3 手动部署 - 启动BBR
要启用 BBR,要修改sysctl配置:
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.confecho 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.confsudo sysctl -p检查结果,出现类似的输出即为成功:
➜ ~ sudo sysctl net.ipv4.tcp_available_congestion_controlnet.ipv4.tcp_available_congestion_control = reno cubic bbr➜ ~ sudo sysctl -n net.ipv4.tcp_congestion_controlbbr检查模块加载状态:
➜ ~ lsmod | grep bbrtcp_bbr 20480 15清理无用老旧内核(可选):
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))3 编译Python 3.8(参考)
最近3.8用习惯了,想整个不然不舒服。在VPS上编译很快的,可不是树莓派这种便宜货上的速度 😏。
更新并安装依赖:
sudo yum -y updatesudo yum -y groupinstall "Development Tools"sudo yum -y install openssl-devel bzip2-devel libffi-devel确认gcc已安装(上面清理老旧内核的可能把gcc顺道清理了,得装回来……):
➜ ~ gcc --versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)Copyright © 2015 Free Software Foundation, Inc.本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;包括没有适销性和某一专用目的下的适用性担保。下载Python3.8.5:
sudo yum -y install wgetwget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgztar xvf Python-3.8.5.tgzcd Python-3.8.5/运行configure文件准备安装环境、make并安装:
./configure --enable-optimizationssudo make altinstall确认安装结果:
➜ ~ python3.8 --versionPython 3.8.5➜ ~ pip3.8 --versionpip 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源:
sudo yum install epel-releasesudo yum repolist安装nginx:
sudo yum install nginx设置服务:
sudo systemctl enable nginx启动/重启服务:
sudo systemctl start nginxsudo systemctl restart nginx开防火墙服务并刷新防火墙配置使生效:
sudo firewall-cmd --zone=public --permanent --add-service=httpsudo firewall-cmd --reload查看防火墙服务/端口策略:
sudo firewall-cmd --list-servicesudo firewall-cmd --list-ports安装netcat进行连接测试:
yum install nmap-ncatnc -zv 193.x.x.x 805 配置Nginx
配置文件在:
vim /etc/nginx/nginx.conf一开始八成都会有403错误,因为配置第一行user nginx指的是使用nginx用户运行nginx服务。那么,我们使用root用户新建的文件夹和文件都不能访问,为了懒省事,干脆改成user root。
在http域中,添加连接数限制,每秒并发16个连接:
limit_conn_zone $binary_remote_addr zone=connaddr:10m; limit_req_zone $binary_remote_addr zone=reqaddr:10m rate=16r/s;在server域中详细定义connaddr和reqaddr,每个地址允许16个连接,每个请求允许并发16个连接,这玩意调大调小得自己试:
limit_conn connaddr 16; limit_req zone=reqaddr burst=16;在server域指定该虚拟主机的根目录:
root /root/webroot; index index.html;添加一个location块作为静态文件服务,开启auto_index自动文件索引,需要注意的是,其中的alias如果换成root,则访问的路径会变成/root/webroot/downloads/downloads/,即root会使url自动加上location后面的路径。因此,我选用alias加强可读性:
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域最后再加两行:
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多线程拖文件了,其最主要的配置(参考)有
:
# 单个任务最大分片数,默认为5,我们可以改成16split=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!