nginx域名转发 nginx根据域名转发

8678008682024-03-27 09:26:1367域名知识

大家好,今天来为大家解答nginx域名转发这个问题的一些问题点,包括nginx根据域名转发也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

nginx域名转发 nginx根据域名转发Nginx转发+反向代理实现跨域接口转发

最近工作遇上业务交接不彻底还有一些乱七八糟原因,导致我需要将几个接口的请求转发到新团队负责的域名下。

参考文档:

https://blog.csdn.net/yeguxin/article/details/94020476

nginx域名转发 nginx根据域名转发

https://liguangming.com/nginx-return-tips

https://segmentfault.com/a/1190000018163817

主要是为了记录自己工作中解决的一些问题,所以笔记就简单一些,涉及到工作的一些具体数据就不记录了

nginx域名转发 nginx根据域名转发

原域名:soa.api.local

目标域名:newsoa.api.local

方法名:functionName

第一版:

出于偷懒的方式,直接选择return进行跳转

结果通过Http请求返回的是字符串

"http://newsoa.api.local/functionName?body={"id":770080,"bid":9}¶m1=param1¶m2=param2"

第二版:

使用rewrite进行重定向

但是有点问题,在浏览器中可以看到跳转到新的域名了,但是打开开发者工具会看到有两次请求,第一次是对原域名soa.api.local的请求,返回的HttpCode为302。第二次请求为重定向后的请求。

所以如果客户端跟踪重定向,那根本就获取不到第二次请求的数据。

第三版

使用rewrite和反向代理实现

终于达到我要的效果了,客户端能保持当前链接不变的情况下获取到重定向后的数据。

nginx根据域名转发

如今docker使得本地部署服务越来越容易了,例如本人就使用了docker部署了gitlab-ce服务。但是对局域网的其他用户希望是通过gitlab.nathan.com进行访问,这就意味着gitlab服务需要部署在80端口上。但是其他服务也需要这样,即也需要80端口。多个服务不可能同时暂用同一个端口,但是可以通过nginx转发。比如A服务是7080端口,对应的域名是a.center.com;B服务对应的端口是6080端口,域名是b.center.com。nginx更具域名进行转发到不同端口上。

ngxin配置:

备注:现在很多路由器都支持修改hosts,比如小米路由器、华硕<梅林>路由器等。

nginx只用一个公网端口转发多个内网服务

  一个常见的问题,生产环境的一台有公网ip的服务器,为了安全起见,运维只给开一个端口,于是考虑用nginx根据url的前缀路径来转发到不同服务。例如:

以springboot工程为例,我们自己的web服务一般都会通过设置

来给该服务的所有url设置一个统一的前缀路径/xxxxxx。这时候nginx就可以将所有带有前缀/xxxxxx的请求转发到该服务。这是一个很简单的事。

  问题是有很多第三方服务,例如kafka manager,他是没有这样的前缀的,假设kafka安装在 192.168.0.182机器上,kafka manager的访问地址就是 http://192.168.0.182:3000,我们当然可以在首次访问时通过地址 http://192.168.0.182:3000/kafka让nginx根据/kafka识别到这是kafka manager服务并转发到 http://192.168.0.182:3000,但是我们打开kafka manager页面上的链接时是不会有我们自己添加的/kafka前缀的,上面的方法失效。

  我们都知道http服务是无状态的,就像上面所说即使访问了kafka manager的主页,点击主页上按钮发起的请求也无法被识别为kafka manager请求。但是web服务绝大多是都是需要有状态的,主要有session/cookie、token两种方式来解决这个问题。也可以用来解决上面的问题。

