浏览 659
我想自己写一个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
没办法完全不受影响的,因为mirror是子请求,当子请求未结束时,主请求消耗的内存至少是无法释放的。你可以尝试在/mirror里,把超时时间大幅度调低,包括connect/read/send,再压下看看。
不应该这么来弄,应该是结合lua/njs来做,通过njs/lua来判断文件是否存在
error_log stderr notice;
daemon off;
events { }
http {
include /usr/local/openresty/nginx/conf/mime.types;
server {
listen 80;
location @image_server {
content_by_lua_file "file_judge.lua";
}
location ~ ^/images/(?<sig>[^/]+)/(?<size>[^/]+)/(?<path>.*\.(?<ext>[a-z_]*))$ {
root cache;
set_md5 $digest "$size/$path";
try_files /$digest.$ext @image_server;
}
}
}
-- make sure the file exists
local file = io.open(source_fname)
if not file then
return_not_found()
end
file:close()
lua里面去判断文件存不存在