• 蒋荣杰
    2019-03-01
    老师好,我现在通过rewrite_by_lua来生成需要跳转的地址,然后proxy_pass来进行反向代理跳转时进入了死循环,这是为什么呢?怎么去解决呢?

    作者回复: 信息太少

    
     1
  • 全宏
    2019-01-13
    老师,请问一下,nginx作为四层反向代理时。
    配置文件的worker_connections如果设置为200000,那么nginx作为客户端向上游服务器发起tcp连接,是会有端口65535个的限制。解决办法可以使用虚拟网卡或多网卡。
    那请问多网卡实现tcp四层反向代理时,nginx的配置文件里面涉及的stream和server字段内容应该怎么书写?能否写个demo?比如有三张内网网卡,三个上游服务器。
    谢谢!

    作者回复: 两步:
    1、使用proxy_bind来绑定source ip,由于指令值支持变量故可以实现多网卡。例如proxy_bind $mylocalip;
    2、为实现第1步中的变量,需要你定一个规则。例如根据客户端IP做一次选择映射,(注意,upstream_addr变量不能使用,因为做proxy_bind时还未生成此变量),此时可以用split_client模块定义新变量,而新变量值为虚拟网卡IP,例如:
    split_clients "${remote_addr}" $mylocalip {
                    50% "127.0.0.1:49001";
                    * "127.0.0.1:49002";
            }

    
     1
  • 狼猫
    2019-09-12
    老师您好,怎么用域名做四层负载均衡?

    作者回复: 你是说多台上游服务以同一个域名配置在nginx上吗?
    DNS协议不影响四层负载均衡,唯一需要注意的是nginx为提升性能会缓存域名与IP,可通过配置适合的超时时间来让nginx定期更新缓存。

    
    
  • 黄云龙
    2019-08-11
    stream 和 http 模块可以同时使用吗?可以共享数据吗?

    作者回复: 可以

    
    
  • Man
    2019-07-25
    老师好,目前碰到一个生产问题,使用的stream模块做的4层负载。在stream域内设置了日志格式
    log_format proxy '$remote_addr [$time_local] '
                             '$bytes_sent $bytes_received '
                             '$session_time "$upstream_addr" '
                             '$upstream_connect_time';
    目前问题现象是请求过来,等了将近1分钟才有结果返回,整个链路是走的socket的xml报文。
    我从日志看到session_time为55秒,upstream_connect_time很短,一般是0.0x秒。
    目前无法判断到底是请求过来接收包体消耗了过长时间,还是上游服务器收到请求后因为服务本身问题导致请求堵塞了。有什么好的思路吗?
    因为网络有波动,这种超长处理时间只是偶发,不是常态,it这边必须要给个交代,脑壳疼啊。
    展开
    
    
  • 霡霂
    2019-06-14
    老师您好!
    http下的server块中下有server_name指令,可以通过正则来匹配客户端的域名。因此,我可以通过正则来配置一个server块,以达到同时匹配多个域名,这样就不用配置多个server块了
    而stream下的server貌似没有类似server_name这类指令,如果想到达上述(http下server块)的效果,是否有什么方式可以解决呢?(因为业务需求,不同一个服务配置一个server,因为太多了)

    作者回复: 1、http能匹配server_name的原因是,Nginx必须按HTTP协议来处理协议,及它很明确接收到的是request,发送的是response,而request的格式RFC规范中定义的很清楚;
    2、stream处理的是TCP协议,它不应该假定处理的是HTTP协议,否则我们大可使用HTTP即可。
    3、stream可以处理TLS协议,而TLS协议里有extension中含有域名,可以通过变量取到这个域名。
    这三个协议的特性可以参考我的课程《Web协议详解与抓包实战》

    
    
  • Geek_98b751
    2019-06-01
    老师,您好!我想问一下,nginx可以做四层负载,那么它可以做 netty的负载吗?

    作者回复: 可以

    
    
  • pf
    2019-05-05

    刘全宏

    老师,请问一下,nginx作为四层反向代理时。
    配置文件的worker_connections如果设置为200000,那么nginx作为客户端向上游服务器发起tcp连接,是会有端口65535个的限制。解决办法可以使用虚拟网卡或多网卡。
    那请问多网卡实现tcp四层反向代理时,nginx的配置文件里面涉及的stream和server字段内容应该怎么书写?能否写个demo?比如有三张内网网卡,三个上游服务器。
    谢谢!

    作者回复: 两步:
    1、使用proxy_bind来绑定source ip,由于指令值支持变量故可以实现多网卡。例如proxy_bind $mylocalip;
    2、为实现第1步中的变量,需要你定一个规则。例如根据客户端IP做一次选择映射,(注意,upstream_addr变量不能使用,因为做proxy_bind时还未生成此变量),此时可以用split_client模块定义新变量,而新变量值为虚拟网卡IP,例如: 
    split_clients "${remote_addr}" $mylocalip {
                    50% "127.0.0.1:49001";
                    * "127.0.0.1:49002";
           }


    如上所说可以让nginx选择出口ip, 那么有没有什么方法获取到本机ip地址,而不是写死
    展开

    作者回复: 获取本地地址可以使用server_addr变量,详见第74课

    
    
  • 有点意思
    2019-04-01
    老师 你好 项目中用的nginx反向代理tcp
    现在有个问题 在程序调用到ngx_stream_write_filter的时候 这时候可以拿到应用层报文
    现在需要在这个阶段拿到以太网帧 请问怎么才可以做到

    作者回复: 目前没有nginx模块获取frame信息并以变量的方式提供!
    这门课程不介绍如何开发nginx模块,它需要C语言功底及linux系统知识,门槛较高。如果确实需要了解,可以看《深入理解Nginx:模块开发与架构解析》一书。
    当然,还有一个方案是用openresty,从lua socket对象中获取frame信息。建议阅读完第六部分课程再看。

    
    
  • 蒋荣杰
    2019-03-01
    我现在的需求是想通过不同的场景反向代理到不同的服务器,代码如下,
    set $passURL 'iovGateWay';
    rewrite_by_lua_file lua/graySet.lua;
    proxy_pass http://$passURL;
    然后在graySet.lua文件中根据不同场景,赋值了不同的passURL,
    if grayFlag == "0" then
        ngx.log(ngx.ERR,"======nogray:"..grayFlag);
        ngx.passURL = 'iovGateWay';
        --ngx.var.iovGateWayURL = 'iovGateWay';
    end
    if grayFlag == "1" then
        ngx.log(ngx.ERR,"======gray:"..grayFlag);
        ngx.passURL = 'iovGateWayOfTest';
        --ngx.var.iovGateWayURL = 'iovGateWayOfTest';
    end
    但是没有达到最终效果。请老师帮忙指导下这样实现有没有问题。
    展开

    作者回复: 变量在openresty中,要用ngx.var.passURL 而不是ngx.passURL

    
    
我们在线,来聊聊吧