《洞穴探险》这篇文章中,我提到了与机器沟通的快乐,以及最近几年玩服务器的经验。邻近开学,为了省钱也便于逃避翻译进度滞后的现实,我花了两个整天,把原本放在韩国服务器上的业务迁移到了德国服务器上(「善德」再见,尽管女友让我把你的名字改成「德善」,但我知道,天上的星辰表明,您将带领朝鲜走向伟大)。在结束了这堆麻烦事情后,我突然觉得应该再合理拖延一下人生,写一个简单的指南,让大家都能像我一样快乐地玩上服务器。

说是玩服务器,对于没有任何代码经验的人来说,事情也没那么简单(只考虑练手的话,或许淘宝买一个树莓派回家玩玩更好,只是考虑到公开访问、内网穿透等等问题,那可真是麻烦死人,成就感应该不如租一台廉价小鸡并公开服务),因此这份指南的要求和目标都不会太高,尽量在白痴都能操作的情况下,能够让你在远方的机器(或虚拟机器)上搭建出别人也能看到的东西。

需要说明,指南只是一个「指南」,目标是让东西跑起来,而不是「跑得好」。许多地方我会简单粗暴地处理,并不会解释任何原理。如果希望详细理解,或需要任何进阶教学, 请自行检索、多加把玩,也可以考虑上一些专门的服务器运维课程(似乎也没那么实用)。就此打住,作为一份指南,我应该少说废话,早点进入正题,以下是教程的目标和你需要准备好的东西:

  1. 目标:搭建简易的个人博客。教程后期或许会拓展其他方面,但作为新手教学,搭建个人博客(穿过长城,和世界说话)似乎是最常见的需求。
  2. 资金:一年200人民币以上。世界上有非常便宜的甚至几乎不要钱的小鸡,只是考虑到实用性和易用性,你最好稍微花一点钱租用大厂的虚拟机和域名。
  3. 时间:5小时到40小时不等。根据你的计算机水平,你需要花费的时间可多可少,我个人预计新手最快能在三小时左右解决战斗。
  4. 勇气:困难必不可少,却也无关紧要。如果你遇到一些问题,你可以尝试自行检索,或是直接在群内询问有经验的人,只要坚持下去就好。

一、先买东西再上阵

1)服务器

所谓服务器(Server)就是一台电脑,唯一的区别是它上面运作的系统(在大部分情况下)并非Windows或Mac这样的家用系统,也不包括图形界面,因此更简洁高效。此外,在国内,由于家庭带宽不具有固定IP,特定端口甚至不开放,家用电脑哪怕安装了服务器系统也难以正常对外服务,因此购入一台服务器是本教程的基础。

原则上,考虑到服务器与服务对象之间的连接受到空间的影响(一台美国服务器需要经过海底线缆才能把数据传到中国,而郑州服务器不需这么复杂就可以通向北京),中国的用户应该购入本地服务器,以优化访问速度。加之腾讯云、阿里云等国内厂商经常会以超低价格出售学生机,性价比不可谓不高。

然而从多年前开始,中国境内的所有服务器在对外服务时(具体来说就是绑定域名后)都必须向国家申报并审核,流程相当繁琐,且丝毫没有必要。因此,考虑到效率和自由度,我并不推荐购入任何境内的服务器。考虑到价格、支付方式、部署难度等等因素,我也不推荐AWS、GCP或Azure等大厂的云服务。以下是推荐项目:

  • Digital Ocean:如果你比较熟悉外币支付手段(例如有长期使用的Paypal),那我推荐你使用Digital Ocean,学生可以拿到50-100美元的代金券(淘宝似乎可以找人代买),够你用最低配置的服务器一整年。此外也有快捷镜像、一键安装系统与特定服务等等功能,可玩性极强,适合新手入门。
  • BuyVM:支持支付宝,价格适中,国内访问速度一般。推荐月付3.5美元的机型,也可根据需求自行选择其他型号。后续教程均以3.5美元的纽约机型为例示范。购买时操作系统系统(Operating System)选择「Ubuntu 20.04」,其他均不需修改(Service Name 可以设置成自己喜欢的名字)。
