个人站架构思路交流

2024-04-22 23:35:45

目的

从业网站后端开发有个7-8年了,加上去年和今年一直在学习运维和前端方面的技能,想记录下一个网站从无到有的过程和一些进阶玩法。 一方面想着从成本出发核算下一个网站的成本,一方面从技术出发探讨交流下个人站长的心得。帮助初学者了解建站大体流程,也和诸位大佬交流,欢迎留言批评。

为什么建站

做网站总要有点动机吧,我主观认为主要是

  1. 兴趣爱好
  2. 门户展示
  3. 赚钱

我的动机是赚钱,现在是移动互联网的时代新站长盈利的很少了加上百度的恶心算法其实靠网站赚钱很难。能赚钱的网站有共同的特性 1.解决了某个问题 2.时间权重很高。我想的也很简单走第一的一条路脑子比较笨试试第二条积累时间权重吧。

一个网站需要什么

我有几个个人站点比如TOL在线工具个人博客VPS主机测评。它们都是偏向页面展示型的应用,不像视频站点需要很大的存储和带宽或者AI站点需要一定的算力,我的成本大致如下。

名称 价格 是否必要
域名 com首购75
服务器 2C2G 99/年
CDN 白嫖
WAF 白嫖
前端&&后端代码 自己写或者下载

如果你是第一次建站的朋友其实建站成本也就是买域名的75块钱+服务器的费用一年100左右就能搞定,综合成本200块。这是最低的成本,当然也有进阶玩法我实际的费用如下。

名称 价格 备注
域名 5个 * 续费65 325年,65续费算上了无忧-20的卷
无忧-上海 1000+280+40+5+10 2032-08-25 共100月 13.35 单月
无忧-广东 850+10+5+10=875 2029-8-27 共64月 13.7单月
198/3年-上海 198 到期抛掉

我是按长期持有计算的,成本没法按年罗列出来给大家做参考。

其中需要说明几点,

  1. 域名一定一定一定要用com,我吃过亏。它的百度收录周期会相对较短,给到的权重比其他结尾的高很多。
  2. 服务器选大厂的,数据会更有保证,线路也更好,我的集群机器全是腾讯轻量云。恰个饭(有AFF)
    腾讯云轻量服务器

轻量云活动

  1. 拿到服务器别直接解析域名到主机,学会隐藏服务器真实地址。

个人站的架构

看个人兴趣或者是需求,个人站可玩空间相当大。2018年我那时候运维方面的知识比较匮乏,加上当时服务器比较贵我选择的是服务源码编译安装一个LNMP环境。2020年开始出了轻量云加上各个服务器厂商新用户都有比价低的价格,我学习了Docker把环境做成了镜像然后年抛用docker-composer进行容器编排。2023年开始因为行业不景气想养几个站作为以后的出路,手上有了4个站以后可能会更多频繁迁移感觉太麻烦了所以想着池化服务器资源上了k3s。

我个人站点的架构演化同步了时代发展,单体架构 -> 集群架构 -> 容器化 -> 容器化编排。因为体量小所以跳过了集群化但是又想感受容器化编排的便利。使用下来最直观的感受如下表。

架构方式
单体架构 学习成本低源码安装一把梭 迁移麻烦,没容错
docker-composer编排 打个tar连同环境一起迁移 迁移还是太麻烦,依旧没容错
k3s编排 1. 安装方便池化资源,申明YAML写好选Node就好 2.能自动迁移有容错 3.服务探针保活一绝 有学习成本

Ingerss

Ingerss选用k3s默认的traefik,它的web页面比较友好有提供很多plugins,甚至自己都可以去基于它提供的GO框架去开发plugins好评。

tol在线工具traefik

监控加上博客杂七杂八的我的集群上有28个Router,Middlewares用的比较简单主要就下面这些。

traefik中间件

ban AU的plugin-blockuseragent,fail2ban拿来主要做流控,然后就是偷懒不想写用户系统用basicauth挡了下后台的管理功能

节点

node
节点有2个RN的国外小鸡,用来看下世界的多彩。上海的125无忧是主节点,国内站一般全丢在了广东无忧125上,集群国内全系列都选用了腾讯的轻量云目前性价比感觉比较合适。同时也上了哪吒的看板方便交流(装逼)

node

有一台VPS是之前198买的,现在拿来做waf出口用后面会专门讲下我怎么抖机灵做安全的。

网络

k3s需要异地组网,这里选择了国外的方案tailscale它安装方便提供了可视化的管理UI。我在每个机器上都安装了tailscale让他们同时内网通信。这样做还有个更为主要的目的,安全!后面也会细说。

部署脚本

为了方便修改和二次使用尽量避免了用k8s命令式的管理方式,全部用了声明式并且提交到了GitHub私有仓库,这样我既可以查看每次修改可以回溯配置又可轻松的更换节点不用重复去敲打命令

配置文件

低配高可用

其实我这样搞一套也算不上高可用,顶多是个双活。正规的商业化是需要做主节点多活的,受制预算简单搞了下。

  1. 使用存活探针启动后60秒,每过90秒去看下对应接口是否可用,不可用就自动重新拉起POD
    livenessProbe:
     httpGet:
       path: /v1/get-all-tool
       port: 8011
       httpHeaders:
         - name: ping
           value: tol-api
     initialDelaySeconds: 60
     periodSeconds: 90
    
    2.调整亲和度,在广州节点优先部署POD如果发生故障自动迁移到国内其它机器上
    affinity:
    nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
     - weight: 90
       preference:
         matchExpressions:
         - key: kubernetes.io/hostname
           operator: In
           values:
           - guangzhou-125
     - weight: 10
       preference:
           matchExpressions:
           - key: haiwai
             operator: In
             values:
             - "false"
    

