回答
收藏
分享
举报
NGINX 4层代理的问题
提问于2020-06-03 16:56

浏览 1.2k

各位大佬:


    有个需求:4层代理中stream中server语句块中,proxy_pass代理的后端服务器的IP地址如何设置为变量?

例如:访问http://www.myproxy.com?proxy=192.168.10.10:8099,按照下文配置变为proxy_pass 192.168.10.10:8099

server {
        listen 3301;
        proxy_connect_timeout 5s;
        proxy_timeout 300s;
        set $backend_pass $arg_proxy;
        proxy_pass $backend_pass;

        }


已修改于2023-03-17 02:12



写下您的回答
发表回答
全部回答(1)

按点赞数排序

按时间排序

配置乱了,$arg_是HTTP里的变量,stream中没有arg_变量

赞同

2

回复举报

回答于2020-06-04 09:17



回复陶辉
回复
提问者
Ruier
这家伙很懒还未留下介绍~
0
文章
2
问答
0
粉丝
相关问答

有两种办法:

1、通过proxy_protocol协议

这个协议是在TCP字符流的最前端,添加一串描述真实IP地址的消息。其中,1.0协议是ASCII字符串消息,如果你用tcpdump抓包,很容易看到。2.0是二进制格式,也比较容易分析。

ngx_stream_proxy_module模块的proxy_protocol指令,就是用于设置后端连接的。当然,后端要能够处理这个协议才行。

如果后端也是Nginx,那么可以在listen指令后,添加proxy_protocol选项,也能拿到真实IP。

具体你可以参考我这门课《Nginx核心知识100讲》第113节课(可以免费学4节课):https://time.geekbang.org/course/detail/100020301-76735

2、通过修改IP报文中source ip实现

这种方法需要修改服务器上的网关,比较麻烦,副作用很大,你可以参考我这篇文章中,如何获取UDP中的真实IP地址:https://www.nginx-cn.net/article/76

点赞 0
浏览 2.6k

没有回答,我就只能自己回答了。

查了下代码,进行gdb跟踪调试后发现:这个主要是因为,每个worker单独维护一个前后端 “链路”关联的四元组信息,在多个worker的情况下,不同的worker保存“链路”关联信息相互独立,彼此不共享。因此即使是相同的IP和端口发来的消息,只要是分配到不同的worker进行处理,都有可能查不到之前的“链路”关联信息,从而无法复用。


解决办法:

1. 单worker配置(性能可能偏低)

2. 修改代码,使用共享内存保存已有的前后端“链路”关联信息,不同worker之间共享结果

点赞 0
浏览 336