BuyVM购买设置
BuyVM购买设置

注册并付款成功后几分钟,你会收到几封来自Fran Tech的邮件,其中有一封(标题为「New Virtual Server Information」)邮件中包含了你的服务器信息。存下这串信息,不要将它交给别人,它是和服务器通信的方式,也表明了你的所有权。如果截至目前都没有出现任何问题,那么恭喜你,已经拥有了一台属于自己的服务器(当然,下个月不续费的话又会飞走,就是这么绝情的机器)。

Main IP: xxx.xxx.xxx.xxx
Username: root
Password: xxxxxxxxxxxx
2)域名

原则上说,有服务器之后就可以让它对外营业了。只是考虑到需要让别人访问,最好还是有个酷炫的网址(准确称呼是「域名」),比如 www.fuckpku.com 就能充分展现站长对鳖精大学的热爱,而我最早的域名 mipa.wang (已经没续费了,不知道有没有被别人买走)就展现了养不起猫和狗,因此不得不把它们放网址里的境遇。

书归正传,如果你有外币支付方式(如 Paypal),那么我推荐你到Namecheap购买域名,偶尔有非常便宜的折扣,如示例图片中的 mynameisred.xyz (域名是一个无聊的小说梗),第一年只要8块不到。如果你希望用支付宝付款,那么你可以考虑到主机壳购买,首年价格稍微贵一些,但两三年匀下来也还好。

在Namecheap选购域名
在Namecheap选购域名
  • 主机壳:购买后进入后台,点击「DNS域名解析管理」,管理刚才的域名并「添加解析记录」,类型选择「A」,主机头填「@」,解析值填服务器的IP。成功后再次添加,此次主机头填「www」,其余不变。
  • Namecheap:购买后进入后台,管理对应域名,选择 Advanced DNS,添加A记录,信息与主机壳一致(www与@两条,均指向服务器IP,TTL自动)。填写完毕后应该能看到两条A记录,可参照下图确认。
主机壳添加解析
主机壳添加解析
Namecheap添加解析
Namecheap添加解析

如果一切顺利,你已经拥有了一台服务器(准确说是虚拟机,也就是在大服务器虚拟出的小服务器,所谓「小鸡」)和一个域名,在下一章节中,我们将与服务器进行连接并且执行一些基本操作,不出意外的话,你很快就会看到一个属于自己并完全由自己控制的博客出现在互联网上。

二、如何与服务器说话

1)SSH/FTP客户端

如前所述,服务器位居远方且大部分情况下不具备图形界面,因此必须通过特定的协议与服务器进行通信,使你能够管理它。更具体一些,我们需要支持SSH与FTP(或SFTP)两种协议的客户端,前者便于传输指令,后者长于传输文件。

SSH客户端有很多种,大部分操作系统原生的终端(Terminal)都支持SSH协议,但并不支持一些高级特性,对新手来说也并不友好。因此,以下教程都以Termius这款软件进行示范,该软件需要付费,如果你愿意折腾,获取 Github 的学生礼包即可免费订阅;如果嫌麻烦,淘宝应该也能买到学生账户;或者如果你不愿意付钱,也可以考虑使用Xshell或Finalshell,功能大同小异,只是操作稍微麻烦一些。

下载并安装好Termius,进入软件,在服务器(Hosts)一栏中添加新服务器(New Host),必填项目只有三个,也就是Fran Tech发来的邮件中的三项:IP地址(Address)、用户名(Username)与密码(Password)。最顶部的Label选项可以按兴趣填写成自己喜欢的名字。其余选项都可以不勾选/填写,大部分情况下保持默认值即可(不使用Mosh协议、端口22、无密钥、无启动脚本、无代理转发)。

