nginx根据域名转发 nginx动态域名解析

8678008682024-03-25 14:39:0399域名知识

大家好,今天小编来为大家解答以下的问题,关于nginx根据域名转发,nginx动态域名解析这个很多人还不知道,现在让我们一起来看看吧!

nginx根据域名转发 nginx动态域名解析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次之后判定该服务异常,暂停转发该服务

nginx根据域名转发 nginx动态域名解析

注:

这个配置的示例是官方博客中的,看到这个配置时觉得有点奇怪,自己进行了模拟测试,测试的方案是在 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

nginx根据域名转发 nginx动态域名解析

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

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

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

10. Nginx实现反向代理

反向代理: reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式

Nginx除了可以为企业提供高性能的web服务之外,另外还可以将Nginx本身不具备的请求通过某种预定义的协议转发至其他服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

生成环境部署架构:

访问逻辑图:

Nginx反向代理http服务:

1. proxy_pass

2. proxy_hide_header field

修改前,响应报文头部会携带ETag信息

修改后ETag信息被隐藏

3. proxy_pass_header field

4. proxy_pass_request_body

5. proxy_pass_request_headers

6. proxy_set_header

由于proxy_set_header只是修改了请求报文的头部信息,添加了自定义的字段,因此,还需要在后端服务器修改日志定义格式,才能方便将客户端ip记录到日志信息中

注意1:通过set_proxy_header自定义变量只是给请求报文添加了一个自定义的字段,其字段值是人为根据系统内置变量设定的

注意2:这种方法,在多级代理的情况下,并不能将客户端ip,逐层的传给后端服务器,而是需要利用$proxy_add_x_forwarded_for变量实现

注意3:如果一定要使用proxy_set_header去传递客户端ip和每一层代理的ip地址,那么需要在每一层nginx代理都开启proxy_set_header,并且设置不同的自定义变量去引用nginx自带变量$remote_addr,这样每一级nginx都会记录上一级,也就包括客户端的ip地址,同时,在后端服务器的日志格式中,要添加多个nginx自定义的变量,这样也可以把客户端ip和中间经过的代理的ip全部传递给后端的服务器

proxy_add_x_forwarded_for实现多级代理ip地址透传示例:需要在每一级代理都开启

实验环境:

7.有关反向代理时间的几个参数

8. proxy_ignore_client_abort

9. hash表大小的设置

客户端----- http协议------- nginx(代理服务器,10.0.0.86)----- http--- apache(10.0.0.85)

客户端,通过访问nginx上定义的虚拟主机中的server_name域名,通过内部定义的location匹配规则,被转发到10.0.0.85服务器

代理服务器与后端服务器连接出现问题可能发生的报错:

如果后端服务器想把图片资源放到固定的目录下,也可以自定义,比如存到/var/www/html/static,那么nginx的location就要修改为如下:

缓存功能相关参数:

实验环境:

proxy_pass可以让Nginx将客户端请求转发至后端单台服务器,但是无法转发至特定的一组服务器,而且不能对后端服务器提供相应的服务器状态监测.

Nginx可以基于 ngx_http_upstream_module模块提供服务器分组转发,权重分配,状态监测,使用不同的调度算法等高级功能

关于ip_forward

注意:本实验过程要先关闭缓存

访问固定的URI会被调度到相同的服务器

如何设置nginx反向代理实现服务器瞬间故障转移

#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_temp_path/data0/proxy_temp_dir;

#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

proxy_cache_path/data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#轮询服务器,weight为服务器权重,与访问频率成正比,max_fails最大超时次数,fail_timeout服务器代理监听超时时间

upstream backend_server{

server 192.168.203.43:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.203.44:80 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.203.45:80 weight=1 max_fails=2 fail_timeout=30s;

}

server

{

listen 80;

server_name www.yourdomain.com 192.168.203.42;

index index.html index.htm;

root/data0/htdocs/www;

location/

{

#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_cache cache_one;

#对不同的HTTP状态码设置不同的缓存时间

proxy_cache_valid 200 304 12h;

#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内

proxy_cache_key$host$uri$is_args$args;

proxy_set_header Host$host;

proxy_set_header X-Forwarded-For$remote_addr;

proxy_pass http://backend_server;

expires 1d;

}

}

Nginx反向代理配置参数释义:

1.proxy_set_header(设定header)

2.proxy_hide_header(隐藏header)

3.proxy_pass_header(通过header)

4.proxy_connect_timeout(代理连接超时)

5.proxy_send_timeout(代理发送超时)

6.proxy_read_timeout(代理接收超时)

7.proxy_temp_file_write_size(设定缓存文件夹大小)

8.proxy_buffer_size(代理缓冲大小)

9.proxy_buffers(代理缓冲)

10.proxy_busy_buffers_size(高负荷下缓冲大小)

11.proxy_ignore_client_abort(不允许代理端主动关闭连接)

下面就分步介绍基于Nginx反向代理的upstream对服务请求转发与分配5种方式,实际生成环境综合设置,为了便于说明问题分不同方式来说明,nginx反向代理实际生成环境的应用,请参考《如何设置nginx反向代理实现服务器瞬间故障转移》文章开篇部分的proxy.conf配置。

nginx的upstream目前支持5种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream bakend{

ip_hash;

server 192.168.203.14:88;

server 192.168.203.15:80;

}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend{

server 192.168.203.14:88;

server 192.168.203.15:80;

fair;

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend{

server squid1:3128;

server squid2:3128;

hash$request_uri;

hash_method crc32;

}

upstream bakend{

#定义负载均衡设备的Ip及设备状态

ip_hash;

server 127.0.0.1:9090 down;

server 127.0.0.1:8080 weight=2;

server 127.0.0.1:6060;

server 127.0.0.1:7070 backup;

}

在需要使用负载均衡的server中增加:

proxy_pass bakend;

每个设备的状态设置为:

1.down表示单前的server暂时不参与负载

2.weight默认为1.weight越大,负载的权重就越大。

3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only设置为On可以讲client post过来的数据记录到文件中用来做debug

client_body_temp_path设置记录文件的目录可以设置最多3层目录

location对URL进行匹配.可以进行重定向或者进行新的代理负载均衡

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