|

本帖最后由 落款hMZ 于 2017-7-4 04:41 编辑
一:首先,说一下目前的痛点
痛点1:目前web开发的主流语言是 .net asp php java等,对于一个易语言编程者来说,如果能够非常熟练的掌握上面几个语言,那当然是很好的,可是我们每个人的时间有限,易语言编程者大多数也都并不是科班出身,掌握多一门语言需要花费的时间很多,并且很多人可能跟我一样,汉字写的文章,一大段都可以随便背诵,可是超过4个字母或者数字的组合永远都记不住(我花了很久的时间才记住php里的 ‘substr’,虽然我用过他上百次了)
痛点2:主流web开发语言调用DLL都不方便,不管是asp 还是 php,想调用一个易语言编写的DLL,都要走一些弯路,并且效率也不见得有多高,很多时候,web给用户提供的一些功能,必需使用到超出一般脚本语言能力所及的范围,比如我们的网站想要帮用户识别另外一个网站的验证码,而识别程序恰好又是易语言写的,这个就比较麻烦了
痛点3:某些主流编程语言,在特定的情况下,效率并不是很高,在这里,我举一个可能大家都没想过的例子来说明一下吧
我有一个mysql数据库,管理着我的软件用户的数据,而我的软件是基于服务器-客户 的模式的,用户打开软件后登陆到服务器,然后要保持在线,接收服务器发来的消息,计算在线时间等等,这个有点类似于即时通讯,所以客户端需要循环每10秒访问一次我的服务器,我的服务器不停的查询数据库里是否有该用户的新消息,如果有,就立即发给用户
服务器如果不用http的话,速度应该还是可以的,但是后来我扩展到了有些操作可以在网页里完成,甚至在微信里完成,这样的话,就必须搞http服务器了,而软件所对应的服务器端也跟着改为http的了
服务器我用的是阿里云的,负载均衡后面带一堆子服务器,http服务器是IIS,页面是PHP写的
所有更改完成以后,发现服务器经常返回500错误,于是查找原因发现,是PHP对mysql服务器访问失败,原因是mysql的最大连接不够
于是我把最大连接改到3000,然后把mysql服务器升级为 16核64G 的,在用户量激增的时候仍然会有这样的情况,并且我的web服务器是负载均衡集群的,后台子服务器数量已经达到了15个,每个里面进程数量都达到900+
于是在闲的时候,我用阿里云的压力测试服务做了一下压测,结果是这样的
这就是PHP和mysql的组合,在这么点流量的情况下,失败率达到50%
分析原因,发现问题出在PHP的机制上面,PHP跟mysql的结合其实并不像大家想象的那么好,每个页面,每次用户访问一次,都会新建一条mysql连接,而我的页面是每1秒查询一次mysql,没有数据就等待1秒后继续查询,所以mysql连接在整个15秒内都没有释放,被这个请求独占了15秒,又不能给其它用户使用
PHP不支持mysql长连接共享,也就是说每次请求都会创建一个mysql连接,直到mysql服务器达到最大连接数
因此,我想到了用易语言代替PHP,新建一些mysql长连接,在等待1秒的期间,这个连接可以给别的请求所使用,这样就可以极大节约mysql连接数
所以我用易语言写了一个ISAPI扩展,全局变量里放一个数组,里面是mysql句柄,在没有用户请求的时候,用一个线程去检查每个句柄最后使用的时间,一旦最后使用的时间超过2分钟,就做一次非常简单的查询 select 1+1,这样做仅仅是为了保持这个连接,在有用户使用的时候,每次查询数据库之前,先在这个池子里提取一个mysql句柄,查询完以后再放回去,以提供给其它用户使用
这样做了以后,再次用阿里云的压力测试进行测试,结果如下:
失败率一下下降到3%
所以从这件事以后,我就开始觉得,用易语言编写web服务器也是可行的,限于ISAPI的各种限制,做ISAPI扩展远远不如直接抛弃IIS,自己写个web容器来得痛快
二:易语言做web服务器的好处
1、适合易语言编程者:不管是我们这些年自己积累的,还是精易论坛里搜索到的,我们都有大量成熟的代码,在易语言IED里,我们几乎可以做任何事,可是到了PHP,asp这些脚本语言,很多时候我们发现我们无能为力,用易语言开发web容器的目的就是为所欲为,做我想做的事
2、做一个比Apache和IIS更加轻量级的容器,可以节约更多资源,Apache和IIS并不是每个功能我们都需要,比如日志,很多人可能根本不需要日志,可是关闭的话,总觉得少了点什么,Apache和IIS都是大工程,功能齐全,代码庞大,可是我们很多时候仅仅只是想要一个轻量级的,能够提供最基础的功能就够了
3、对底层的绝对掌控。Apache我不是很熟,先不说,就说IIS吧,IIS的底层是基于socket的,作为一个web容器,我认为对于,TCP等待队列,应用程序内存的分配,保持连接的时长,这些在IIS里面都没有直接的选项,有的需要修改注册表,有的需要在某个埋得很深的地方找到一个配置文件修改,有的甚至根本无法修改,而如果我们是用易语言自己开发的话,这些一切的东西我们都可以自定义
4、更另类的东西其实更安全。除了sql注入以外,在一般情况下,如果我们用的是易语言写的web容器的话,黑客想要通过后台获取我们服务器的管理权限,是非常困难的,因为他们根本不知道这是个什么东西,代码在哪里,我想没有几个黑客愿意花大量时间研究一下一个非标准化的东西,这样无形中保护了服务器的安全
5、因为底层我们可以完全掌握,这样,我们可以自定义CC攻击的阀值,可以为自己定制更加适合的防御策略,可以更好的防御爬虫等等
三:那么说了这么多,易语言编写web服务器真的可以高效率运行吗?
还是以Window系统下的web服务器为例,不管是Apache还是IIS,最底层还是操作socket,而易语言操作Windows的socket API效率并不低,跟IIS相比,无非就是在启动的时候多了几个寻找函数地址的过程,后面其实都是一样的call,相比IIS,我们可以阉割掉大量我们不需要的功能,只要代码写好了,运行效率不一定比IIS差
对于应用池,我们是直接调用DLL的,甚至是直接在web容器内部调用函数的,这个比fastcgi可是要快得多了,当然,如果你想要,你也可以在你的web容器里加入对fastcgi和ISAPI的支持,这些后面再说
四:我们需要写一个怎么样的web容器,它需要哪些基本功能?
我认为,作为一个合格的web容器,以下几个功能是必须的
1、支持所有HTTP谓词,“OPTIONS”, “HEAD”, “GET”, “POST”, “PUT”, “DELETE”, “TRACE”, “CONNECT”,另外还可以自己扩展几个谓词用于特定的操作
2、支持安全管理:绝对不可以用Administrator权限去直接处理用户的请求,这是安全管理最基本的要求,来宾用户只有对web根目录文件夹有一定权限,不能对所有文件夹都有权限,甚至应用程序池的权限也要做一定的控制,至于权限控制,本人之前已经在论坛发了源码,后面我们会详细讲
3、对Connection: keep-alive的支持,想要web容器高效率运行,每次都要新建socket连接当然不行
4、多主机头支持,其实这个也就是把访问过滤分类而已,如果想做得更细致,我们还能做对不同的主机头访客使用不同的来宾账号,让服务器更加安全
5、筛选器插件支持,用于URL改写或者访问拦截
6、Gzip支持,这个精易模块就有源码,不是事
五:我们还可以做哪些功能?
下面说到的功能可能都不是必须的,但是也是我自己亲自测试可用的
1、对websocket的支持,既然都socket编程了,而websocket协议又不是很难,一个http访问升级为websocket访问,对我们已经掌握了底层来说,完全不是问题,论坛里websocket协议的源码很多,如果不满意还可以自己去研究websocket协议,自己写
2、对SSL的支持,这个稍微有点难,不过用OpenSSL 或者Windows的 SSPI API + Crypt API也是可以做的,论坛里已经有SSPI API 创建SSL连接,监听端口的相关源码,搜索一下就是了
3、对PHP的支持。这个我研究过几天,想要支持PHP,最简单的办法是 使用命令 -S <addr>:<port> 创建一个内置PHP服务器来处理用户请求,直接吧php的请求转发到本地的端口就可以了(注意这个内置PHP服务器是单线程的,所以要维护一个程序池,启动很多内置服务器)
4、对asp的支持,使用 smwn.exe 就可以了,也是一个内置服务器,没毛病
5、代理,反向代理支持,这关键就是一个端口映射,没什么特别难的
六:做一个合格的,高效的web容器,我们需要哪些知识或者源码?
1、socket 咯,源码到处都是,建议采用原生的Windows API,不要使用封装过的,比如hpsocket 这个封装过度了,反而不那么自由,且带个DLL也不是很爽的事
2、熟悉HTTP协议咯,这个是最基本的吧,上面说的那些个谓语,还有协议头里的各种值都要了解,这里特别提醒一下大家注意 Transfer-Encoding: chunked这个头
3、web应用程序的一些基本工具,写易语言服务器是为了方便易语言开发者,可是如果连常用工具都没有,那就不方便了,常用工具如
(1) mysql连接池啦,这个自己写吧,超级简单,注意伪心跳,超过2分钟没有使用的mysql句柄就查询一下 select 1+1 就是了
(2) 密码算法咯,这个任何一个web应用程序都少不了的,论坛上我已经发过OpenSSL和Crypt API的算法源码,支持RSA加密和签名,多种模式的AES,DES,各种散列,数据摘要,各种HMAC,这些都已经帮大家写好了,比PHP还全,请自行搜索吧
(3)文本处理咯,比如json,xml的解析,生成等,这个我也发了源码,自行搜索吧
(4)验证码。。。。没想到吧,web服务器不能产生验证码那还叫web服务器吗?嘿嘿,我又发过源码了,直接用易语言产生验证码,效率又比PHP的高,自己找吧
(5) CURL,这个在易语言里叫做 libcurl,几年前就有人发源码了,我们尽量贴合PHP的常用扩展,它有的,我们尽量也要有
4、上面说了,合格的web容器一定要有安全管理,权限控制等等,好吧,我又发过源码。Windows安全机制,自己找
七:我们可能还需要这些东西:
1、SSL服务器源码,上面说了,源码在论坛里有
2、websocket,要么自己去学,要么在论坛找找源码吧,这个最近几年很火,论坛前年就有websocket服务器的源码了
3、程序池的管理,比如要做PHP支持,我们需要创建一大堆 PHP内置服务器进程,同一时间每个访问对应不同的进程,在主进程关闭后自动关闭创建出来的这些进程,根据访问量的增大和减少,增加或者减少PHP内置服务器进程 等等,这些需要花点时间去研究一下,做个简单的功能不难
4、PHP里的一些其他扩展,比如非mysql数据库操作,比如SMTP扩展,比如GD+扩展等等
5:、二维码生成,这个可能会用到,用易语言生成二维码,这个貌似是有源码的,大家找一找,要是没有,自己用PHP的源码或者js源码翻译也不难的
八:必要性和可行性总结:
有必要吗?有吗?我觉得是有必要的,不亲眼见识过轻量级web容器的威力的人可能无法理解这个需求,标准的东西,有他的好处也有他的坏处,非标准的东西可以取长补短,最重要的是,如果你的网页全都是易语言写的,那黑客绝对直接绕道了
可行吗?为什么不行?我上面总结的我们需要哪些东西,可能不是很全面,但是绝大多数都是有现成的源码的啊,只要你有一点点时间,耐心的把各种源码拼凑一番,基本上这个web容器就已经完成了90%了啊
九:那么怎么启动这个项目:
这个项目是否需要多个人一起合作?个人认为,既然做非标准的东西,既然非标准是卖点之一,既然实现起来大多数都有源码,难度不大,那么没必要一堆人合作做出这个东西,或者更没必要让某个大神做了这个东西以后开源
最好是有需要的人,大家各自分开做吧,各做各的,每个人的都不相同,在做的过程中把大家可能会用到的一些工具源码发到论坛上来,供别人参考
以上,大家有什么看法,欢迎发言
希望早点看到优秀的易语言web服务器
|
评分
-
查看全部评分
|