浏览 3.5k
我想自己写一个stream模块,能捕获tcp/udp中的报文数据。我直接挂载,
NGX_STREAM_ACCESS_PHASE或者
NGX_STREAM_PREREAD_PHASE阶段(两种我都尝试了一下),下断点在自定义模块的handler中,gdb在第一次连接时会断下来,但是如果gdb 输入continue之后,已建立连接的tcp就再断不下来。
我编译好之后,运行起来,断点下在自定义部分

ngx_stream_access_control_handler就是我自定义的模块
其中执行的nginx.conf代码如下,只是一个简单的tcp/udp转发效果
daemon off; # default on
master_process off;
pid objs/nginx.pid;
error_log objs/error.log debug;
load_module objs/ngx_stream_access_control_module.so;
stream {
upstream tcp_server{
server 0.0.0.0:8060;
}
upstream udp_server{
server 0.0.0.0:8050;
}
server{
ALLOW all;
listen 8070;
proxy_pass tcp_server;
}
server{
ALLOW all;
listen 8040 udp;
proxy_pass udp_server;
}
}然后我本地开启一个udp的服务
nc -unlvvp 8050在另一个shell开一个nc来监听这个服务
nc -u 192.168.191.132 8040此时时第一次发送消息就可以被我的handler捕捉到,从而断下来

gdb中显示如下

断在了断点处,然后可以通过命令p *s->connection->buffer看到udp发送的内容

然后我这个模块目前是空的,直接返回

但是我udp客户端再次发送报文,断点没有断下来,直接发送到服务端了

如果udp此时接受另一个客户端,nginx又会断下来,然后第一次断,后面又不断了,是为什么呢?nginx是只会对一个新的连接执行handler吗?
请问各位大哥,能不能教教我,我想在nginx写一个模块可以获取,处理其中的报文

按点赞数排序
按时间排序
我自己测试的话,发现在udp情况下,如果nginx.conf设置了proxy_timeout 1s,也就是udp会话维持1s或者不维持,则可以断下来,考虑到可能是nginx自带的会话维持导致这种结果
0
回答于2022-12-05 16:26
我重新安装了1.4.7版本,试了下,还是没有你说的现象。建议你重新试下,或者贴出你完整的配置文件,以及测试方法,咱们一次性彻底搞明白。
就我的经验来说,只有连续的if会出错,你上面列出的仅有1个if,通常不应该有问题,我也很好奇。
给你看下我的配置和运行结果:


开源版本身不支持 ftp,因为有alg的问题。
可以参考这个插件。
https://github.com/pei-jikui/nginx-alg。
微信公众号
加入微信群