今天刚把一个项目部署完,所以写一篇博客纪念一下,因为,这个项目能搭起来实在是太不容易了。
首先,这个项目叫 iphone 热修复后台管理,简单的说就是用来管理 iphone 热修复所需要的 js 文件,手机定时请求js文件来修复app上出现的临时bug,然后管理平台和手机 app 那边约定一个rsa密钥对,用来验证 js 文件是来自热修复平台。
技术选型上,我选择了我最熟悉的 laravel 框架。这个框架我个人是很喜欢的,但是环境要求还是挺高的。无论是学校毕设系统那边的 apache,还是公司这边的 nginx,配置 url 重写的时候都遇到了问题。这回 nginx 配置重写更加的复杂,首先开发的服务器上 nginx 的配置文件高达两千多行,说实话我真不知道该往哪写配置,然后我单独拉出来一个配置文件放到我的 home 下,这样单独配个 server name 方便开发,然后再设个 host 指定 server name 指向的 ip,也还是不错。然后我在配置单独拉出来的 server 就出问题了,我一直以为我 nginx 配错了,结果告诉我这个服务器上nginx与 fast_cgi 的通信不走端口,走的监听 socket 文件,然后我一下午折腾 nginx 的配置白费了。
原本我以为热修复那边会有一个总的客户端服务器定时趴取我这边的信息,然后所有的iphone手机则请求那个总的客户端服务器,结果告诉我不存在这个客户端总服务器,也就是说所有的配置请求的我这边的服务器,亏我接口写在框架里面然后取数据库数据返回,这样所有的iphone请求服务器,服务器不爆炸有鬼……,所以改为在新增热修复的js文件的时候就生成配置文件,到时候iphone请求配置文件,直接在nginx那里处理请求,连fast_cgi都不走,同时还会在服务器设置缓存时间,这样减轻服务器的压力。
后来又告诉我,到时候客户端请求的是四台子服务器,而我的系统处于类似于中央服务器中,iphone是无法访问的,需要进行文件同步。卧槽,早知道这样我就写php脚本趴取数据库数据到子服务器,所以现在这样就需要文件同步,然后我就决定配置rsync,用rsync进行文件同步。
后来又告诉我之后我的代码要部署的linux系统里面php版本只有5.3,压根就跑不起来laravel,而且原来的php5.3还跑着其他业务,不好升级,所以我就装双版本的php试试看配置,然后我就下载php7源码,安装编译了php7,然后也成功配置了nginx对于双版本的php的支持,中间编译安装php7的坑就不说了,安装双版本的php的一把辛酸泪也不说了。
再后来又告诉我,那个正式的环境下服务器是apache,我去……apache我还真不会配双版本的php,然后我选择apache做反向代理到nginx……其实这样的话我一开始用nginx配双版本的php就没啥大意义啊,而且,我在学校里配过nginx做反向代理到apache,还真没见过apache做反向代理到nginx的。
后来到部署的时候,由于我没有实际动手做apache反向代理,就决定开其他端口到nginx。
部署那天,部署的前三个小时,我开始写部署文档,然后整整写了一个下午……一百三十几行的部署命令代码……这中间关于rsync服务,主管表示不要开守护进程直接用rsync命令写入定时脚本来同步文件,也就是用ssh那类的认证方式(参考scp)来同步文件,然后开启主服务器和四个子服务器之间公钥登录……好吧,虽然我觉得后者的配置更多啊,不过rsync的配置估计还真没有多少人配过我猜测。
星期四晚上开始部署,然后在用jenkins同步代码之后进行数据库创建,结果原本安装的php5.6的PDO扩展没装,openssl版本太低,然后怎么装都不行就编译重装5.6,然后好像编译的cmake就是涉及到C语言编译的东西升级坏了,导致服务器下libc.so库直接歇菜。这个库和sodoers一样有毒,而且后果更加的严重(啥命令都没有用,好歹sodoers改残了也只是sudo命令没法用)。当天晚上运维就拿着修复的系统盘去机房修复libc.so库。
星期五下午三点开始再次升级openssl,结果,历史总是惊人的相似,libc.so库又炸了,然后运维拿着u盘又去机房了。晚上接着战斗,终于环境弄好了,然后部署项目之后,等着端口开放,估计防火墙的缘故。
端口开放好之后,进行登入系统验证,结果登录正常,然而却无法写入数据库数据,报mysql_stmt_execute这个函数的相关错,说实话没见过,然后查了mysql的官当文档说这个函数在mysql5.1.25以上有用,看了一下线上mysql的版本,5.0.95………………气的吐血。不过后来问清楚原因才知道数据库那边用了altas这个玩意儿做了个数据库负载均衡,然后负责均衡的那个数据库版本5.0.95……,而真正存数据的数据库则是5.7版本,所以主管请求直接连数据库。
总之项目终于成功部署了,虽然还是有坑,简直一把辛酸泪。
The End~