Netty服务如何使用Nginx代理转发请求并获得原始IP

这篇具有很好参考价值的文章主要介绍了Netty服务如何使用Nginx代理转发请求并获得原始IP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Nginx配置

Nginx启用stream模块,示例如下:

stream {
    upstream netty{
     server remote:8080;
    }
    server {
        listen       	8080;
        proxy_pass      netty;
        proxy_protocol  on;
    }
}

示例,代理远端8080的netty服务。
注意,获得原始客户端的IP关键配置在于:proxy_protocol on;这一行配置。如果不配置,在netty服务端是无法获得原始客户端ip,但是配置上之后,netty需要调整代码。

Netty配置

代理http协议的时候,可以通过增加X-Forwarded-For请求头传递。
然而TCP采用另一种方式,每次在建立连接的时候发送一个非常小的报告头信息,提供这些数据,注意也只发送一次。

我们在用Netty的时候,是需要提供相应的编解码器的,因此对于这个代理头Netty内置的有相应的Decoder.
类路径:io.netty.handler.codec.haproxy.HAProxyMessageDecoder

配置示例:

        protected void initChannel(SocketChannel ch) throws Exception {
            ChannelPipeline pipeline = ch.pipeline();
            if (enableProxy) {
                pipeline.addLast("proxyDecoder", new HAProxyMessageDecoder());
            }
            pipeline.addLast("frameDecoder", new FrameDecoder());
            pipeline.addLast("frameEncoder", new FrameEncoder());
            pipeline.addLast("protocolEncoder", new ProtocolEncoder());
            pipeline.addLast("protocolDecoder", new ProtocolDecoder());
            pipeline.addLast("channelHandler", new ChannelHandler());
        }

关键就是:

pipeline.addLast("proxyDecoder", new HAProxyMessageDecoder());

这个配置。
放的位置和顺序如上面的示例即可。当我们第一次获得请求头的时候,需要拿到原始的IP等信息,保存下来:

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HAProxyMessage) {
            HAProxyMessage proxyMessage = (HAProxyMessage) msg;
            // 原始IP
            proxyMessage.sourceAddress();
            // 原始端口
            proxyMessage.sourcePort();
        } else {
            // 业务处理
        }
    }

源码说明

可能有的同学奇怪HAProxyMessageDecoder这个解码器放在最上面,对于正常请求有影响没?
答案是没有影响。

正如前面说的,是每次建立连接的时候发送且只发送一次,我们可以看下,HAProxyMessageDecoder的decode逻辑:

    @Override
    protected final void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        // determine the specification version
        if (version == -1) {
            if ((version = findVersion(in)) == -1) {
                return;
            }
        }

        ByteBuf decoded;

        if (version == 1) {
            decoded = decodeLine(ctx, in);
        } else {
            decoded = decodeStruct(ctx, in);
        }

        if (decoded != null) {
        	// 注意这里,如果decode成功,会设置finished为true
            finished = true;
            try {
                if (version == 1) {
                    out.add(HAProxyMessage.decodeHeader(decoded.toString(CharsetUtil.US_ASCII)));
                } else {
                    out.add(HAProxyMessage.decodeHeader(decoded));
                }
            } catch (HAProxyProtocolException e) {
                fail(ctx, null, e);
            }
        }
    }

留意注释里强调的:finished变量,接着往下看:

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);
        if (finished) {
        	// 后面都移除了
            ctx.pipeline().remove(this);
        }
    }

解码成功后,后面就将它移除了,所以不用担心后面读取正常请求数据的时候会被这个decoder影响到。文章来源地址https://www.toymoban.com/news/detail-459724.html

