浏览 3.3k
我想自己写一个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
估计配置一个 server 证书的位置写好 然后 写个upstream 到时候 代理到upstream 上
不就可以了
微信公众号
加入微信群