Email DataBase
SELECT * FROM "Email DataBase"| timestamp | from | to | content | attachment |
|---|---|---|---|---|
| 1770847313009 | pony@qq.com | issue@wepayto.win | … | NULL |
| 1770850872585 | jackma@qq.com | issue@wepayto.win | … | NULL |
这里会讲解实际运行中的程序所需要的云服务,其余篇章如 Cloudflare, Azure, Google Cloud 等是它们针对这些基础需求提供的解决方案。
在我写完了 WepaytoWin Docs 之后,运行
npm run build会生成如下结构
这里有个 index.html ,在云服务器上安装 Nginx,然后把 dist 目录下的文件放到 /var/www/html/ 中,那它就是一个可以访问的网站。但是这样还远远不够,还需要购买一个 SSL 证书来启用 HTTPS,购买一个域名来让用户访问,配置 Nginx 来让它们正确的工作。这些是前端部分,这个网站还需要为之前提到的 issue@wepayto.win 邮箱制作一个后端处理系统。这个门槛是相当高的,并不是说这个技术特别难(也没有很简单),而是起步就要收你大几百块钱。导致许多穷学生只能望风而逃了。
传统云服务的高门槛确确实实会阻拦许多人构建自己的应用程序。现在的云服务体系将建立一个网站所需要的各种资源分开并进行专门优化以降低成本。以下是主要分类:
用来存储上述中 dist 目录下的文件。云服务商通过合理的分流配置,让这个过程仅相当于在服务器上存储了几十 MB 的文件,许多云服务商免费提供此服务。
存储内容可以是任何东西,包括压缩包,二进制文件。其中有 B 类操作包括读取,A 类操作包括读取之外的大多数操作。A 类操作的成本通常更高。
存储结构化数据,提供 SQL 查询接口。其数据结构通常如下:
Email DataBase
SELECT * FROM "Email DataBase"| timestamp | from | to | content | attachment |
|---|---|---|---|---|
| 1770847313009 | pony@qq.com | issue@wepayto.win | … | NULL |
| 1770850872585 | jackma@qq.com | issue@wepayto.win | … | NULL |
用来处理发向后端的请求,Amazon 里叫 lambda,Google Cloud 里叫 Cloud Run,其他厂商的类似服务一般名字里都有一个 Function。得益于 Serverless 架构的兴起,云函数的成本变得可以比静态网站存储还低。但是云函数能做的事情是多维度的,所以成本的计量一般通过调用次数,CPU 消耗,内存消耗,带宽消耗等指标来计算。在 ai 聊天的实例中,云函数同样可以调用 GPU,费用当然会单独计算。
我们在使用中只需要编写代码,但在实际应用之前,会有一个流程叫 Cloud Build,它会将代码构建为可执行文件(如果需要)然后构建 Docker 镜像再部署到云函数/静态网站上。主流云服务商还提供持续性部署CI/CD, Continuous Integration/Continuous Deployment,允许我们在将本地代码提交到远程仓库时自动触发构建和部署。
主流云服务商可以提供一个免费的公网域名来链接到云函数和静态网站上,这个域名往往有序但是很长,可以在 DNS Zone 里添加已经购买的域名来为这些长域名创建别名。传输对象存储中文件消耗的流量要远超其他服务,这时可以尝试使用 CDN 来降低流量的费用。CDN 通过边缘网络可以使用较短的网络线路来传输文件,云服务厂商也乐意给出更低廉的价格。
在 Amazon 里叫 EC2 在 Aliyun 里叫 ECS,是一项保底的服务用以满足更加庞大和复杂的计算需求,配置往往非常复杂。在大多数的云服务商中,弹性计算实例一般被拆分为
云服务商往往会在弹性实例和云函数的运行环境中加入许多用来验证的元数据用以便利地访问对象存储或者关系型数据库,如果准备编写云函数的话可以先在弹性计算实例上进行测试。许多云服务厂商都对弹性实例提供了慷慨的免费额度。
这个就是典型的传统解决方案。固定的资源配置,清晰的价格计算。比较可惜的是主流的云服务厂商都不再提供 VPS 了。
云服务架构如此复杂,自然也需要相当多的人一起维护,所以就有了 IAM(Identity and Access Management)服务用以管理用户和权限。IAM 的设计原则是最小权限原则,用户只能访问他们需要访问的资源,不能访问其他资源,该用户创建的实例同样无法访问其他资源。云服务商一般会提供一些预设的角色用以快速分配权限,也可以自定义角色来满足特定的需求。
为了保证不同的云服务能够在一台服务器上同时运行,现在最流行的做法就是为每个服务的每一个版本的代码创建一个 Docker 镜像。云服务商往往会提供一些预设的 DockerFile 模板,所以我们只需要填写必要的信息即可完成。一份完整的 DockerFile 可能会包含以下内容
FROM python:3.13WORKDIR /usr/local/app
# 安装依赖COPY requirements.txt ./RUN pip install --no-cache-dir -r requirements.txt
# 复制源代码COPY src ./srcEXPOSE 8080
# 使用一个非 root 用户来运行应用程序RUN useradd appUSER app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]SSH 支持以密码和密钥的形式进行认证。密钥要比密码更安全更方便。因此许多云服务商默认都关闭了密码认证。
ssh-keygen -t rsa -b 4096ssh-keygen -t dsassh-keygen -t ecdsa -b 521ssh-keygen -t ed25519密钥的生成过程会要求用户输入一些信息,确保你认得邮箱和文件名,其他都能随便填。最后会要求输入一个密码作为额外保护,这个是没有必要的,直接回车跳过。
cat $YOUR_KEY_PUB输出的公钥内容可能会很长,但它仍然是只有一行。可以全部复制下来。连接到新的云服务器后直接粘贴在 echo 后面不会有任何问题。
echo $YOUR_KEY_PUB >> ~/.ssh/authorized_keys编辑文件 /etc/ssh/sshd_config 找到以下两行
PasswordAuthentication no # Disable password authenticationPubkeyAuthentication yes # Enable public key authentication最后重启 ssh 服务
sudo systemctl restart ssh # sudo systemctl restart sshd大多数云服务商提供的服务都是先用后付,为了防止你无法完成后付,他们会记录分析你在注册和使用中的数据,如果他们怀疑风险存在,就会封禁你的账户。但也不用过于担心,对于官网可以在中国大陆打开的云服务商来说,只要你诚实一点,是不会遇到什么麻烦的。除了 Oracle Cloud
中国大陆防火长城 GFWGreat Fire Wall处于一个非常尴尬的位置。首先它违反了 WTO 的相关规定阻止了外国企业直接对中国大陆的用户提供服务,所以中国政府自始至终从未在法律层面承认过它的存在。GFW 主要通过以下几种方式来阻止用户访问被封锁的网站。
1.1.1.1 8.8.8.8 这种境外的公共 DNS,但在中国大陆这样做没有意义。常见被污染的域名的比如 steamcommunity.com直接封锁 IP 是一种相当极端的手段,尽管现在的中国政府酷爱一刀切。大多数云服务上的 IP 地址都没有被封锁,包括 Google Cloud 的 ASN15169,事实上如果愿意支付 0.23USD/GB 的费用使用 Google Cloud 高级网络,链接质量是相当可靠的。后续介绍的部分外国云服务商中会受到不同程度的封锁,我会在章节中给出可用的解决方式。
电信移动和联通三个国企在中国处于垄断地位,且腐败程度相当之高。中国的电信服务对于国内外都不开放这同样违反了 WTO 相关规定,牢牢的把握再国企手里,比如你在中国要办理宽带,只能选择电信移动联通,不能选择腾讯、阿里和字节来帮你办理宽带。
三大运营商相互独立,几乎没有任何对等互联。在中国开展的云服务只能选择同时维护三个运营商的访问质量,这要付出更加高昂的成本。
国企的腐败程度不必多说,这种垄断的环境中,价格长期居高不下,尽管工信部做了很多努力大幅降低了中国居民的流量费用,但是出口的中国的流量费用在全球中仍然是独一档的高。阿里云对中国免费的出口流量额度为 20G,但是对于出口到中国外的流量却有 200G 的免费额度。阿里云出口到中国的流量收费为 0.8cny/GB 为所有地区最高。境外云服务商传输数据到中国经过国际骨干网会被GFW审查以导致链接质量降低。
大炼 AI 的时代,云服务厂商为 AI 提供的云服务值的单开一个章节,等待后续补充。