events { worker_connections 1024; # multi_accept on; } worker_processes 1; error_log logs/error.log debug; stream { upstream dns { server 192.168.5.2:53; } server { listen 127.0.0.1:5353 udp; proxy_responses 1; proxy_timeout 20s; proxy_pass dns; error_log logs/dns.log; } upstream udp_echo { server 127.0.0.1:8071 max_fails=10 fail_timeout=10s; } server { listen 127.0.0.1:8070 udp; proxy_responses 20; proxy_timeout 200s; proxy_pass udp_echo; proxy_connect_timeout 600s; error_log logs/udp.log warn; content_by_lua_block { local udpsock = ngx.req.udp_socket() if not udpsock then ngx.log(ngx.WARN, "no socket") return end udpsock:settimeout(9000) udpsock:send("udpsock:send") ngx.say("hello server") local data, err = udpsock:receive(5) if not data then ngx.say("failed to read a packet: ", err) return end ngx.say("successfully read a packet: ", data) ngx.flush(true) } } upstream tcp_echo { server 127.0.0.1:5355 max_fails=0 fail_timeout=10s; } server { listen 127.0.0.1:5354 so_keepalive=on; proxy_responses 20; proxy_timeout 200s; proxy_pass tcp_echo; proxy_connect_timeout 600s; error_log logs/tcp.log warn; content_by_lua_block { local tcpsock = ngx.req.socket(true) if not tcpsock then ngx.log(ngx.WARN, "no socket") return end tcpsock:settimeout(9000) tcpsock:send("tcpsock:send") ngx.say("hello server") local reader = tcpsock:receiveuntil("exit\n") while true do local data, err, partial = reader(5) if not data then if err then ngx.say("failed to read the data stream: ", err) break end ngx.say("read done") break end ngx.say("read chunk: ", data) end ngx.flush(true) } } }