到了这里,关于Netty服务如何使用Nginx代理转发请求并获得原始IP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nestjs:nginx反向代理服务器后如何获取请求的ip地址

    问题:         如题 参考:         nodejs+nginx获取真实ip-腾讯云开发者社区-腾讯云         「转」从限流谈到伪造 IP nginx remote_addr          解决办法: 1.设置nginx         对于代理部分,对http header添加Host、X-Real-IP、X-Forwarded-For(最重要)          2.nestjs使用

    2024年02月13日
    浏览(57)
  • nginx 反向代理服务器端口转发问题

    先介绍一下项目背景,公司里有个外包Saas项目,这里假设为A项目( 前后端不分离 );项目架构大概如下;但是项目部署到生产环境时,那台服务器80端口被其他应用占用了(我尼玛...),nginx监听端口那边只能监听其他端口了,比如监听:18000,通过nginx反向代理将18000端口转发到

    2024年02月04日
    浏览(56)
  • nginx如何代理转发第三方https网站

    这里准备官方nginx镜像 上诉示例中,如果是https,proxy_ssl_session_reuse ,proxy_ssl_server_name ,这两个没有会报ssl SSL_do_handshake() failed SSL_do_handshake() failed (SSL: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:SSL alert number 40) while SSL handshaking to upstream, client: 127.0.0.1, server: 127

    2024年02月13日
    浏览(54)
  • nginx 如何将 https 请求转发到 http

    网站之前是 https 的,通过 nginx 设置好了,现在不想用 https 了,但发散到外界的一些网址还是 https 的,此时只能通过 nginx 去转发 https 请求到 http 才能实现之前的链接能正常访问。 具体设置如下: https 的其它设置不需要动,只需要在 server 字段添加一条:

    2024年02月11日
    浏览(59)
  • 使用nginx实现请求转发的功能

    nginx(反向代理服务器)主要功能 请求转发 负载均衡 动静分离 配置nginx,实现请求转发的功能 找到nginx配置文件 在nginx.conf中进行配置 (1)最好将nginx默认的80端口修改为81 (2)配置nginx转发规则 (3)具体配置 修改config/dev.env.js中的BASE_API 重启nginx

    2024年02月11日
    浏览(77)
  • Nginx使用 代理转发Windows远程桌面RDP功能

    一、业务需求 B是服务器192.168.31.200,A电脑192.168.31.100是跳板机,只有A这台电脑可以远程桌面访问B服务器。现在需要通过一台远程这台跳板机,间接实现对服务器B的远程访问。 二、配置nginx 在A电脑上安装Nginx,配置文件添加如下配置项: 注意:如果有多个stream模块需要设置

    2024年02月15日
    浏览(65)
  • Nginx接收Http协议请求转发使用Https协议

    公司使用阿里的apigateway,规定不太友好,同是SIT环境,A系统的SIT1环境居然不能调用B系统的SIT2环境的接口。因为各个系统之间部署的SIT环境数量不同A系统可能只有1套,B系统可能有8套,这样的话,可能会随时切换调用B系统的环境,管理员不允许,于是想着用Nginx做下转发。

    2024年02月08日
    浏览(65)
  • 如何构建多域名HTTPS代理服务器转发

    在当今互联网时代,安全可靠的网络访问是至关重要的。本文将介绍如何使用SNI Routing技术来构建多域名HTTPS代理服务器转发,轻松实现多域名的安全访问和数据传输。 SNI代表\\\"Server Name Indication\\\",是TLS协议的扩展,用于在HTTPS握手过程中传递目标服务器的域名信息。通过SNI R

    2024年02月10日
    浏览(51)
  • 【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题

    使用Nginx给minio做端口代理转发 进入管理界面查看桶一直显示loading问题 按F12查看了一下,查看桶发起的是 websocket 请求。 在 nginx配置 上加上websocket支持 我的完整配置 记得重载nginx配置才生效    

    2024年02月11日
    浏览(74)
  • 【netty】java如何作为websocket客户端 对服务端发起请求

    是的 本文介绍java如何作为客户端 发起websocket请求 博主不做标题党 不会服务端客户端分不清就写个标题 乱写文章 为什么会使用java作为websocket客户端? 虽说websocket协议 本意是web与服务端之间的通讯协议,那假设有一天 我们的供应商 或者是甲方大爷 只提供了websocket接口呢?

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包