我租了个巨便宜的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镜像
首次登录好习惯改密码(为了方便,应该把zsh
、git
、oh-my-zsh
、vim
和tmux
装上。):
1 | # VPS上改密码 |
安装docker:
1 | # 安装docker |
拉影子R镜像,写默认配置启动:
1 | docker pull 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 | ➜ ~ uname -r |
低于4.10的得升内核,可使用 ELRepo 源更新:
1 | sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
确认升级结果:
1 | ➜ ~ rpm -qa | grep kernel |
通过设置默认引导为 grub2 ,来启用5.7.9内核,显示 grub2 菜单中的所有条目,结果类似下面的输出:
1 | ➜ ~ sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \' |
我想用的5.7.9在输出菜单的第二行,而菜单条目索引是从0
开始的,因此我需要选择菜单索引为1
的条目5.7.9作为grub2启动项:
1 | sudo grub2-set-default 1 |
完成重启后检查内核:
1 | ➜ ~ uname -r |
2.2.3 手动部署 - 启动BBR
要启用 BBR,要修改sysctl
配置:
1 | echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf |
检查结果,出现类似的输出即为成功:
1 | ➜ ~ sudo sysctl net.ipv4.tcp_available_congestion_control |
检查模块加载状态:
1 | ➜ ~ lsmod | grep bbr |
清理无用老旧内核(可选):
1 | yum remove $(rpm -qa | grep kernel | grep -v $(uname -r)) |
3 编译Python 3.8(参考)
最近3.8用习惯了,想整个不然不舒服。在VPS上编译很快的,可不是树莓派这种便宜货上的速度 😏。
更新并安装依赖:
1 | sudo yum -y update |
确认gcc已安装(上面清理老旧内核的可能把gcc顺道清理了,得装回来……):
1 | ➜ ~ gcc --version |
下载Python3.8.5:
1 | sudo yum -y install wget |
运行configure文件准备安装环境、make并安装:
1 | ./configure --enable-optimizations |
确认安装结果:
1 | ➜ ~ python3.8 --version |
4 安装Nginx
我装Python3,其中一个原因就是想试一下python -m http.server 8000
这个单进程单线程的简易http服务器。用aria2c去拖大文件,不论split
配多少都是单块下载。因此,要进行segmented文件下载,得要整个简约而不简单的发布。
辣么,Linux下大家自然而然会想到,大红大紫到快过气的Nginx啦~
安装并查看EPLE源:
1 | sudo yum install epel-release |
安装nginx:
1 | sudo yum install nginx |
设置服务:
1 | sudo systemctl enable nginx |
启动/重启服务:
1 | sudo systemctl start nginx |
开防火墙服务并刷新防火墙配置使生效:
1 | sudo firewall-cmd --zone=public --permanent --add-service=http |
查看防火墙服务/端口策略:
1 | sudo firewall-cmd --list-service |
安装netcat进行连接测试:
1 | yum install nmap-ncat |
5 配置Nginx
配置文件在:
1 | vim /etc/nginx/nginx.conf |
一开始八成都会有403错误,因为配置第一行user nginx
指的是使用nginx用户运行nginx服务。那么,我们使用root用户新建的文件夹和文件都不能访问,为了懒省事,干脆改成user root
。
在http
域中,添加连接数限制,每秒并发16个连接:
1 | limit_conn_zone $binary_remote_addr zone=connaddr:10m; |
在server
域中详细定义connaddr
和reqaddr
,每个地址允许16个连接,每个请求允许并发16个连接,这玩意调大调小得自己试:
1 | limit_conn connaddr 16; |
在server
域指定该虚拟主机的根目录:
1 | root /root/webroot; |
添加一个location
块作为静态文件服务,开启auto_index
自动文件索引,需要注意的是,其中的alias
如果换成root
,则访问的路径会变成/root/webroot/downloads/downloads/
,即root
会使url自动加上location
后面的路径。因此,我选用alias
加强可读性:
1 | location /downloads { |
如此,一个简约而不简单的文件下载服务就搭好了,访问http://193.x.x.x/downloads
就可以看到简陋的”index of downloads”了。当然,这个文件服务器还是可以继续升级改造的,网上似乎有美化教程,我懒得弄了,值得一提的就是,可以简单的在上面location
域最后再加两行:
1 | location /downloads { |
然后新建一个/etc/nginx/htpasswd
文件,里面写一行用在线htpasswd生成工具生成的加密用户名密码,重启nginx再次访问http://193.x.x.x/downloads
就会发现弹出输入用户名密码的窗口了。至此,文件服务端的基本功能已经完备。
接下来,就是用aria2c
多线程拖文件了,其最主要的配置(参考)有
:
1 | # 单个任务最大分片数,默认为5,我们可以改成16 |
使用Nginx作为文件服务器的思路为:找到大文件,先下载到vps上(因为vps在外面的速度很快,我这个贱民vps都号称200M带宽),然后使用vps的Nginx作为文件服务器,从里面利用文件分片,并发多连接拖。自己搭文件服务的好处是没有并发连接数、下载超时、重传次数之类的限制,想连多少,想下多久,想断点续传多少次,都随自己。
总结
国家强大了,我们的汇率买美帝的vps,至少三五百一年,而我们的汇率买毛熊的vps,只要一百出头,也许美帝主机确实性能和网络状态要好一些,但比起价钱,毛熊的主机就跟白嫖差不多。
再次祝愿祖国母亲繁荣昌盛!生生不息!Live Long and Prosper!