基于 Nginx 的动态代理

server

{

listen 80;

server_name domain.com;

location /app1 {

proxy_redirect off;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://192.168.10.38:3000/app1;

}

access_log logs/domain.com.access.log;

}

在以上实例中,Nginx 配置完成后,即可将 http://domain.com/app 的所有请求代理转发到 http://192.168.10.38:3000/app1 地址,这样就可以实现针对 app1 的从外网访问内网应用的代理转发功能。此时 app1 对于外网的访问地址就变成了 http://domain.com/app 。

通过使用代理服务器, 所有的应用将拥有统一域名 ,而通过 二级目录区分 不同的应用。

在 Apache 中同样可以采用类似的策略进行代理转发,本文中主要以 Nginx 作为实例。

在多个接入多个应用的情况下,只要按照上述实例中的配置,为不同的应用分配不同的二级目录,即可实现向不同应用进行代理转发。这样就可以解决文章开始提出的问题。

但是这一解决方案也存在问题:

  • 当需要新增/修改/删除应用的代理转发配置时,需要人工修改配置文件,并重启代理转发服务器,这将导致服务的暂时不可用。

  • 当接入应用较多时,配置文件将越来越大,对用人工维护造成极大的不便。

  • 当代理转发服务器进行集群化部署时,每次对配置文件的更新,都需要更新所有代理转发服务器,并进行重启,这将增大维护的风险。

针对以上的问题,需要对该访问进行进一步改进。

使用动态代理


如果能够使反向代理服务器动态的通过集中的配置数据更新针对应用的代理配置,就可以解决上述方案中存在的问题。

经过研究分析,本文中提出 动态代理 方案,流程如下:

当请求进入反向代理服务器时,反向代理服务器将分析进入的请求 URL ,识别 URL 中的二级目录(用于区分不同的应用),然后使用该二级目录作为应用标识,到代理配置数据数据中进行查询,获得代理地址的返回结果,然后将该请求转发到对应的应用服务器。

同时,管理人员可以通过特定的管理端,对代理配置数据进行 CRUD 操作,方便管理人员对代理应用配置的实时管理。

通过以上流程,即可实现在不中断服务的情况下,动态修改代理配置。同时也可以确保集群化的反向代理服务器同步更新,都可以获得最新的配置数据。

使用动态代理方案,即可以解决在文章开头提出的问题。

基于 Nginx 实现动态代理


为了实现动态代理方案,需要在反向代理服务器中增加定制的功能。针对这一目的,研究了目前主流的反向代理服务器 Apache 和 Nginx ,结论如下:

Apache 和 Nginx 均可以增加定制的模块以实现定制的功能。但是 Apache 目前必须使用 C 语言按照 Apache 的要求编写模块,这对于开发者要求相对较高。而 Nginx 同样可以使用 C 语言开发扩展模块,但除此之外,目前已有针对 Nginx 开发的 Lua 语言解释器模块,即可以在 Nginx 的配置文件中直接调用 Lua 语言开发的脚本程序,这种方式极大的降低了定制功能开发的难度。因此,采用 Nginx 作为反向代理服务器,使用 Lua 语言作为定制功能开发语言,进行动态代理功能实现。

同时,由于反向代理服务器需要处理大量的代理请求,因此会频繁的读取反向代理配置数据。基于这一情况,选用 Redis 作为数据库,利用其高性能的数据读写,支撑代理配置数据的频繁访问。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
家。

[外链图片转存中…(img-SSDWjGBK-1711933900400)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值