多台服务器集群部署方案

37次阅读

框架选型

版本控制

API 编写

目标与现状

第一阶段 : 刚接手项目

需要解决的问题 :

解决方案

不足之处

第二阶段

需要解决的问题 :

解决方案

不足之处

第三阶段

服务器

环境搭建

版本控制

代码同步

数据库

后台开发

缓存服务

图片等大文件存储

使用 cdn 为网站加速

使用 supervisor 托管队列

API 开发

后期学习计划

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

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

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

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

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

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

目标与现状

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

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

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

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

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

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

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

此间碰到过多起安全问题 , 网站运行受到大量的 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 加速 , 隐藏真实 IP, 否则一旦暴露 ,ddos 攻击小公司根本扛不住。

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

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

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

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

API 接口前期使用的是 dingoAPI, 后来使用 golanggin 框架重写了 , 最近看 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 协议搭建的梯子被封了 , 只能用电脑查阅文档了。

原文链接:https://blog.csdn.net/csdn_life18/article/details/112676773

正文完
 
追风者
版权声明:本站原创文章,由 追风者 2024-01-02发表,共计4226字。
转载说明:声明:本站内容均来自互联网,归原创作者所有,如有侵权必删除。 本站文章皆由CC-4.0协议发布。