多台服务器集群部署方案

经验分享 (805) 2023-09-16 10:57:13

文章目录

序言

框架选型

版本控制

API 编写

目标与现状

正文

第一阶段:刚接手项目

需要解决的问题:

解决方案

不足之处

第二阶段

需要解决的问题:

解决方案

不足之处

第三阶段

服务器

环境搭建

版本控制

代码同步

数据库

后台开发

缓存服务

图片等大文件存储

使用 cdn 为网站加速

使用 supervisor 托管队列

API 开发

建议

后期学习计划


序言

大家看着图个乐就行,这段纯粹个人吐槽,可直接跳过
本人所在的公司,后端就我一个人,前端一名(原本 2 名,后来离职 1 名),设计两名,策划 1 名。17 年进入这家公司,维护公司官网,最初就我一人,18 年下半年逐渐增加到 6 人,队伍也不算小了,本人负责整个后端架构和服务器部署维护。
从 15 年出来工作到现在,陆陆续续也进过很多公司,最初的毛头小子,技术小白,一步一步成长到现在,技术、经验都有了很大的提升(自我感觉,请勿喷),从一开始的 echo "hello world";, 到现在的多语言版本 hello world,只想说一句话,生命不息,代码不止!

最初的时候用的是 tp3.23,干外包,大家都懂,追求效率。干了 2 年外包后,进入了一家本土稍微大一点论坛,主要做一些小专题,小项目和维护论坛,比之前外包难度稍高,还好有个老技术可以带(干外包的时候前期后端技术都跑了,就我一人,天天加班熬夜干活学习,自己一个人闭门造车),了解了很多项目流程,包括写代码需要注意的事项,代码安全、运行效率,redis 队列、应付并发等等。

之后跳槽就进入现在这家公司,主做维护,因为可以学到很多敲代码除外的东西,最初的时候可以跟着领导全国出差,感谢领导,学到了很多很多,为人处世等等。

 

框架选型

刚进来的时候是接手外包做的网站,因为部门战略方向修改,所以整个项目相当于要推倒重来,因为外包用 yii2 做的,我不是很喜欢这个框架,ci 和 tp 又不合适,遂直接用 laravel 开撸,前期真的是碰了很多很多壁,一度想放弃,但是还是坚持了下来。

 

版本控制

最初代码使用 ftp 管理,后来跟换到 svn,再到现在的 git,自己 docker 环境下搭建的 gogs。服务器也从最初的 1 台,到现在多台,也部署了一台负载均衡器,同步代码使用 git 提交触发钩子,然后 rsync+sersync 监听文件变化,自动同步差异化文件,CDN 隐藏服务器真实域名。

 

API 编写

接口最初使用 laravel + dingo API,到现在的 golang 的 gin 重写,爬虫项目也从最初的 php 的 guzzle 包到目前的 python 重写。最终,得到一个结论!就是 想要快速进步,就要靠大量项目喂养

 

目标与现状

  • 目前在的公司较为安逸,主做维护,所以有很多空余时间。荒废时间对于技术人员是最可怕的,我们公司是存在编制的,不犯什么大错误基本可以干一辈子了,担忧技术停滞不前甚至倒退。
  • 公司在三线城市(房价涨幅世界第一,不想吐槽),城市的 IT 技术相较于北上广深差距太大,自己又买不起房,学历只是大专,自考的远程教育本科又没有含金量,只能不断学习逼迫自身,靠技术去一线城市博得一席之地。
  • 学无止境,百度云存储的内容估计这辈子都学不完了,从前端到后端到服务器到人工智能,内容太多了。经过长时间的思考,暂定以后端技术为主,前端不求精通,能做一些兼职即可,服务器方面目前在研究 docker+k8s, 公司服务器 gogs 就是搭建在 docker 环境下的。接下来深入研究 golang,微服务方面。

这周看看能不能写服务器部署的一个分享出来,到时候请各位批评指正!

本文将从三个阶段叙述,包含项目的架构、版本工具的选择、代码部署、到安全

 

正文

 

第一阶段:刚接手项目

外包交付之前,是通过 ftp 的形式上传文件。
交付后到公司战略方向调整后,因为公司业务较多,全国有 20 多个营业点,每个营业点都有一名前端设计,公司后端只有我一人。前端需要制作页面,供外网访问。

 

需要解决的问题:

  1. 项目需要重新设计,选择框架?服务器环境如何搭建?
  2. 代码安全问题,不希望全国的营业点直接访问到项目源码,如何选型?
  3. 全国营业点中有技术较好的前端,如何给与部分网站修改权限?
  4. 网站是站群系统,域名需要泛解析,laravel 自带的路由文档无法提供解决方案
  5. 后台的选型,还有权限等功能的开发

 

