虽然之前写过一篇《如何最大限度避免AWS天价账单》,但是这篇文章只做了流量超出提醒,没有提到如何自动关机导致我没注意到邮件而被背刺了。所以这次我打算写一篇关于如何使用Lambda监控Lightsail流量限额并超额自动关机的文章。
以此纪念上个月我被aws背刺的30刀。
利用Amazon的Lambda函数计算(100W次以内免费),配合Amazon提供的官方Lightsail API,设置定时任务,每10分钟获取当前流量限额和已使用流量,进行对比,如果达到限额的95%,则关闭Lightsail实例:
Lightsail
的 API
接口: get_instance
,获取账号下在当前区域里的所有 Lightsail
实例。Lightsail
实例的类型,获取每个实例每个月的网络流量配额。API
接口:get_instance_metric_data
,获取每个实例已经使用的入站和出站流量总量。95%
,并关闭对应的 Lightsail
实例。EventBridge
以 cron job
的方式定时触发 Lambda
,运行此检查逻辑。1 | import json |
设置内存为512MB,超时时间为3分钟。
1 | { |
时间设置为cron(0/10 * * * ? *)
,每十分钟触发一次。
此时就已经基本完成配置了。
Lambda函数每10分钟执行一次,符合条件就会自动关闭实例。
下一代ORM
。因为本人主要做前端开发,写后端只是顺带,所以一定会有不了解的地方。以下为个人使用过程中遇到的,仅作记录。
比如,我想插入一条user数据,我可以直接使用Prisma.UserCreateInput
,而不需要自己定义一个interface
,这点我觉得非常不错。
1 | async create(data: Prisma.UserCreateInput): Promise<User> { |
除了Prisma.UserCreateInput
,还有Prisma.UserUpdateInput
,Prisma.UserWhereUniqueInput
等等,这些都是prisma自动生成的,非常方便。但是仍然有不完美的地方就是,自动生成的类型无法在swagger中直接使用,
1 | type: () => Prisma.UserUpdateInput }) ({ |
需要自己去implements一下。
1 | export class CreateUserDto implements Prisma.UserCreateInput {} |
我开始的时候使用SQLite进行开发,但是在使用过程中发现prisma的Sqlite支持非常不完善,甚至可以说是部分功能完全不可用,比如说:
createMany
,作为ORM,我个人认为这是最核心这个功能,然而在Sqlite中是不支持的,很久的issue了。prisma团队以性能问题,一直没有解决,这个功能在我看来是非常基础的功能。开发者也明确说明了不需要在乎性能,就是想做开发测试,但是prisma却仍然没有支持,这让我非常不解,最后不得不换到了postgres上。
prisma
的数据模型设计文件并非.ts
,而是自定义的*.prisma
。以我正在开发中的项目为例子,目前只设计了62张表,schema.prisma
(prisma
默认存放表结构的文件)已经800+行。@default(nanoid())
,只支持@default(uuid())
。schema.prisma中定义,
1 | model Answer { |
然后在代码中使用
1 | create(questionId: string, input: AnswerInput) { |
以上,看起来没错,但是, Type ‘string’ is not assignable to type ‘never’ #15946 - @DiogoMarques2003 opened this issue on Oct 24, 2022
希望prisma能够越来越好,但是目前来看,我个人认为prisma还不够成熟,还有很多需要完善的feat。
]]>正如@sapphi-red所说,Vite 4.3比Vite 4.2性能得到了极大提高。
除大概阐述外,我还找了一些具有代表性的PR,来看看Vite 4.3具体是如何做到的。
Vite解析所有收到的URL和路径,以获取目标模块。
在Vite 4.2中,有许多冗余的解析逻辑和不必要的模块搜索。Vite 4.3使解析逻辑更简单、更严格、更准确,以减少计算和fs调用。
Vite 4.2严重依赖resolve包来解析依赖的package.json,当我们查看resolve源码时,可以发现在解析package.json时有很多无用的逻辑。 Vite 4.3 放弃了解析,遵循更简单的解析逻辑:直接检查嵌套父目录中是否存在 package.json。
Vite要调用Nodejs fs API 来查找模块,但IO操作是很消耗资源的。 Vite 4.3缩小了文件搜索范围,并跳过了一些特殊路径的搜索,以尽可能减少fs调用。
例如:
由于#符号不会出现在URL中,并且用户可以控制源文件路径中不包含#符号,因此Vite 4.3不再检查用户源文件中带有#符号的路径,而只在node_modules中搜索。
在 Unix 系统中,Vite 4.2 首先检查根目录内的每个绝对路径,对于大多数路径都没有问题,但如果绝对路径以 root 开头,则很可能失败。为了在 /root/root 不存在时跳过搜索 /root/root/文件路径,Vite 4.3 会在开头判断 /root/root 是否作为目录存在,并预先缓存结果。
当Vite服务器收到@fs/xxx和@vite/xxx时,无需再次解析这些UR L。 Vite 4.3 直接返回之前缓存的结果,而不是重新解析它们。
Vite 4.2 当文件路径为目录时会递归解析模块,这会导致不必要的重复计算。 Vite 4.3将递归分辨率扁平化,针对不同类型的路径应用合适的分辨率。展平后缓存一些 fs 调用也更容易。
Vite 4.3打破了解析node_modules包数据的性能瓶颈。
Vite 4.2 使用绝对文件路径作为包数据缓存键。这还不够,因为 Vite 必须遍历 pkg/foo/bar 和 pkg/foo/baz 中的同一目录。
Vite 4.3 不仅使用绝对路径(/root/node _modules/pkg/foo/bar.js & /root/node_modules/pkg/foo/baz.js),还使用遍历的目录(/root/node_modules/pkg/foo/bar.js) module/pkg/foo & /root/node_modules/pkg) 作为 pkg 缓存的键。
另一种情况是,Vite 4.2 在单个函数内部查找深层导入路径的 package.json,例如 Vite 4.2 解析 a/b/c/d 这样的文件路径时,首先会检查 root a/package.json 是否存在,如果没有,则按照a/b/c/package.json -> a/b/package.json的顺序查找最近的package.json,但事实是查找根package.json和最近的package.json应该处理分开,因为它们在不同的解析上下文中需要。 Vite 4.3 将根 package.json 和最近的 package.json 解析分为两部分,这样它们就不会混合。
Nodejs 中有一个有趣的 realpath Sync 问题,它指出 fs.realpath Sync 比 fs.realpath Sync.native 慢 70 倍。
但由于在 Windows 上的行为不同,Vite 4.2 仅在非 Windows 系统上使用 fs.realpathSync.native。为了解决这个问题,Vite 4.3 在 Windows 上调用 fs.realpath Sync.native 时添加了网络驱动器验证。
作为一种按需服务,Vite 开发服务器不需要所有东西都准备好就可以启动。
Vite 服务器在预捆绑 ts 或 tsx 时需要 tsconfig 数据。
Vite 4.2 在服务器启动之前等待插件钩子配置中的 tsconfig 数据被解析解析。一旦服务器启动而没有准备好 tsconfig 数据,页面请求就可以访问服务器,即使该请求可能需要稍后等待 tsconfig 解析。
Vite 4.3 在服务器启动之前初始化 tsconfig 解析,但服务器不会等待它。解析过程在后台运行。一旦有 ts 相关的请求进来,就必须等待 tsconfig 解析完成。
Vite中有大量的fs调用,其中一些是同步的。这些同步 fs 调用可能会阻塞主线程。 Vite 4.3 将它们更改为异步。此外,异步函数的并行化也更容易。关于异步函数,您应该关心的一件事是,在解析后可能有许多 Promise 对象需要释放。由于更智能的解析策略,释放 fs - Promise 对象的成本要少得多。
考虑两个简单的依赖链C < - B < - A & D < - B < - A,当A被编辑时,HMR会从A传播到C,从A传播到D。这导致A和B在Vite中被更新两次4.2.
Vite 4.3 会缓存这些遍历过的模块,以避免多次探索它们。这可能会对那些具有组件桶导入的文件结构产生重大影响。这对于 git checkout 触发的 HMR 也有好处。
并行化始终是获得更好性能的不错选择。在 Vite 4.3 中,我们并行化了一些核心功能,包括导入分析、提取 deps 的导出、解析模块 url 和运行批量优化器。并行化之后确实有令人印象深刻的改进。
不要错过编程语言优化。 Vite 4.3 中一些有趣的 javascript 优化案例:
Vite 使用 tsconfck(by @dominikg) 来查找和解析 tsconfig 文件。 tsconfck 过去通过 yield 遍历目标目录,生成器的一个缺点是它需要更多的内存空间来存储其 Generator 对象,并且在运行时会有大量的生成器上下文切换。所以@dominikg 自 v2.1.1 以来在核心中用回调替换了yield 。
Vite 4.2 使用开头 With 和结尾 With 来检查热 UR L 中的标题和尾随“/”。我们比较了 str.starts With(‘x’) 和 str[0] === ‘x’ 的执行基准,发现 === 比starts With 快约 20%。同时,ends With 比 === 慢约 60%。
Vite需要很多正则表达式来匹配字符串,其中大多数都是静态的,所以最好只使用它们的单例。 Vite 4.3 提升了正则表达式,以便可以重复使用它们。
Vite 4.2 中存在一些为了更好的 DX 的自定义错误。这些错误可能会导致额外的计算和垃圾收集,从而降低 Vite 的速度。在 Vite 4.3 中,我们必须放弃生成一些热门的自定义错误(例如 package.json NOT _ FOUND 错误)并直接抛出原始错误以获得更好的性能。
AWS
新规,将在2024年收取每个公网ip每月3.5usd左右的费用。这篇文章里没有明确写lightsail,但是lightsail的ip也是公网ip,所以也会受到影响。
下面是我提问后官方人员给出的答复:
是的,公共IPv4地址的收费变更将应用于Lightsail。新的指控将于2024年2月1日生效。
以下是更改的细节:
所有公共IPv4地址,无论是否连接到服务,每个IP每小时将收取0.005美元的费用。在更改生效后的头12个月,每月前750小时的公共IPv4地址使用将是免费的。您拥有并使用Amazon BYOIP带到AWS的IP地址不会被收取费用。
]]>如今的win系统都已经预装了EDGE,但是在部分场景下,比如后端接口使用自定义的SSL证书来调试时,EDGE无法完成请求,所以还是优先选择Chrome。
本来一直都是用的nvm-windows
,看仓库还一直在维护,但是不知道为啥很久没发新包了,所以就换成了n
。
朋友推荐说n
是一个类似的node
版本管理器,可以方便的切换node
版本。
1 | curl -fsSL https://raw.githubusercontent.com/tj/n/master/bin/n | bash -s lts |
Mac下可以使用brew
安装
1 | brew install gh |
最常用的还得是vscode,但是vscode的插件安装和配置是个麻烦事,所以我选择了登录后同步配置,这样以后换机器或者重装系统后,只要登录账号就可以同步配置了。另外,推荐设置为使用管理员身份打开,否则可能会出现奇奇怪怪的权限问题。
idea也是个不错的选择,但是我用的比较少,所以就不做介绍了。
这位更是重量级。
git可以说是开发必备的,但是我一直都是用的github cli
,所以就不做介绍了。
1 | git config --global user.name "your name" |
github官方出品的命令行工具,可以方便的在命令行中操作github,比如创建仓库、创建issue、创建pr等等。有个比较方便的地方就是,可以直接登录github使用,不需要再去配置ssh key了。不过和git的命令有些不同,也有点额外的学习负担。
1 | brew install gh |
1 | gh auth login # 登录github |
作为idm的替代品,虽然个人体验没有idm强,但是胜在免费+跨平台。
]]>就两页,总共8道题的样子,比之前的公司大的笔试题都少。把还能想起来的题目都记一下。
忘了录音,把还能记下来的记一下。
最后,面试官的一句:你的技术比我的还好,不要紧张,好好面。不管是他谦虚还是真的,但这句话真的给了我很大的鼓励。
技术经理就简历上的一些点很愉快的聊了一下,没有聊具体的技术实现。
包括简历上的在校期间获得的奖项,工作中用到的技术栈,还聊了聊公司的未来可能做的项目等等。
等他开会等了40分钟以上。
面完之后,那个第三面的刘总说如果通过了第二天给我打电话确认薪资,第二天,我在boss直聘上询问面试结果,已读不回。
URL
HSTS
列表DNS
解析TCP
三次握手HTTP
请求HTML
生成DOM
树CSS
生成CSSOM
树DOM
树和CSSOM
树结合生成渲染树浏览器在解析URL后会构建请求行: 请求行包括请求方法、请求地址和 HTTP 协议版本。
1 | // 请求方法是GET,路径为根路径,HTTP协议版本为1.1 |
HTTPS
进行连接的域名。如果网站在这个列表里,浏览器会使用 HTTPS
而不是 HTTP
协议,否则,最初的请求会使用HTTP
协议发送HSTS
列表里,也可以要求浏览器使用 HSTS
政策进行访问。浏览器向网站发出第一个 HTTP
请求之后,网站会返回浏览器一个响应,再次请求浏览器时只使用 HTTPS
发送请求。这里的第一个 HTTP
请求,可能会使用户受到 downgrade attack
的威胁,所以现代浏览器都预置了 HSTS
列表。Chrome
当中的缓存, 打开 chrome://net-internals/#dns
)。gethostbyname
库函数(操作系统不同函数也不同)进行查询。gethostbyname
函数在进行DNS解析之前,先检查域名是否在本地 Hosts
gethostbyname
没有这个域名的缓存记录,也没有在 hosts
里找到,它将会向 DNS
服务器发送一条 DNS
查询请求。DNS
服务器是由网络通信栈提供的,通常是本地路由器或者 ISP
的缓存 DNS
服务器。DNS
服务器时,如果 DNS
服务器主机在同一子网内,系统会对 DNS
服务器进行 ARP
查询;如果在不同的子网,系统会按照下面的 ARP
过程对默认网关进行查询Chrome
在同一个域名下要求同时最多只能有 6
个 TCP
连接,超过 6
个的话剩下的请求就得等待。SYN
位的封包发送给服务器端,表明自己要建立连接并设置了初始序列号SYN
包,如果它可以建立连接:SYN
位,表明自己选择了一个初始序列号ISN + 1
) 复制到 ACK
域,并且设置 ACK
位,表明自己接收到了客户端的第一个封包+1
ACK+1
ACK
位N
个 Bytes
的数据之后,将自己的 SEQ
序列号也增加NACK
包,ACK
的值设置为接收到的数据包的最后一个序列号FIN
包FIN
包,并且发送自己的 FIN
包ACK
包来确认接收到了 FIN
HTTP
请求要携带三样东西:请求行、请求头和请求体。Cache-Control
、If-Modified-Since
、If-None-Match
都由可能被放入请求头中作为缓存的标识信息。POST
方法下存在,常见的场景是表单提交。服务端收到请求后经过处理后,返回响应。跟请求部分类似,网络响应具有三个部分:响应行、响应头和响应体。
HTTP/1.1 200 OK
Cookie
信息。Connection
字段, 如果请求头或响应头中包含Connection: Keep-Alive
,表示建立了持久连接,这样TCP连接会一直保持,之后请求统一站点的资源会复用这个连接。否则断开TCP连接, 请求-响应流程结束。完成了网络请求和响应,如果响应头中Content-Type的值是text/html,那么接下来就是浏览器的解析和渲染工作了。
由于Webkit占据了大量的市场份额,所以这里以Webkit为例,介绍浏览器的解析和渲染过程。
DOM
树DOM
元素以及属性为节点的树。DOM
和 HTML
文档几乎是一对一的关系。DOM
树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。HTML5
标准规范中有详细介绍,算法主要包含了两个阶段:标记化(tokenization)和树的构建。也就是就是词法分析和语法分析。HTML
文本,输出为HTML标记,也成为标记生成器。其中运用有限自动状态机来完成。即在当当前状态下,接收一个或多个字符,就会更新到下一个状态。document
对象。标记生成器会把每个标记的信息发送给建树器。建树器接收到相应的标记时,会创建对应的 DOM
对象。先将DOM对象加入 DOM 树中,再将对应标记压入存放开放(与闭合标签意思对应)元素的栈中。<style>
标签中的样式; style
属性的值StyleSheet object
,这个对象包含带有选择器的CSS规则,和对应CSS语法的对象commit
消息,把绘制列表提交给合成线程。GPU
进行加速,生成的位图最后发送给合成线程。"DrawQuad"
,并发送给浏览器进程。viz
组件接收到这个命令,根据这个命令,把页面内容绘制到内存,也就是生成了页面,然后把这部分内存发送给显卡。PC
显示器还是手机屏幕,都有一个固定的刷新频率,一般是 60 HZ
,即 60
帧,也就是一秒更新 60
张图片,一张图片停留的时间约为 16.7 ms
。而每次更新的图片都来自显卡的前缓冲区。而显卡接收到浏览器进程传来的页面后,会合成相应的图像,并将图像保存到后缓冲区,然后系统自动将前缓冲区和后缓冲区对换位置,如此循环更新。CloudFlare Workers
具有强大的可扩展性以及在海外,基于此可以实现更多有趣的事,比如部署各种项目,搭建网盘,以及各种代理。
2023.6.1 实测可用
pixiv
图片资源域名i.pximg.net
i.pximg.net
有盗链保护,所有请求头Referer
若非pixiv
则403
,反代后可以自行修改请求头1 | addEventListener("fetch", event => { |
将i.pximg.net
替换为部署的地址xxx.xxx.workers.dev
即可。
先吐槽一句,我面试的明明是Vue前端开发,结果问的最多的居然是Python相关。
没说几点,但是确实都是是有参考价值的。
]]>此类网站大多假冒知名网站或需要输入敏感信息的网页,比如假冒缴费/银行以诱导输入账号密码/银行卡/密码等关键信息达到盗取钱财的目的。
80%
的概率此网站为假冒网站。此类网站专坑不去官网下载软件的懒人及小白用户。下载的软件中包含恶意程序,可能盗取你的浏览器中保存的账号密码/劫持你的浏览器首页作为其推广站点等盗取隐私的目的。
此类问题大部分是使用百度搜索造成。
官网
标识,而非立即下载
等标识。结合个人认知,对网站的可信度做了简单总结,并非一定准确,仅供参考。
此处挖个坑,本部分计划通过网站实现,写代码中。
为了增加可信度,部分推广者向你展示其他用户的支付记录或者好评的聊天记录的截图。这些不一定是假的,但是都是可以造假的。
而造假的手法,不说PS这种需要一点技术的,也还有虚假支付记录生成器及官方提供的测试app。
尤其是夹杂在微信聊天记录中的你看到收款几千几万的收款截图,不一定是真的。这完全没有技术含量,完全可以再用个小号,自己改名字和头像等资料再转账,别人纯粹是左手倒右手,你倒信以为真了。
这就是偷取隐私的重灾区了,而苹果由于下载应用必须从经过了审核之后才能上架提供给给用户下载安装,流氓软件少了一大堆,但对于可以直接通过安装包安装软件的安卓(小米/OPPO/vivo/华为等),隐私问题简直就是防不胜防。
国内的一般人在生活中应该用到邮件的用户相对较少。
但做到基本的防骗需要做的也很少。
@duck.com
这种典型的匿名邮箱,那基本可以确定这是伪造的内容了)这点可以看b站up主笔吧评测室的总结
防骗很难,再聪明的人也会有糊涂的时候,所以遇事多思考,注意自己的防骗意识很重要。
其实官方已经给出了教程,不过是英文的,我这里结合我个人操作来翻译一下。
公共存储桶是一项允许用户将其 R2 存储桶的内容直接公开到互联网的功能。默认情况下,存储桶永远不会公开访问,并且始终需要明确的用户权限才能启用。
公共存储桶可以通过两种方式设置:
第一个将您的存储桶公开为您控制下的自定义域。
第二个将您的存储桶公开为*.r2.devCloudflare 托管子域。
您可以选择执行一个或两个选项来测试公共存储桶。
通过自定义域访问域允许您使用访问管理、缓存和机器人管理等功能。
要将自定义域连接到您的存储桶:
您的域现已连接。状态从Initializing变为Active需要几分钟时间。刷新以查看状态更新。如果状态未更改,请选择存储桶旁边的…并选择Retry connection。
要查看添加的 DNS 记录,请选择已连接域旁边的…并选择Manage DNS。
1 | 使用自定义域访问 R2 存储桶时有一些限制: |
为您的存储桶启用托管公共访问将使您的存储桶的内容通过r2.dev
子域在 Internet 上可用。要为您的存储桶启用公共访问权限:
注意:即便开启了公共访问,存储桶的默认给出的xxxxx.r2.cloudflarestorage.com
域名仍然是InvalidArgument
,无法访问的。建议通过设置中允许公共访问后生成的xxxx.r2.dev
域名或自定义域名访问。
A 类操作包括ListBuckets、PutBucket、ListObjects、PutObject、CopyObject、CompleteMultipartUpload、CreateMultipartUpload、UploadPart、UploadPartCopy
B 类操作包括HeadBucket、HeadObject和GetObject
免费操作包括DeleteObject、DeleteBucket、DeleteMultipartUpload
]]>AWS
更多的是面向企业级的用户,所以个人用户用起来可能觉得很复杂。但是AWS
其实是提供了很多方法来帮助用户避免天价账单的,只是很多人不知道。我用了一段时间后,发现了一些方法,希望能帮助到大家。
此类账号唯一的好处是绑定的并非自己的信息,所以直接从根本上避免了天价账单。目前8v账号价格在30-50元,不过此行为在任何一家中大型服务商处均是违反 TOS
条例的,官方有权利要求水电账单等真实用户资料进行二次验证/直接封禁账号。
此行为的泛滥也是导致正常用户新注册也逐渐需要二次验证的主要原因。
由于特殊的CPU积分机制,AWS
的实例类型分为两种,一种是T
开头的,一种是M
开头的。T
开头的实例类型是按照CPU积分来收费的,而M
开头的实例类型是按照CPU时钟周期来收费的。所以如果你的应用程序不需要高性能,那么可以选择T
开头的实例类型,这样可以节省很多钱。
当然,我相信看我这篇总结的都是开的T
型实例。这里还有一点需要注意,如果你使用T
型实例,请注意不要长时间跑高占用CPU的应用,否则可能会被额外收取费用(如果我没记错的话是0.05usd/hour)。
不同地区的ec2实例费用/EBS/流量等费用都是不同的,我大致看了一下,美区的更便宜,亚洲的更贵。所以如果你的应用不需要更高的访问速度,如用来测试脚本之类的,可以考虑选择美区。
由于大部分天价账单都是由流量超出导致的,此处专门针对流量再补充一些内容。
常见的监控方法有两种,一种是安装探针程序,一种是使用CloudWatch
。两种方法各有优缺点。
我个人比较推荐使用CloudWatch
,因为它是官方的,而且可以监控到更多的信息,比如过去一段时间的网络流量。
Geographic restrictions
设置允许/禁止访问的地区Lambda+API getaway是比较经典的选择。
关于如何推送消息,因为做毕设的时候下了个pushdeer,所以下面的代码是用pushdeer来发送消息。
其中具体参数请自行更换。
1 | // function: send a notify |
由于目前最大可能导致费用过高的是流量,所以可以在流量超过一定值时,调用Lambda函数来关闭EC2实例,这样就可以避免费用过高。
1 | # function: stop the ec2 instances |
SNSAmazon SNS 是一种高度可用、持久、安全、完全托管的发布/订阅消息服务,使您能够分离微服务、分布式系统和事件驱动的无服务器应用程序。 Amazon SNS 为高吞吐量、基于推送、多对多消息传递提供主题。
CloudFront界面即可配置调用SNS发送通知,相比于Lambda更简单(不用额外写代码)。虽然貌似需额外付少量费用。
也是基于CloudWatch,可以设置当账单超过某个值时,发送通知。
虽然账单警报最低周期也是6个小时,但是如果是自用超出少部分的话,这个警报可能还是有点用处的?
如果有坏人想攻击,上述的方法没能起到作用,还是出了天价账单。
ssh成功登录记录在/var/log/wtmp和/var/log/wtmp.1(两个文件轮换记录),ssh登录失败记录在/var/log/btmpy和/var/log/btmp.1(两个文件轮换记录),都是二进制文件,直接打开显示乱码。
debian 登录成功的用last查看,登录失败用lastb
通过lastb命令查看:sudo lastb -f /var/log/btmp.1
登录日志记录在/var/log/secure
1 | 查看有多少条登录失败记录: |
1 | 查看用密码登陆成功的IP地址及次数 |
1 |
|
1 | 每分钟执行一次 |
vim /etc/ssh/sshd_config
systemctl restart sshd
yum install fail2ban
vim /etc/fail2ban/jail.local
systemctl restart fail2ban
AWS
的都知道,新用户第一年可以每月免费试用750个小时的EC2,老用户就无法使用了。但是今年AWS
悄悄上架了新机型t4g.small
的免费试用,我搜索了一圈,貌似中文圈没有博客提到这个东西,今天我就来总结一波。曾经新用户ec2
免费试用只有15G
流量,不小心用超了就是天价账单。不过由于CF发文吐槽AWS
的流量太贵了,今年AWS
已将EC2的试用流量增加至了100G
,CloudFront
的免费流量也增加至1T
,可玩性大大增加。
注意:此为官方发给所有账号的福利,限时享受。经过我的实际测试,仅新用户可以完全免费,如果已经使用过第一年硬盘免费额度的用户,仍然需要每月支付不到1USD
的磁盘费用。
本文虽然早就写好了,但由于特殊原因,开会之后再发布具体教程。
本来只是想看开ec2
还能不能更节约,结果提交工单后,等了足足的一天,客服给了完全对不上的回复,但从回复里得到了额外的信息
1 | I understand that you have inquired about the traffic availability for Amazon EC2 T4g instances on a monthly basis. |
很快啊,我打开官网faq一看,
1 | Q: How can customers get access to the T4g free trial? |
和客服的说法一致,那么白piao流量的机会不就来了吗?
前提是你需要有一个境外版 AWS
账号,登录进入EC2控制台,此url为新加坡的EC2面板,如需其他地区(所有地区均可)请自行在右上角点击切换。
EC2
实例跳转到EC2
>Instances
>Launch an instance
,创建一个新的ec2
实例。
name
可以随便输入Application and OS Images
推荐选择Debian
/Ubuntu
Architecture
架构需要选择 Arm
Instance type
点击输入框,输入 t4g.small
,注意,需要有Free trial available
标签的才是免费的,不然就是收费的Key pair
登录服务器的方式,推荐使用密钥登录,如果账号中已有密钥可以直接选择,否则可以点击Create new key pair
,创建一个新密钥。Firewall (security groups)
不懂的可以直接选择默认的Create security group
,然后将下方的Allow SSH traffic from
,Allow HTTPs traffic from the internet
,Allow HTTP traffic from the internet
三个复选框全部勾选以开启22
,80
,443
三个常用端口。Configure storage
如果你有Free tier eligible customers can get up to 30 GB of EBS General Purpose (SSD) or Magnetic storage
的提示且你确定你没有使用过此优惠,可以将8
改为30
,具体细节参考下方省钱小窍门,如老用户不确定是否还有免费资格就不建议修改。EC2
的基本配置已经选完,点击右侧Launch instance
EBS
是本次福利中唯一收费的地方,如果这都免费,AWS
将绝杀。EC2
时的EBS
价格不同。亚洲地区中,HongKong
的是最贵的,最便宜的是美洲的Oregon
和N. Virginal
gp3
比gp2
更便宜。8GB gp3
,那么最贵的和最便宜的差价为0.2USD(0.2*7=1.4CNY)
一个月。t4g.small
+ gp2
+ 8GB
+ HongKong
,每月0USD
gp3 8GB 3000 IOPS
,Oregon
地区,每月花费0.08USD*7*8=4.48CNY
HongKong
最低花费 gp3 8GB 3000 IOPS
,每月花费0.12USD*7*8=6.72CNY
Singapore
最低花费 gp3 8GB 3000 IOPS
,每月花费0.096USD*7*8=5.376CNY
vps
AWS
官方提供的web shell
对中文支持不好,建议使用xshell
或Termius
等工具登录。AWS
对入站流量免费,出站流量计费规则如下,
0.08USD
- 0.12USD
per GB0.09 USD
per GB如果你认为100G
出站流量已经足够,那么本文就此结束。
如果你觉得还想要,那我就给你:)
CloudFront
1 TB
传出数据10,000,000
次 HTTP
或 HTTPS
请求2,000,000
次 CloudFront
函数调用注意,套用CDN
后的网络不一定比原来的网络更快,看运气。
vps
绑定的域名1,以及一个备用域名2,两个域名均解析到此EC2
上CLoudFront
,所以删删改改了几次,此处只记录最终结果,可能存在不能正常使用的情况,请与laiczhang联系纠错。Create distribution
Origin domain
此处输入绑定的域名1name
此处输入域名2Protocol
HTTP only
HTTPS only
,个人推荐将TLSv1.2
作为与数据源使用的最小SSL
协议,如果选择此项,需要在后面证书部分自行在AWS
再申请证书。也很简单,选择DNS验证,再加个CNAME
记录,返回证书页面再刷新就完事了。这个和其他需要验证域名的服务的操作步骤完全一致,此处就不细说了。Compress objects automatically
为NO
Viewer protocol policy
为 Redirect HTTP to HTTPS
Cache key and origin requests
选择 Legacy cache settings
Price class
可以选择全地域节点Use all edge locations (best performance)
,不过推荐选择仅Use North America, Europe, Asia, Middle East, and Africa
Create distribution
,等待部署Enabled
时,更改完成xxxx.cloudfront.net
形式的域名,如果能正常访问(无503/403等状态码),那么就接入成功了。ec2
,导致IP
发生了变化,无需修改CloudFront
的任何配置,仅在域名解析处将两个域名的A
记录指向新ip
即可。过个一天,打开账单页面,可以看到,
确实没有计算EC2
的费用,仅计算了EBS
的费用。
在账单里已经注明了EBS
的价格为$0.12 per GB-month
,我们只开了8G
,一个月的花费就是0.12*8=0.96
美元。
EC2
实例步骤请尽量和我保持一致,否则可能会出现扣费情况。EC2
独特的CPU积分机制,请不要在EC2
上运行大量计算密集型任务,否则可能会出现扣费情况。AWS
的流量计算规则复杂,请持续注意账单2022/12/31
之前)免费,过期再使用会正常扣费的(大概6
刀一个月),如到时候不用了请及时删除AWS
有拉新奖励,这波我将绝杀。cloudflare
AWS
真有钱。30%
左右,最低可达51%
)aws
的cpu
积分制,不排除cpu
高占用情况下的额外收费不得不吐槽aws
对Basic
计划的客服支持力度,发个工单一天都没人理。
来自TeddySun
的Bench.sh
,该脚本发布于2015
年,是较早的Linux vps
综合测试脚本,经过多年多个版本的迭代,几乎适用于各个 Linux
发行版的网络和 IO
测试。
由于此脚本中CN节点只有两个且其中一个节点是被优化过的,无法得到真实的测试结果,所以以后的测试脚本将此脚本替换为下面的superbench.sh
。
Speedtest
世界多处的数据中心的测试点,网络测试比较全面;IO
测试(顺序写入 1GB
数据)三次,并显示其平均值。1 | wget -qO- bench.sh | bash |
1 | wget -qO- git.io/besttrace | bash |
检测vps回程国内三网路由,支持的线路为:电信CN2 GT
,电信CN2 GIA
,联通 169
,电信 163
,联通 9929
,联通 4837
,移动 CMI
。
1 | curl https://raw.githubusercontent.com/zhucaidan/mtr_trace/main/mtr_trace.sh|bash |
一个 bash
脚本,用于检查您的 vps
的 IP
是否可用于各种 OTT
平台。
即查看vps
是否支持YT
、Netflix
、Hulu
、HBO
、Disney+
、Prime Video
、BBC iPlayer
等流媒体解锁。
1 | # 使用脚本前请确认curl已安装 |
测试vps
的方式还有很多,再放一些脚本。
脚本使用了最新版UnixBench进行测试,由于大多数vps都是没有显卡或者是集显,所以图像性能无需测试,注释了关于graphic的测试项。运行10-30分钟后(根据CPU内核数量,运算时间不等)得出分数,越高越好。
1 | wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh |
方便测试回程Ping
值,支持众多区域和各大运营商。
此脚本效果与ping.pe
类似,但是ping.pe
的回程测试不支持IPv6
,而mPing
支持。
1 | wget https://raw.githubusercontent.com/helloxz/mping/master/mping.sh |
docker
1 | curl -sSL https://get.docker.com/ | sh |
speedtest
1 | docker run -d -p 6688:80 ilemonrain/html5-speedtest:alpine |
1 | -t:启动后显示日志,可用Ctrl+C转入后台运行 |
Linux
服务器一键测试、测速脚本 SuperBench
修复,支持CentOS 8
,以后的【简单测评】系列中会使用此脚本进行测试。
1 | bash <(wget -qO- https://down.vpsaff.net/linux/speedtest/superbench.sh) |
EAX93QDTCL
,先买一个月看看情况。疑似跑路了,还好没续费。
1 | -------------------- A Bench.sh Script By Teddysun ------------------- |
1 | ---------------------------------------------------------------------- |
1 | 正在测试,请稍等... |
1 | ** 测试时间: Fri 02 Sep 2022 07:06:41 AM EDT |
可以看出,面向大陆的线路还不错,面向国际的线路很一般。不过买hk的就不是为了面向国际。
适合建站/作为CDN节点,不合适合科学。
注意:这个是新开商家(域名仅注册2天),购买需谨慎,建议月付,如果建站,记得备份数据。
code
,如果是在main
分支进行创建,则可以直接点击Create codespace on main
,否则需要自行选择Configure and create codespace
vscode desktop
拓展1 | /workspaces/HealthClockW (master) $ curl -sL yabs.sh | bash |
免费的4核8G,在这个各个大厂都开始取消免费云资源的年代,我软可真是一股清流。
]]>2022.9.11已开机。
个人主观感受:网络较好,但性能处于中下水平。
1 | NRT - Tokyo, Japan |
1 | Tokyo Mini KVM vps Pre-order |
来自@Showfom
大佬对此vps的回复
1 | -------------------- A Bench.sh Script By Teddysun ------------------- |
1 | ---------------------------------------------------------------------- |
1 | —————————————————————————————— |
1 | ============[ Multination ]============ |
1 | V.PS 中文社区, [2022/9/12 10:14] |
线路不错,老板说硬盘也是全新的三星企业盘,不过是计算双向流量且只有500G,流量用完直接停机,次月再次开机,~~~仅建议流量用的少或建站的可以考虑~~~性能较差,不建议用于搭建动态站点。
]]>对不熟悉Linux
操作的同学建议使用同步软件,更节约精力及时间。
本文为一边踩坑一边实现,结构较乱,还请自行验证。
git
本地提交最新版至github
及云服务器–回调时pull操作总提示权限问题ftp
需开放其他端口–不安全Syncthing
gh
本地提交最新版至github
,调用webhooks
更新云服务的资源最后使用gh
成功完成同步更新。
1 | [root@VM-0-16-centos ~]# git --version |
1 | [root@VM-0-16-centos ~]# pwd |
hooks
目录内没有post-receive
,需要手动创建并保存,之后在post-receive
增加下面两行,
1 |
|
表明在/root/blog.git
对/www/wwwroot/laiczhang.github.io
执行checkout -f
命令,当我们把博客写好后更新,服务器端可以同步部署。
1 | [root-0-16-centos ~]# chmod +x /root/blog.git/hooks/post-receive |
打开Hexo
博客根目录下的_config.yml
,将deploy
下面修改为:
1 | # Deployment |
本步骤由于我的ssh
配置有问题,一直报错
1 | Permission denied (publickey,gssapi-keyex,gssapi-with-mic). |
点击generating a new ssh key,在本机上生成一个新的ssh key
,并将其添加到项目的deploy key
中。
deploy key
页面位置:https://github.com/<yourname>/<yourrepo>/settings/keys
1 | cd /www/wwwroot/<yourrepo> |
1 | sudo nginx -t #查看nginx配置路径 |
我的nginx
配置如下
1 | server |
将coding.zyha.cn
替换为博客域名,将root /www/wwwroot/laiczhang.github.io/;
此处的路径更改为上方work tree
对应的路径即可。
由于之前部署在oss
上,有DNS
缓存,所以需要等待一段时间或手动修改hosts
指定IP
以预览效果,等待时间可以根据实际情况调整。
如果你的ssh能够正常push
,那云服务器上的文件也将跟随github
仓库一起更新,但是我有问题,所以使用了宝塔提供的webhooks
来解决。
填入下方调用代码:
1 | if test $1 = 'pull' |
1 | GET/POST: |
在更新完成后请求一次此回调接口,响应json
为{"code": 1}
即调用成功。
打开终端手动pull
一次,发现代码冲突,并未成功合并代码。
1 | Please, commit your changes or stash them before you can merge. |
1 | git fetch |
带有 --hard
选项的 git reset
命令会将分支重置为我们刚刚获取的内容。它还将丢弃对跟踪文件的任何本地更改,并且将删除未跟踪的文件。
请谨慎使用,因为任何本地更改都将丢失。此次由于本博客最新版均提交之后github
,所以不考虑手动解决冲突问题,直接覆盖旧代码即可。
1 | if test $1 = 'pull' |