在nginx中配置:

  这时候又有一个问题,使用同样的ip:port来访问这些服务,在浏览器看来所有的服务都是一个域的,他们的cookie就会是同一个cookie,这时候nginx没办法根据cookie的不同转发到不同的服务。

  我们想到了给每个服务配置一个域名(没有那么多公网域名可用,就在本地hosts文件配置了),产生跨域的效果,让不同的服务有独立的cookie。

  从来都是解决跨域问题,从没想过有一天要主动跨域

  如果配置了域名,完全可以让nginx根据域名来做识别转发,为什么要用cookie呢?如果你都是配置了公网域名,那确实可以这么干,但是我们是改的hosts文件,保不齐谁的域名就写错了,或者因为只是本地hosts文件的修改根本就没必要统一域名,这时候根据域名做转发就不行了。

  kafka manager的访问是不需要认证的,暴露在公网上、面向所有人是一件可怕的事,我们是设置了VPN和访问白名单。

nginx动态域名解析

原文链接:

https://priesttomb.github.io/%E6%8A%80%E6%9C%AF/2020/05/17/nginx-cached-dns-server-resolvered-answer/

接上篇文章中提到的 Nginx解析域名地址的问题,用一句话描述就是“proxy_pass中如果配置的是域名地址,Nginx只有在 start/ restart/ reload时,才会连接一次域名服务器解析域名,缓存解析的结果,后续则不会根据解析结果的 TTL进行自动更新”,如果遇到了域名地址配置有多个 IP,且还在动态变化,那就会出现 Nginx把请求转发到一个过期的 IP地址的情况,连接超时的报错日志类似这样:

这个说法在官方的一篇 2016年的博客中有提到:

除此之外,除了一些分析源码的网络文章,暂时还没有找到其他的官方文档中说到这个细节

在 upstream中可以对上游的服务器进行更详细的设置,解决 DNS缓存的问题可以在 upstream中指定需要的负载均衡算法,比如 least_conn,并指定 max_fails,以实现调用失败 N次之后判定该服务异常,暂停转发该服务

注:

这个配置的示例是官方博客中的,看到这个配置时觉得有点奇怪,自己进行了模拟测试,测试的方案是在 hosts文件中配置一个模拟的域名与三个 IP地址,其中两个 IP是正确的,另一个是内网不存在的 IP,测试的结果就是 Nginx始终会将请求转发到那个错误的 IP去,日志中一直能看到超时的报错,配置的 max_fails仿佛没有任何作用(有补充配置了 fail_timeout,也尝试配置了 proxy_next_upstream、 proxy_next_upstream_timeout和 proxy_next_upstream_tries)

不清楚用 hosts配置的方式是不是必然会出现这样的情况,因为目前没条件测试真正想要的场景,所以不敢说博客中的这种配置是错的【如果以后碰巧有条件能测试验证,再回头来更新

最初学习 Nginx的时候测试过 max_fails这个配置,当时在 upstream里配置的都是一些 IP地址的上游服务。再次按 IP地址进行测试,在 upstream中配置两个正确的 IP地址和一个错误的 IP地址,发现这样的配置就是能生效的,失败一定次数之后(实际失败的次数比设置的 max_fails多,不清楚什么原因),Nginx在 fail_timeout时间内就不再转发请求到那个错误的 IP

resolver的配置详情可看官方文档,示例的配置是指定 DNS服务器 10.0.0.2,指定 DNS解析的有效时间为 10秒,按博客《Nginx动态解析upstream域名》中博主的测试,不是说 Nginx每过 10秒会自己重新调一次 DNS解析,而是有请求转发时才检验一次有效期是否过期

不配置 valid选项时,V1.1.9之后的 Nginx默认会使用 DNS解析结果中的 TTL

在 proxy_pass中使用变量,带来的作用就是在 TTL过期时能再次调用 DNS解析,从而解决一直使用缓存结果的问题

这大概是目前官方原版唯一解决 DNS缓存的解决方案了,带来的弊端也如《Nginx动态解析upstream域名》的博主所说,不能使用 upstream模块特有的相关配置

Nginx Plus版有更好的配置解决这些问题,另外使用 Lua插件或许也能更完美的解决这个问题,暂时就没什么研究了

文章分享结束,nginx域名转发和nginx根据域名转发的答案你都知道了吗?欢迎再次光临本站哦!

本文链接:https://aiming.cc/index.php/post/1777.html 转载需授权!

分享到:
转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!