解决方案

  1. 因为发现了 learnku 社区(前身 laravel-china.org), 学习了发布的教程,遂选择了 laravel。服务器环境使用宝塔面板,定时备份网站和数据库、设置阿里云自动快照。
  2. 需要严格控制代码权限,所以选择了 svn,创建不同角色,给目录增加对应权限。
  3. 借鉴 blade 模板和织梦的模板标签,开发属于 laravel 的自定义模板标签。
  4. 改写 route 路由,自己摸索泛解析匹配规则,辅以大量正则判断,不断试错。
  5. 后台模板使用 ACE,手撸 RBAC 权限管理,这个实现较为简单,业务逻辑。

 

不足之处

  1. git 比 svn 更好,但受限于技术,无法搭建。等自身实力达到后肯定要换掉。
  2. 对 svn 功能也不是很了解,区域经常上传大文件,导致项目愈发臃肿。
  3. 自写的泛解析站群路由正则太多,文件也较长,不利于后期维护和扩展。
  4. 后台功能较少,筛选、统计等新功能开发效率较低。
  5. 没有应付高并发的方案、也没有应对网络恶意攻击的解决手段。

服务器使用 CentOS,采用 LNMP,直接用宝塔部署,手动安装 svn 版本控制工具,通过钩子自动同步代码,svn 提交后,线上可以直接看到效果,php+svn 就是这么暴力,因为条件受限和技术受限,就没有部署测试环境,所见即所得。

安全方面,laravel 自身意见提供了一部分,包括 csrf防SQL注入端口IP限制,使用阿里云 CDN 隐藏服务器真实 IP 等等,都是一些常见的。

 

第二阶段

新项目的使用和内部项目迭代,还有个人经验、技术的提升,此时产生了以下问题:

 

需要解决的问题:

  1. 不满足于 svn 的局限,需要选型新的工具。
  2. 新项目选型,需要用到队列和定时任务。
  3. 服务器访问较大,需要购买多台服务器部署集群。
  4. 后台开发耗时较多(因为我们后台功能很多),如何解决?

 

解决方案

  1. 在服务器部署 git 私有管理器,实现版本控制,svn 和 git 同时存在。
  2. 学习 laravel 课程二,借鉴大佬代码和阅读文档,实现队列和定时任务。
  3. 购买阿里云服务器,和负载均衡,使用 rsync+sersync 监听文件变化,自动同步差异化文件。
  4. 使用 laravel-admin 扩展包,快速生成后台,加上自定义的接口,可以很轻松实现绝大部分业务功能。

 

不足之处

  1. 因为项目人员骤减,只限于办公室的 6 个人,所以不需要对代码进行权限控制,但总要限制,gitlab 可以实现,可惜技术不足,无法满足需求。
  2. 服务器部署使用的宝塔面板,方便快捷(全部命令行太麻烦,效率也低),想全部容器化部署,使用 k8s,这也是目前能想到的解决方案,受限于技术原因无法实现。下一步学习方向就在此。
  3. 网站后台的 UI,同事不满意,但自建后台,消耗的成本和时间会很大,目前只能这样。

此间碰到过多起安全问题,网站运行受到大量的 CC 攻击,期间最严重的一次,攻击持续了 4 天,超过 CDN 负载,3 天访问次数达 10 亿次以上,QPS 峰值 5W 多,被阿里云 CDN 拉入沙箱,整个业务完全终止外网访问。

当时可以说人在公司呆了 4 天,基本天天熬夜到下半夜,受限于技术,通过 iftop 工具分析流量,只能采取最傻瓜的操作,就是服务器防火墙封锁 IP,后因 IP 太多,直接封锁 IP 段,但因为对方 IP 池太深,以失败告终。

服务器方面,opcache 缓存开启,php 调整进程数,nginx 限流开启,数据库增加连接数,数据库读取增加缓存,存入 redis,但也只是杯水车薪。

通过不断的查阅资料,给服务器安装了 fail2ban,仍然没有解决问题,为此阿里云还专门和我建立了一个钉钉讨论组,他们给的建议就是,花钱上高防服务器,可惜的是因为价格太高,公司领导不允许。不过在不断的分析 IP 来源中,发现了一个规律,就是流量来源 90% 以上都是国外的,因此和阿里云技术沟通,看能否帮忙禁国外用户访问,答案是不能。

后来在其他部门同事的帮助下,我们更换了 CDN 服务提供商,使用百度云 CDN,软磨硬泡,拜托百度云技术帮忙封锁国外 IP,配合 CDN 限流和继续封锁 IP 段,正好在美国的领导通知我国外无法访问网站,流量峰值不断降低至正常状态,此次危机才得以缓解,在次感谢百度云 CDN 工作人员的帮助。

感谢 @MIsakas 提供的思路,可以在解析域名的时候把境外线路解析到虚假 IP 上,具体我还没有试。

 

第三阶段

因为部门方向再次变更,整个服务也需要大概,因为不断阅读社区优秀文章和教程,还有不断的刷 github,愈发发现之前代码写的太垃圾,毅然决定重写项目。

