本发明涉及网络安全领域,特别是涉及一种Nginx上游代理服务系统及实现方法。
背景技术:
多核时代的网络安全设备一般区分管理面和数据面,管理面是提供给网络管理人员使用Telnet、Web、SSH、SNMP等方式来管理设备,数据面的基本任务是处理和转发不同端口上各种类型的数据,例如L2/L3/ACL/Qos/组播/安全防护等各功能的具体执行过程,都属于数据转发平面的任务范畴。
Nginx("engine x")是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx在Linux上使用epoll异步非阻塞模型高效的处理了TCP请求,是数据面实现HTTP请求的代理转发首选。
现有技术中一般通过数据面Nginx服务器,监听到某一个或几个端口提供Web服务,客户端通过数据面快速协议栈处理连接到Nginx。Nginx通过AF_INET域套接字和上游服务器进行反向代理,Nginx和上游服务器的上下游报文都需要经过系统协议栈。Nginx通过AF_INET域套接字和上游服务器进行反向代理,Nginx和上游服务器的上下游报文都需要经过系统协议栈。或者,Nginx通过AF_LOCAL/AF_UNIX域套接字和上游服务器进行反向代理,Nginx和上游服务器的上下游报文不需要经过系统协议栈,经过IPC(Inter-Process Communication,进程间通信)机制进行报文传递。
因此,现有技术存在如下缺陷:
1、上下游报文系统协议栈处理,会对报文的转发产生性能影响。
2、由于技术限制某些情形下,数据面Nginx不能和管理面基于AF_INET域套接字进行通信。
3、上下游报文需要通过内核拷贝传递,多次拷贝影响效率且处理依赖内核调度,应用过滤控制困难。
4、由于技术限制某些情形下,数据面Nginx不能和管理面基于AF_LOCAL/AF_UNIX域套接字进行通信。
技术实现要素:
为了克服上述现有技术的缺陷,本发明要解决的技术问题是提供一种Nginx上游代理服务系统及实现方法。
为解决上述技术问题,本发明中提供一种Nginx上游代理服务系统实现方法,所述代理服务系统包括管理面代理服务模块和数据面Nginx模块,所述方法包括:
对所述管理面代理服务模块和所述数据面Nginx模块建立共享内存;
将所述共享内存作为TCP连接载荷数据的承载通道;所述TCP连接载荷数据包括用户的HTTP请求数据和上游服务器的HTTP响应数据。
为解决上述技术问题,本发明还提供一种Nginx上游代理服务系统,包括设置模块、管理面代理服务模块和数据面Nginx模块;
所述设置模块,用于对所述管理面代理服务模块和所述数据面Nginx模块建立共享内存;
将所述共享内存作为TCP连接载荷数据的承载通道;所述TCP连接载荷数据包括用户的HTTP请求数据和上游服务器的HTTP响应数据。
本发明有益效果如下:
本发明中方法及系统,通过使用共享内存作为TCP连接载荷数据的承载通道,有效提高了代理系统的数据转发效率。
附图说明
图1是本发明实施例中Nginx上游代理服务系统的布局示意图;
图2是本发明实施例中具有多核心处理器的代理服务系统的结构示意图。
具体实施方式
为了解决现有技术的问题,本发明提供了一种Nginx上游代理服务系统及实现方法,以下结合附图以及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不限定本发明。
如图1所示,本发明实施例中一种Nginx上游代理服务系统实现方法,所述代理服务系统包括管理面代理服务模块和数据面Nginx模块,所述方法包括:
对所述管理面代理服务模块和所述数据面Nginx模块建立共享内存;
将所述共享内存作为TCP连接载荷数据的承载通道;所述TCP连接载荷数据包括用户的HTTP请求数据和上游服务器的HTTP响应数据。
具体说,数据面Nginx模块:运行于一个或多个数据面处理核心,提供用户连接管理,代理数据转发。
共享内存:数据面Nginx模块和管理面Proxy程序的共享内存,负责代理数据缓存。客户端一个TCP连接对应于共享内存中一个存储区域。
管理面代理服务模块即管理面Proxy程序:管理面Apache的客户端,每一个TCP连接都有一个对应的Proxy和Apache连接,从共享内存获取数据,发送给Apache;将Apache响应数据通过共享内存返回数据面Nginx。
管理面上游服务器:为用户提供接入Web Portal。其中,图中数据平面与数据面意义相同,管理平面与管理面意义相同。
进一步说,所述将所述共享内存作为TCP连接载荷数据的承载通道,包括:
所述数据面Nginx模块接收到用户Portal请求时,从所述共享内存中申请一条承载通道,并标记为新连接;
所述管理面代理服务模块扫描所述共享内存,发现所述新连接的标记时,创建与上游服务器的本地连接。
具体说,所述所述数据面Nginx模块接收到用户Portal请求,包括:
所述所述数据面Nginx模块在接收到用户TCP请求时,与所述用户建立TCP连接;
通过所述TCP连接,接收到所述用户的首次HTTP请求时,解析所述首次HTTP请求为所述用户Portal请求。
在上述实施例的基础上,进一步提出上述实施例的变型实施例,在此需要说明的是,为了使描述简要,在各变型实施例中仅描述与上述实施例的不同之处。
在本发明的一个实施例中,所述管理面代理服务模块扫描所述共享内存,发现所述新连接的标记时,创建与上游服务器的本地连接之后,还包括:
所述数据面Nginx模块接收到用户的HTTP请求数据,将所述HTTP请求数据写入所述承载通道,并标记为第一新数据到达;
所述管理面代理服务模块轮询所述本地连接,发现所述第一新数据到达的标记时,从所述承载通道中读取所述HTTP请求数据,并发送给上游服务器,以及接收所述上游服务器的HTTP响应数据,将所述HTTP响应数据写入所述承载通道,并标记第二新数据到达;
所述数据面Nginx模块轮询所述本地连接,发现所述第二新数据到达的标记时,从所述承载通道中读取所述HTTP响应数据,并发送给用户。
在本发明的另一个实施例中,所述管理面代理服务模块扫描所述共享内存,发现所述新连接的标记时,创建与上游服务器的本地连接之后,还包括:
所述管理面代理服务模块探测到所述上游服务器关闭本地连接时,在所述承载通道上设置第一关闭连接标记;
所述数据面Nginx模块轮询到所述第一关闭连接标记时,关闭与所述用户的socket;
所述数据面Nginx模块Nginx探测到所述用户关闭TCP连接时,在承载通道上设置第二关闭连接标记;
所述管理面代理服务模块轮询到所述第二关闭连接标记时,关闭与上游服务器的本地连接。
在本发明的又一个实施例中,如图2所示,所述代理服务器设置在具有多核心处理器的硬件平台;
其中每个核心对应一个数据面Nginx模块。
详细说,本发明中方法使用共享内存作为数据TCP连接数据传输通道,其处理包括三个处理过程即连接建立过程、HTTP请求、响应代理过程、连接关闭过程。
一、连接建立过程:
用户发起TCP请求,和数据面Nginx服务器建立TCP连接;
用户发送首次HTTP请求到数据面Nginx;
数据面Nginx解析HTTP请求,解析为用户Portal请求,则从共享内存申请一条连接资源,并标记为“新连接”;
管理面Proxy程序扫描共享内存,发现有“新连接”则创建一条和上游服务器的本连接,并将HTTP请求发送给上游服务器;
上游处理HTTP请求,并产生HTTP响应,发送给Proxy代理程序;
Proxy代理程序收到HTTP响应,写入该连接存储区域,并标记为“新数据到达”;
数据面Nginx通过定时器轮询连接,发现有“新数据到达”标记,获取数据并发送给客户端;
二、HTTP请求、响应代理过程:
用户在已建立的TCP连接上发送HTTP请求,数据面Nginx解析HTTP请求,并进行完整性校验,校验成功则写入该连接存储区域,并标记为“新数据到达”,校验失败,返回HTTP错误响应;
Proxy代理程序定时轮询连接,发现有“新数据到达”标记,获取数据并发送给上游服务器;
上游服务器处理HTTP请求,并产生HTTP响应,发送给Proxy代理程序;
Proxy代理程序收到HTTP响应,写入该连接存储区域,并标记为“新数据到达”;
数据面Nginx通过定时器轮询连接,发现有“新数据到达”标记,获取数据并发送给客户端。
三、连接关闭过程:
上游服务器关闭本地连接,Proxy程序探测到,释放和上游服务器的本地连接资源,在连接存储区域上设置“关闭连接”标记,Nginx轮询到“关闭连接”则关闭与用户的socket,并释放共享内存中的连接资源;
同样,用户关闭与Nginx的TCP连接,Nginx探测到,释放和客户端的连接资源,在连接存储区域上上设置“关闭连接”标记,Proxy程序轮询到“关闭连接”标记则关闭与上游服务器的本地连接同时释放共享内存中的连接资源。
本发明通过使用共享内存作为TCP连接载荷数据的承载通道,有效提高了代理系统的数据转发效率。
Proxy代理程序可以灵活的和不同上游服务器进行对接,比如Apache、Nginx、Lighthttpd等。
在多核处理器上每个核心上面可以启动一个数据面Nginx代理进程,有效提高连接并发数量。Nginx代理进程运行在数据面协议栈之上,报文处理过程可继承快速协议栈的性能优势。
通过数据面和管理面务配合为用户接入提供WEB服务,即利用了管理面全功能复杂业务处理的优势,也兼顾了数据面处理效率。
本发明进一步提出一种Nginx上游代理服务器。
本发明实施例中一种Nginx上游代理服务系统,包括设置模块、管理面代理服务模块和数据面Nginx模块;
所述设置模块,用于对所述管理面代理服务模块和所述数据面Nginx模块建立共享内存;
将所述共享内存作为TCP连接载荷数据的承载通道;所述TCP连接载荷数据包括用户的HTTP请求数据和上游服务器的HTTP响应数据。
进一步说,所述数据面Nginx模块,用于接收到用户Portal请求时,从所述共享内存中申请一条承载通道,并标记为新连接;
所述管理面代理服务模块,用于扫描所述共享内存,发现所述新连接的标记时,创建与上游服务器的本地连接。
具体说,所述所述数据面Nginx模块接收到用户Portal请求,包括:
所述所述数据面Nginx模块在接收到用户TCP请求时,与所述用户建立TCP连接;
通过所述TCP连接,接收到所述用户的首次HTTP请求时,解析所述首次HTTP请求为所述用户Portal请求。
进一步说,所述数据面Nginx模块,还用于接收到用户的HTTP请求数据,将所述HTTP请求数据写入所述承载通道,并标记为第一新数据到达;以及用于轮询所述本地连接,发现所述第二新数据到达的标记时,从所述承载通道中读取所述HTTP响应数据,并发送给用户;
所述管理面代理服务模块,还用于轮询所述本地连接,发现所述第一新数据到达的标记时,从所述承载通道中读取所述HTTP请求数据,并发送给上游服务器,以及接收所述上游服务器的HTTP响应数据,将所述HTTP响应数据写入所述承载通道,并标记第二新数据到达。
进一步说,所述管理面代理服务模块,还用于探测到所述上游服务器关闭本地连接时,在所述承载通道上设置第一关闭连接标记;以及轮询到所述第二关闭连接标记时,关闭与上游服务器的本地连接;
所述数据面Nginx模块,还用于轮询到所述第一关闭连接标记时,关闭与所述用户的socket;以及探测到所述用户关闭TCP连接时,在承载通道上设置第二关闭连接标记。
其中,所述述代理服务系统设置在具有多核心处理器的硬件平台;每个核心对应一个数据面Nginx模块。
本发明通过使用共享内存作为TCP连接载荷数据的承载通道,有效提高了代理系统的数据转发效率。
Proxy代理程序可以灵活的和不同上游服务器进行对接,比如Apache、Nginx、Lighthttpd等。
在多核处理器上每个核心上面可以启动一个数据面Nginx代理进程,有效提高连接并发数量。Nginx代理进程运行在数据面协议栈之上,报文处理过程可继承快速协议栈的性能优势。
通过数据面和管理面务配合为用户接入提供WEB服务,即利用了管理面全功能复杂业务处理的优势,也兼顾了数据面处理效率。
虽然本申请描述了本发明的特定示例,但本领域技术人员可以在不脱离本发明概念的基础上设计出来本发明的变型。
本领域技术人员在本发明技术构思的启发下,在不脱离本发明内容的基础上,还可以对本发明做出各种改进,这仍落在本发明的保护范围之内。