安全

在我看来网站安全主要防止以下几种攻击手段:

  1. DDOS
  2. CC
  3. 渗透
  4. 端口扫描后的指定服务入侵

CDN

我的防范手段也比较粗暴,主要思路是隐藏常用服务器IP,全部套用CDN。国内大厂CDN既可以提升访问速度又可以隐藏服务器真实IP各个节点也稳定,但是遇见剑皇脚本往往会有点肉痛。小厂服务器价格便宜甚至免费可以防止CC和DDOS但是节点不稳定三天两头挂掉,我的用法是这样的。

名称 场景 备注
百度云 日常使用 严格设置报警和服务中断阈值
小厂云 备用 当百度云触发阈值时切换
CF 备用 当小厂把我当成麻烦时切换

长亭WAF和防火墙

我会拿一台月抛或者年抛机单独安装WAF,这台WAF服务器是我集群的统一出口在我除了这台waf外各个机器上防火墙是关闭了全部对外端口的下图是我腾讯轻量云防火墙的截图。
腾讯云防火墙
没错一个对外端口都没有,集群间的相互通信全走的tailscale打洞过后的内网,自己维护ssh连接也是一样走了内网。

CDN可以杜绝大部分DDOS和CC WAF则是杜绝了HTTP/HTTPS层面的渗透,在反制很多开源软件漏洞后门较多的场景很适用。这里我用的是长亭雷池,长亭是国内比较早的几批做安全的社区版本是免费开源的。技术发烧友可以自己去魔改功能GitHub上有源码传送门,目前我最想改的是它的403页面,别问我为什么懂的都懂系列。

长亭雷池waf

选waf其实有一定的讲究,一是页面清新功能没有二义性,二是词法解析语法解析的算法性能高效,三是规则完整不需要自己去二次录入。
长亭本身就是做安全出生规则库能满足我的要求,在实际使用下来性能也还不错是同款产品中比较得劲的了。

常见防护

我会在没套CDN服务器裸X期间配置访问限制,在访问设置的基础上嵌套上人机验证。

访问限制

Mysql权限

Mysql账号授权是最小权限原则,给予每个项目单独开通了对应账号只能操作当前项目下的库,并且都没有DDL权限。

SELECT
    user AS '用户名',
    host AS '主机',
    db AS '数据库',
    Select_priv AS '选择权限',
    Insert_priv AS '插入权限',
    Update_priv AS '更新权限',
    Delete_priv AS '删除权限',
    Create_priv AS '创建权限',
    Drop_priv AS '删除权限',
    Grant_priv AS '授权权限',
    References_priv AS '引用权限',
    Index_priv AS '索引权限',
    Alter_priv AS '修改权限',
    Create_tmp_table_priv AS '创建临时表权限',
    Lock_tables_priv AS '锁定表权限',
    Create_view_priv AS '创建视图权限',
    Show_view_priv AS '显示视图权限',
    Create_routine_priv AS '创建存储过程权限',
    Alter_routine_priv AS '修改存储过程权限',
    Execute_priv AS '执行权限',
    Event_priv AS '事件权限',
    Trigger_priv AS '触发器权限'
FROM
    mysql.db;

账号授权只给了内网IP。

这样做的好处是即使我代码有问题不慎丢失了配置文件也不至于被脱裤或者被删数据。

蜜罐

我的waf会裸奔一周左右时间让类似fofa的网络搜索工具收录一段时间,他们拿到的IP其实是我空余不用机器的IP或者是waf的IP。然后装上了微步的HFish微步在安全行业也比较出名,这台服务器暴露了很多弱点,是给有一定黑客技术的朋友练手用的。

同样的这台机器的防火墙我也截图了下来

腾讯轻量云防火墙看板

在蜜罐配置好后我会删掉HFish的固定端口4433,这样可以迷惑另一部分聪明一点的同学。

蜜罐配置

这些开放端口全是蜜罐,虽然22端口的SSH不是但仅能秘钥连接。

如果你想做甚至可以在饵料里面下毒,搞个rm -rf 什么的。
蜜罐看板

定期备份

代码: 在阿里云效Git提交代码部署,代码是实时备份的。
系统: 腾讯轻量云提供了免费的快照,我会定期去备份
腾讯云快照
数据库: nas上面写了个脚本每天去备份下数据库
数据库备份

安全总结

一套下来我的应对思路是下表

名称 应对方案
CC 1.CDN限制频率 2.waf限制频率拉黑IP
DDOS 隐藏真实IP
渗透 1.防火墙过滤端口 2.蜜罐迷惑下
指定服务入侵 防火墙过滤端口,服务不对外

还有最好用的方式是: 少一点戾气别和网上的好哥哥们发生争执,要友爱包容理解。从根本上解决问题!(手动狗头)。

看板

上了2个看板,一个是前面提到的服务器看版主要查看服务器状态,另外一个是哪吒能在服务不可用的时候发通知提醒。同样的也是可以交流(装逼使用)

监控

图穷匕现

  1. 买台服务器?
    腾讯云轻量服务器有AFF
  2. 在线工具也很不错
    https://www.tol.vip/