yaoweibin / nginx_tcp_proxy_module

add the feature of tcp proxy with nginx, with health check and status monitor
http://yaoweibin.github.com/nginx_tcp_proxy_module
1.64k stars 366 forks source link

nginx-1.8.1+nginx_tcp_proxy_module-0.4.5反向代理mysql偶现代理失败的问题 #134

Open lusinking opened 7 years ago

lusinking commented 7 years ago

背景:nginx-1.8.1+nginx_tcp_proxy_module-0.4.5(linux)代理mysql,每个请求都会创建一个连接,共两个请求 问题:偶发出现第一个请求代理正常,第二个请求超时失败,通过打开debug日志查看,正常的请求在代理到后端mysql时第一个epoll事件是写事件(即EPOLLOUT,应该就是连接建立触发的),而失败的这一次则是读写事件(EPOLLIN+EPOLLOUT)都有,而且check broken连接时能够peek到后端mysql发过来的数据,但是这个两个事件就会导致tcp proxy处理异常,从源码来看,tcp proxy认为第一个事件是连接事件,因此做初始化动作,而如果异常情况下读写事件都返回则会将EPOLLIN事件用于初始化,EPOLLOUT则导致了后续处理流程走错,变成等待客户端发送数据(其实第一个数据应该是服务端发送)

正常请求日志:2016/xx/xx 02:05:47 [debug] 17605#0: epoll: fd:53 ev:0004 d:00007FC63B17C380 异常请求日志:2016/xx/xx 02:05:50 [debug] 17605#0: epoll: fd:55 ev:0005 d:00007FC63B17C530

用nginx-1.4.7+nginx_tcp_proxy_module没有遇到这个问题,请大神看看是不是有变更或者是否有解决思路、方法?