大家好,今天小编来为大家解答以下的问题,关于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次之后判定该服务异常,暂停转发该服务

注:
这个配置的示例是官方博客中的,看到这个配置时觉得有点奇怪,自己进行了模拟测试,测试的方案是在 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插件或许也能更完美的解决这个问题,暂时就没什么研究了
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动态域名解析的答案你都知道了吗?欢迎再次光临本站哦!