正好服务器到期,公司也要更换阿里云账号,所以从购买服务器开始,到网站部署,版本工具的选择等等,算得上截止 19 年上半年学到的知识都用上了。

首先,服务器安全层面,弃用密码登录,采用 ssh 秘钥,还有对应一系列的 ssh 配置,比如超时自动踢出登录,密码隔断自动修改等等,这些阿里云都会提示,对照着修改就好。

因为公司后端就我一个人,所以我是允许 root 登录的,给端口设置 ip 限制就可以了。

 

服务器

服务器使用阿里云负载均衡 + 云 ecs

 

环境搭建

环境搭建方面,为了省事,我仍然采用的宝塔面板,限制面板登录端口 IP 权限。推荐大家 linux 安装 htop,友好性互动的进程查看器,比 top 命令好用多了。

 

版本控制

代码版本控制,安装 docker,使用 gogs 进行版本控制。因公司业务是所见即所得的,所以不需要测试环境,线下修改直接 push 推送,触发 post-receive 钩子,自动同步线上代码。如果条件允许的话肯定要配置测试环境的,而且 git 分支也要严格控制权限,master 分支只允许核心人员推送,合并分支也是。修改 bug 可以使用 dev 分支,gogs 的 web 界面也需要设置 IP 访问权限。

 

代码同步

代码同步方面,仍然使用 rsync+sersync,目前受于技术限制,没有发现其他更方便的同步方式

 

数据库

数据库用的 mysql8+,多台服务器之间以内网通信,设置独立的账号,分配权限指定数据库名。为了方便,管理员账户对外也指定了 IP,数据库对外端口也限制了 IP。需要注意的是 mysql8.0 以上修改了密码加密方式,连接不上的需要新建用户或更换版本。

 

后台开发

使用 laravel-admin 包,功能很强大,为作者点赞。绝大部分需求的功能都有,加上自定义的接口,可以满足日常后台开发的绝大部分需求。

 

缓存服务

数据缓存使用 redis,一样的需要限制 IP 访问。需要注意的是,redis 内网之间访问,IP 设置不是 127.0.0.1,而是对应的内网 IP。至于 mysql 的优化,社区一堆文章,我这里不做赘述。

 

图片等大文件存储

图片等大文件存储到七牛云或者阿里云 OSS,技术达到的话可以自行搭建图片服务器,记得使用 https 协议

 

使用 cdn 为网站加速

网站使用 cdn 加速,隐藏真实 IP,否则一旦暴露,ddos 攻击小公司根本扛不住。

以上限制端口都可以通过 linux 防火墙进行设置。

如果并发压力过高,记得开启 php 的 opcache,业务需要的话可以使用 swoolePHP-FPM 运行模式可以切换为动态,计算好 php 的连接数。

上线项目前可以用 apache 的 ab 命令进行压测,还可以使用第三方测试工具,比如 JMeter 等进行压测,详情见 L06 Laravel 教程 - 电商进阶 (Laravel 5.8)。

 

使用 supervisor 托管队列

队列使用 python 编写的 supervisor 进行管理,还可以使用 Horizon 队列管理工具,记得控制好权限

docker 环境搭建 gogs 和 rsync+sersync,我会分两篇文章,本周六写好发布。

 

API 开发

API 接口前期使用的是 dingoAPI,后来使用 golang 的 gin 框架重写了,最近看 laravel6.x 自带的 Resource,觉得可以不用 dingoAPI 了。

至于为什么使用 golang,因为个人很喜欢 go。我写过 pythonphp,都是解释性语言,想换一门编译型的,c++ 怕短时间入不了门,java 又太重,所以选择了 go。这里吐槽一下,php 的数组比 go 的 map 方便了 N 倍。
感谢 @下水道里有只猫,golang 带我入门,我是看了他的博客源码才能下手重写项目的。

 

建议

最近学习了 laradock,发现是真的好用,docker-compose 都配置好了,启动的时候选择对应镜像,方便快捷,一件试部署。

 

 

不过有个坑,就是我习惯直接批量重启容器,导致 nginx 容器连不上 php 容器

#我要运行2次,因为容器启动顺序冲突,还经常php容器连不上nginx
docker start $(docker ps -a | awk '{print $1}' | tail -n +2)

最好在 laradock 目录下执行

# 例:docker-compose up -d nginx mysql redis workspace php-worker
docker-compose -d up 容器1 容器2 容器3 ...

 

后期学习计划

至于后期的学习计划,重心在容器化,docker+k8s,还有 go 的微服务方向。最近对数学起了兴趣,准备明年买几本高数书学习一下🤣。还有明年准备复习英语,这样就可以参与社区的翻译工作了。可惜自己基于 ss 协议搭建的梯子被封了,只能用电脑查阅文档了。

转载:mouseleo - 多台服务器集群部署方案

THE END

发表回复