在Termius中添加服务器
在Termius中添加服务器
连接成功并和它说上话
连接成功并和它说上话

配置完毕后进行连接,如果看到以上画面即说明连接成功。可以尝试随手输入几个指令(图片中输入的指令分别是「获取时间」「列出根目录下的文件」以及「进入/mnt文件夹」)。如果你想知道更多交互的方式,或是在此后配置的过程中了解不同命令的意义,可以在菜鸟教程进行查询。大部分情况下你不需要预先了解所有命令的使用方式,只要掌握一些基本交互,并学会在软件报错时及时Google。

在Cyberduck中进行配置
在Cyberduck中进行配置
服务器根目录一览
服务器根目录一览

与服务器对上眼后,还需要一些方式往服务器上传输文件。Termius 内置了一个 SFTP 管理器,你可以直接使用它,或是下载 Cyberduck,一款可爱并且免费的文件传输器。无论使用什么软件,参考下图进行配置(选择SFTP协议并填写IP、22端口、用户名与密码)后即可完成连接。软件操作逻辑与Windows或Mac的文件管器大同小异,唯一的需要注意的是刚登录上去时一般是在 /root 目录中,需要在地址栏手动切换到根目录(即 / 目录)。

本章节的最后一项内容,在Cyberduck中进入/mnt文件夹,随便拖拽一个文件到其中,上传完成后就能在目录中看到,此时回到Termius。输入 ls /mnt,如果看见服务器返回的文件名与你上传的相同,那么恭喜你,你已经掌握了与服务器说话的基本技巧。

2)安装与配置Docker

对服务器玩家来说,日常生活里最令人头痛的问题就是环境部署。不同的软件需要截然不同的环境,有时候软件版本之间还会出现不兼容的情况,直逼人落泪。好在近年来快速发展的各种容器技术(如Docker或Kubernetes)已在相当程度上解决了这一问题,甚至已经到了新手都可以通过几行代码直接复用他人程序的时代。

在正式安装Docker之前,按照惯例,新机上手后需要更新一下程序。连上服务器后依次输入以下三行命令,第一行表示更新软件源(类似Appstore),第二行表示更新程序,第三行表示安装curlzip两个软件。如果中途询问是否要继续,就根据提示按Y继续。

apt-get update
apt-get upgrade
apt-get install curl zip

程序更新完毕后,如果没有报错(在Termius中一般会以特殊颜色显示),输入以下代码安装Docekr:

curl -fsSL https://get.docker.com | bash -s docker
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

安装完成后,输入docker version查看Docker版本,如果能够正常显示,说明Docker已经安装完成。显然,这个命令行交互的管理方式还是有些抽象,所以我们马上来安装图形化的管理界面:

docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

结束后进入你的浏览器,在地址栏输入http://yourip:9000(自行将yourip替换为你的服务器IP),不出意外的话,你会看到Portianer的管理界面,这也是你服务器提供给互联网的第一个页面。按部就班填写用户名和密码,随后选择Docker并连接(connect),你就完成了基本部署(进一步的了解可参考这篇文章)。

Portainer创建用户页面
Portainer创建用户页面
使用Portainer连接Docker
使用Portainer连接Docker

为了显得我们进度够快,在本章结尾,我们将提供一个彩蛋。如果你此前域名已经配置完毕,那么输入以下命令并等待其部署完毕后,你就可以通过自己的域名访问一个全新的Typecho博客程序(在部署完成后最好及时访问并设置好用户名与密码,防止被其他人使用,其他设置可以不作额外调整保持默认):

docker run -d \
--name=typecho \
--restart always \
--mount type=tmpfs,destination=/tmp \
-v /srv/http/typecho:/data \
-e PHP_TZ=Asia/Shanghai \
-e PHP_MAX_EXECUTION_TIME=600 \
-p 80:80 \
80x86/typecho:latest