问题发现
刚毕业那会儿在客户现场,一天客户的管理员说创建不了FTP帐号了。
FTP服务使用了开源的vsftpd,帐号管理是vsftpd自带的功能,帐号管理就基于最简单的text文档,客户端通过WebService对帐号文件进行增删改查。
WebService基于C++实现的gSOAP框架 。这代码是从客户那里接手的,原开发者精通C++。
首先添加日志,根据日志发现是服务繁忙,请求都被阻塞了。
我就纳闷了,一个企业内部应用,就几个管理员用怎么会出现服务繁忙呢。
问题原因
服务繁忙一定是请求过多造成的。那么接下来我倒要看看是谁在不断地请求这台服务器。
继续添加日志,获取请求者的IP(按理说这种事情找客户的网管就行,但客户的网管什么都不懂,也请不动),运行一段时间后发现惊人,日志里面有大量来自外网的请求。
原来客户财大气粗,有自己的公网IP,有段时间进行网络优化,优化后那台服务器就随意分配了一个公网IP,变成了一台面向互联网的服务器。有些个爬虫啊、漏洞扫描工具啊时不时扫描一下,单线程的WebService不出现请求繁忙才怪。
问题方案
最简单的方法是请客户的网管或运维关掉公网IP,要么开启防火墙,但这种方式在客户那里行不通,因为客户的原则就是什么都不做,全部交给供应商搞定。
那么就从代码上实现,首先WebService加IP过滤,只接受来自内网的请求。
其次将代码重构成多线程实现 ,参见官网Multi-Threaded Stand-Alone Service