撸了快 3 年的 Laravel 了,尽量这周分享本人使用的多台服务器集群部署方案

1、rsync+sersync自动同步差异化文件
CentOS7 下使用 rsync+sersync 配置文件自动同步
2、docker下安装gogs
使用 Docker 部署版本控制工具 Gogs

序言

大家看着图个乐就行,这段纯粹个人吐槽,可直接跳过
本人所在的公司,后端就我一个人,前端一名(原本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隐藏服务器真实域名。

API编写

接口最初使用laravel + dingo API,到现在的golanggin重写,爬虫项目也从最初的phpguzzle包到目前的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私有管理器,实现版本控制,svngit同时存在。
  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的连接数。

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

使用supervisor托管队列

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

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

API开发

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

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

建议

最近学习了laradock,发现是真的好用,docker-compose都配置好了,启动的时候选择对应镜像,方便快捷,一件试部署。
撸了快 3 年的 Laravel 了,尽量这周分享本人使用的多台服务器集群部署方案

不过有个坑,就是我习惯直接批量重启容器,导致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协议搭建的梯子被封了,只能用电脑查阅文档了。

生命不息,代码不止

本帖由系统于 1周前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 38

希望能通过从业务,到存储,到架构,到持续部署以及安全性能等综合方面的篇幅展开描述。这样,第一能体现你的业务能力,第二能体现你的技术能力,第三能体现你的管理能力。只是简单的文字描述,只是记流水账,过两天就石沉大海。当你写文章的时候应该想想这篇文章能给我带来什么收获,同时能给大家带来什么收获。我应该从哪个点开始描述,我的思维框架是怎样的?还有没有更好的方式去写?这是你应该写作的真正目的。

1周前 评论
fivenull (楼主) 1周前

希望能通过从业务,到存储,到架构,到持续部署以及安全性能等综合方面的篇幅展开描述。这样,第一能体现你的业务能力,第二能体现你的技术能力,第三能体现你的管理能力。只是简单的文字描述,只是记流水账,过两天就石沉大海。当你写文章的时候应该想想这篇文章能给我带来什么收获,同时能给大家带来什么收获。我应该从哪个点开始描述,我的思维框架是怎样的?还有没有更好的方式去写?这是你应该写作的真正目的。

1周前 评论
fivenull (楼主) 1周前

五空哥哥,求带飞~

1周前 评论
一个人的江湖

期待呀

1周前 评论

前排出售瓜子,饮料,矿泉水。

1周前 评论

已更新,估计明天可以完结,请大家批评指正。

1周前 评论

哈哈 支持 希望细节和整体思想并重

1周前 评论
fivenull (楼主) 1周前
小小海 1周前
hxd

大佬成长札记

1周前 评论

已乐。
生命不息,代码不止
加油⛽️

1周前 评论

看完文章很想对你提问,希望你在今后的工作也这样思考:
1、目标是什么? -- 明确目标;事情才能做得有价值和意义。
2、目前现状是什么? -- 就是目前碰到的问题是什么,要怎么解决这些问题,怎样更迈进目标?
3、采用的方法是什么?-- 针对现状和目标,方法是什么?方法是否需要改进,到底要怎么改?将就的,合适的,更好的?

1周前 评论
fivenull (楼主) 1周前

我发现我在走你的老路 不说一模一样 99%差不多 期待更新 期待中....

1周前 评论
fivenull (楼主) 1周前

楼主很棒,自己的路线也跟你差不多,加油!!

1周前 评论
likunyan

公司网址多少呀?

1周前 评论
巴啦啦

我就差进一个能养老带编制的公司了 :joy:

1周前 评论
fivenull (楼主) 1周前

事业单位吗 还是国企 有编制很厉害啊

1周前 评论
fivenull (楼主) 1周前

请问git触发钩子;是用的gitlab里面的webhook嘛? 服务器从gitlab下拉代码的时候是用的强制覆盖服务器本地吗? 因为版本回退的时候,使用git pull 不会更新代码

1周前 评论
fivenull (楼主) 1周前
likunyan 1周前
kowy (作者) 1周前
likunyan 1周前
kowy (作者) 1周前
kowy (作者) 1周前
fivenull (楼主) 1周前
likunyan 1周前
likunyan 1周前
kowy (作者) 4天前

想问问为什么想到了要换语言编写API
什么动力支持你完成这个重写

1周前 评论
fivenull (楼主) 1周前
liminghao 3天前
Krisji

不适合发展 说实话。建议有机会去大厂 看看

1周前 评论
fivenull (楼主) 1周前

楼主非常棒,学习一下 ,头一次看到这么乐于分享思路的 很真实,非常棒,棒棒棒

1周前 评论
fivenull (楼主) 1周前

楼主大才 :+1:

1周前 评论

已更新,至于gogsrsync+sersync的部署,这周会出单独的文章说明

1周前 评论

楼主可以用v2ray协议的楼梯fq

1周前 评论

感谢分享自己的学习过程,让我能从此得到一些启发.

1周前 评论

“学历只是大专,自考的远程教育本科又没有含金量,只能不断学习逼迫自身,靠技术去一线城市博得一席之地”

  • 做事不要“逼迫”自己,这样很痛苦。如果你在逼迫自己做事情,首先要停下来问问自己,我到底要做什么?这样做是否有意义?我的目标?
    成功人士往往不是“逼迫”自己,而是做自己擅长的事情。这件事意义重大,只要能对自己有帮助就愿意去学。
  • “学历”,不要被这个东西限制自己的思维。我学历低,并不代表我比别人差。我的“天赋”不需要这个文凭来验证。借助于《三傻大闹宝莱坞》电影里面的一句话:你只要追求卓越,成功便会自动找上门来。
  • 技术,只是实现结果的工具和手段。要想改变现状,就把这个“技术”先改变自己。关于“学习”的技术,模型太多了,比如“刻意练习”,“金字塔原理” ... ,总之 “要站在巨人的肩膀上” 迈出你的一步,就成功了。
  • 多看书,看对自身成长的书。看书的过程其实是作者跟你对话的过程,这个概念要明白,不要把看书当作目标,而是要通过看书得到什么才是目标。
1周前 评论
fivenull (楼主) 1周前
kowy 3天前

老哥,能分享下golang的入门吗?

1周前 评论
fivenull (楼主) 6天前
MuYan (作者) 6天前

楼主的学习过程看起来很6,祝你早日实现一线城市的技术路线

6天前 评论

膜拜一下大佬 :+1:

6天前 评论

三线城市,房价涨幅世界第一,莫非是西安?

6天前 评论
fivenull (楼主) 6天前

你说的这些技术栈,感觉我都用过,哈哈,
有问题一起交流,docker、 laravel、 lardock、go和py

5天前 评论
fivenull (楼主) 5天前

我现在在新公司,也是做跟你一样的事情,哈哈,一起加油!

5天前 评论
fivenull (楼主) 5天前

文章写得很赞,加油。房价突破6w……楼主合肥的啊!

5天前 评论

git的话可以考虑用gogs。方便。我们现在就用这个。

5天前 评论
fivenull (楼主) 5天前

房间涨幅第一。。。 山东的吗?

4天前 评论
fivenull (楼主) 3天前
kowy 3天前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!