多台服务器集部署⽅案
撸了快 3 年的 Laravel 了,尽量这周分享本⼈使⽤的多台服务器集部署⽅案
118
/ / /  6803 /  44 /
1、rsync+sersync ⾃动同步差异化⽂件
2、docker 下安装 gogs
序⾔
⼤家看着图个乐就⾏,这段纯粹个⼈吐槽,可直接跳过
本⼈所在的公司,后端就我⼀个⼈,前端⼀名(原本 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重写。最终,得到⼀个结论!就是想要快速进步,就要靠⼤量项⽬喂养!
⽬标与现状
nongfuspring是什么意思⽬前在的公司较为安逸,主做维护,所以有很多空余时间。荒废时间对于技术⼈员是最可怕的,我们公司是存在编制的,不犯什么⼤错误基本可以⼲⼀辈⼦了,担忧技术停滞不前甚⾄倒退。
介绍下hbase
公司在三线城市(房价涨幅世界第⼀,不想吐槽),城市的 IT 技术相较于北上⼴深差距太⼤,⾃⼰⼜买不起房,学历只是⼤专,⾃考的远程教育本科⼜没有含⾦量,只能不断学习逼迫⾃⾝,靠技术去⼀线城市博得⼀席之地。
学⽆⽌境,百度云存储的内容估计这辈⼦都学不完了,从前端到后端到服务器到⼈⼯智能,内容太多了。经过长时间的思考,暂定以后端技术为主,前端不求精通,能做⼀些兼职即可,服务器⽅⾯⽬前
在研究docker+k8s, 公司服务器gogs就是搭建在docker环境下的。
接下来深⼊研究golang,微服务⽅⾯。
这周看看能不能写服务器部署的⼀个分享出来,到时候请各位批评指正!
filtered是什么意思本⽂将从三个阶段叙述,包含项⽬的架构、版本⼯具的选择、代码部署、到安全
正⽂
第⼀阶段:刚接⼿项⽬
外包交付之前,是通过ftp的形式上传⽂件。
交付后到公司战略⽅向调整后,因为公司业务较多,全国有 20 多个营业点,每个营业点都有⼀名前端设计,公司后端只有我⼀⼈。前端需要制作页⾯,供外⽹访问。
需要解决的问题:
1. 项⽬需要重新设计,选择框架?服务器环境如何搭建?
2. 代码安全问题,不希望全国的营业点直接访问到项⽬源码,如何选型?
3. 全国营业点中有技术较好的前端,如何给与部分⽹站修改权限?
4. ⽹站是站系统,域名需要泛解析,laravel ⾃带的路由⽂档⽆法提供解决⽅案
5. 后台的选型,还有权限等功能的开发
解决⽅案
1. 因为发现了 learnku 社区(前⾝ ), 学习了发布的教程,遂选择了 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,这也是⽬前能想到的解决⽅小白学python买什么书
案,受限于技术原因⽆法实现。下⼀步学习⽅向就在此。
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 以上修改了密码加密⽅式,连接不上的需要新建⽤户或更换版本。
后台开发
使⽤包,功能很强⼤,为作者点赞。绝⼤部分需求的功能都有,加上⾃定义的接⼝,可以满⾜⽇常后台开发的绝⼤部分需求。
缓存服务
数据缓存使⽤ redis,⼀样的需要限制 IP 访问。需要注意的是,redis 内⽹之间访问,IP 设置不是 127.0.0.1,⽽是对应的内⽹ IP。⾄
于mysql的优化,社区⼀堆⽂章,我这⾥不做赘述。
图⽚等⼤⽂件存储
图⽚等⼤⽂件存储到七⽜云或者阿⾥云 OSS,技术达到的话可以⾃⾏搭建图⽚服务器,记得使⽤https协议
使⽤ cdn 为⽹站加速
⽹站使⽤cdn加速,隐藏真实 IP,否则⼀旦暴露,ddos攻击⼩公司根本扛不住。
javascript面试知识点以上限制端⼝都可以通过linux防⽕墙进⾏设置。
如果并发压⼒过⾼,记得开启 php 的opcache,业务需要的话可以使⽤swoole。PHP-FPM运⾏模式可以切换为动态,计算好php的连接数。上线项⽬前可以⽤apache的ab命令进⾏压测,还可以使⽤第三⽅测试⼯具,⽐如JMeter等进⾏压测,详情见。
使⽤ supervisor 托管队列
队列使⽤python编写的supervisor进⾏管理,还可以使⽤Horizon队列管理⼯具,记得控制好权限
docker环境搭建gogs和rsync+sersync,我会分两篇⽂章,本周六写好发布。
API 开发
API 接⼝前期使⽤的是dingoAPI,后来使⽤golang的gin框架重写了,最近看laravel6.x⾃带的Resource,觉得可以不⽤dingoAPI了。
⾄于为什么使⽤golang,因为个⼈很喜欢go。我写过python,php,都是解释性语⾔,想换⼀门编译型的,c++怕短时间⼊不了门,java⼜太重,所以选择了go。这⾥吐槽⼀下,php的数组⽐go的 map ⽅便了 N 倍。
感谢 @下⽔道⾥有只猫,golang 带我⼊门,我是看了他的博客源码才能下⼿重写项⽬的。
建议
linux虚拟机创建目录命令最近学习了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 协议搭建的梯⼦被封了,只能⽤电脑查阅⽂档了。
⽣命不息,代码不⽌

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。