开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 5911|回复: 24
打印 上一主题 下一主题
收起左侧

[讨论] 易语言开发web容器的必要性,可行性讨论

[复制链接]
头像被屏蔽
结帖率:14% (1/7)
跳转到指定楼层
发表于 2017-7-4 04:28:34 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   湖北省孝感市
本帖最后由 落款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服务器

点评

http://125.confly.eu.org/forum.php?mod=viewthread&tid=14027751   河南省郑州市  发表于 2017-7-4 11:39
我前段时间写过一个勉强能支持web访问的软件,支持dll编程。你可以去看下,开源的了。随便写的,代码并不严谨   河南省郑州市  发表于 2017-7-4 11:38

评分

参与人数 2好评 +2 精币 +6 收起 理由
韩龙 + 1 + 1 我读书少,不要骗我
Cand + 1 + 5 很赞同,谢谢!

查看全部评分

结帖率:100% (1/1)
20
发表于 2018-4-26 01:51:51 | 只看该作者   北京市北京市
小白熊 发表于 2017-7-5 02:37
开发过,不知道你有没有听过60吗短xin平台,就是我开发的,
开始就是用易写的WEB服务器,但于上个月php版 ...

于是django和易语言的结合版就来了
回复 支持 反对

使用道具 举报

结帖率:67% (4/6)

签到天数: 2 天

19
发表于 2017-8-12 22:19:26 | 只看该作者   云南省红河哈尼族彝族自治州
mysql连接池??
回复 支持 反对

使用道具 举报

结帖率:50% (2/4)

签到天数: 2 天

18
发表于 2017-7-7 21:44:04 | 只看该作者   广东省中山市
开着web容器需要的知识储备  会整的我要死要死的
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 1 天

17
发表于 2017-7-5 20:06:47 | 只看该作者   广西壮族自治区桂林市
太难了,看不懂
回复 支持 反对

使用道具 举报

结帖率:95% (59/62)
16
发表于 2017-7-5 15:09:20 | 只看该作者   安徽省合肥市
落款hMZ 发表于 2017-7-5 14:15
PHP如果用fastcgi模式的话,如果访问量大,如果每次访问服务器处理的时间长,就会产生大量php-cgi.exe进 ...

直接使用windows socket编程 IOCP模型,理论是支持大并发,但当时设计可能确实存在很多缺陷,但我现在已经不想再开发了,开发起来很蛋疼。
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:14% (1/7)
15
 楼主| 发表于 2017-7-5 14:15:37 | 只看该作者   湖北省孝感市
小白熊 发表于 2017-7-5 02:37
开发过,不知道你有没有听过60吗短xin平台,就是我开发的,
开始就是用易写的WEB服务器,但于上个月php版 ...

PHP如果用fastcgi模式的话,如果访问量大,如果每次访问服务器处理的时间长,就会产生大量php-cgi.exe进程,比如像WEBQQ接受消息,一次访问poll 最长有25秒,在这25秒里服务器在不停的查询数据库,这个请求会独占一个mysql链接25秒
,如果同时有上万个这样的请求,那么你的数据库肯定爆,如果php在查询一次数据库后释放mysql连接,过1秒又需要查询的时候再链接,这仍然不是一个好办法,并且,因为每次请求处理的时间都很久,如果有大量请求的话,服务器就需要大量的进程去处理,这是PHP的硬伤,能用线程解决的事他硬是用进程去解决了,一个进程跟一个线程相比,开支就要大的多了,即使是fastcgi的进程,开支仍然比线程大的多
你说的情况我认为肯定是web容器哪里设计有缺陷
比如
1.底层的socket编程是否高效率,是否能允许大并发,等待队列有多长,是否合适,断开连接后句柄是否及时释放了,是否复用了
2.是否有内存泄露,服务器运行很久以后内存有没有大量增加
3.有没有保持链接机制
4.mysql连接池的效率怎么样,是否支持大并发
5.对每次请求的处理是否高效,等等等等

60码我听过但是没用过,可是我觉得最关键的处理应该是在用户获取验证码结果的时候,这个请求应该是最频繁的,所以一定要高效
回复 支持 反对

使用道具 举报

结帖率:95% (59/62)
14
发表于 2017-7-5 02:37:27 | 只看该作者   安徽省合肥市
开发过,不知道你有没有听过60吗短xin平台,就是我开发的,
开始就是用易写的WEB服务器,但于上个月php版本开发完成换成了PHP,使用apache服务器centos系统,
我用易开发的WEB服务器稳定运行一年多,但后来我发现,不知道为什么我用易开发的服务器承受能力总是很不及apache那么强,可能是个人能力有限,导致设备增加浪费更多钱,于是我用php重写了,
那个服务器还是去年年初开发完成的,现在我觉得我可以开发出更好的WEB服务器了,但是不想重复造轮子, 并且加上易自身的缺点,还有我没有能力开发出能与apache相比的服务器,于是改用php咯
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:14% (1/7)
13
 楼主| 发表于 2017-7-4 15:55:03 | 只看该作者   湖北省孝感市
黑猫よ__ 发表于 2017-7-4 11:37
理论上现在的内存容量确实也足够大,一般也不需要特别注意内存碎片问题,但如果将其层次提升到,每秒成千上万 ...

谢谢,明白了,那这个问题在别的编程语言里他怎么处理的呢,如果尽量不使用全局变量会不会就可以避免这个问题?因为全局变量在多线程里都是尽量避免读写的,即使要读写多数也只是整数的全局变量,会尽量避免改变全局变量的尺寸
回复 支持 反对

使用道具 举报

结帖率:82% (9/11)
12
发表于 2017-7-4 11:37:49 | 只看该作者   广东省深圳市
理论上现在的内存容量确实也足够大,一般也不需要特别注意内存碎片问题,但如果将其层次提升到,每秒成千上万的访问量时,这种现象就会造成致命后果。
回复 支持 反对

使用道具 举报

11
发表于 2017-7-4 11:36:41 | 只看该作者   广东省佛山市
看上去很强大,顶一顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表