详解:Nginx反向代理及后端检测模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解:Nginx反向代理及后端检测模块相关的知识,希望对你有一定的参考价值。

实验环境:

nginx

shell?>?yum?-y?install?gcc?gcc-c++?make?wget?zlib-devel?pcre-devel?openssl-devel
shell?>?wget?http://nginx.org/download/nginx-1.12.2.tar.gz
shell?>?tar?zxf?nginx-1.12.2.tar.gz;?cd?nginx-1.12.2
shell?>?./configure?--prefix=/usr/local/nginx-1.12.2?&&?make?&&?make?install

后端服务器

shell?>?curl?192.168.10.24:8080
welcome?to?tomcat1
shell?>?curl?192.168.10.24:8081
welcome?to?tomcat2
shell?>?curl?192.168.10.24:8082
welcome?to?tomcat3

好了,三台后端服务器已经启动,分别监听 8080、8081、8082,分别返回 1、2、3

ngx_http_proxy_module
ngx_http_upstream_module

shell?>?vim?conf/nginx.conf

user??nobody;
worker_processes??1;

pid????????logs/nginx.pid;
events?{
????worker_connections??1024;
}

http?{
????include???????mime.types;
????default_type??application/octet-stream;

????upstream?ls?{
????????server?192.168.10.24:8080?weight=1?max_fails=3?fail_timeout=20s;
????????server?192.168.10.24:8081?weight=2?max_fails=3?fail_timeout=20s;
????????server?192.168.10.24:8082?weight=3?max_fails=3?fail_timeout=20s;
????}

????server?{
????????listen??80;

????????location?/?{
????????????proxy_pass?http://ls;
????????}
????}
}

这是一个最简配的 Nginx 配置文件,定义了一个负载均衡池,池中有三台服务器,权重分别是 1、2、3 ( 越大越高 )

最大失败次数 3 次,超过 3 次失败后,20 秒内不检测。

当用户访问该 IP 的 80 端口时,被转发到后端的服务器。下面是一些反向代理的配置。

#?故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器
proxy_next_upstream?http_500?http_502?http_503?error?timeout?invalid_header;

#?设置后端服务器获取用户真实IP、代理者真实IP等
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;

#?用于指定客户端请求主体缓存区大小,可以理解成先保存到本地再传给用户
client_body_buffer_size?128k;

#?表示与后端服务器连接的超时时间,即发起握手等侯响应的超时时间
proxy_connect_timeout?90;

#?表示后端服务器的数据回传时间,即在规定时间之后端服务器必须传完所有的数据,否则?Nginx?将断开这个连接
proxy_send_timeout?90;

#?设置?Nginx?从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx?等待后端服务器的响应时间,其实是?Nginx?已经进入后端的排队中等候处理的时间
proxy_read_timeout?90;

#?设置缓冲区大小,默认该缓冲区大小等于指令?proxy_buffers?设置的大小
proxy_buffer_size?4k;

#?设置缓冲区的数量和大小。Nginx?从代理的后端服务器获取的响应信息,会放置到缓冲区
proxy_buffers?4?32k;

#?用于设置系统很忙时可以使用的?proxy_buffers?大小,官方推荐大小为?proxu_buffers?的两倍
proxy_busy_buffers_size?64k;

#?指定?proxy?缓存临时文件的大小
proxy_temp_file_write_size?64k;
shell?>?/usr/local/nginx-1.12.2/sbin/nginx?-t
nginx:?the?configuration?file?/usr/local/nginx-1.12.2/conf/nginx.conf?syntax?is?ok
nginx:?configuration?file?/usr/local/nginx-1.12.2/conf/nginx.conf?test?is?successful

shell?>?/usr/local/nginx-1.12.2/sbin/nginx

shell?>?i=0;?while?[?$i?-lt?10?];do?curl?localhost;?let?i++;done
welcome?to?tomcat2
welcome?to?tomcat3
welcome?to?tomcat3
welcome?to?tomcat2
welcome?to?tomcat1
welcome?to?tomcat3
welcome?to?tomcat2
welcome?to?tomcat3
welcome?to?tomcat3
welcome?to?tomcat2

总共请求10次,tomcat3 响应了5次,因为它的权重最高(weight=3).

这样有一个问题,由于没有后端检测功能,当后端某一服务器无法提供服务时,该链接先被转发到这台机器,然后发现该机故障,而后才转发到其它机器。

导致资源浪费。

nginx_http_upstream_check_module

shell?>?git?clone?https://github.com/yaoweibin/nginx_upstream_check_module.git

shell?>?yum?-y?install?patch

shell?>?cd?/usr/local/src/nginx-1.12.2;?patch?-p1?<?/usr/local/src/nginx_upstream_check_module/check_1.12.1+.patch
patching?file?src/http/modules/ngx_http_upstream_hash_module.c
patching?file?src/http/modules/ngx_http_upstream_ip_hash_module.c
patching?file?src/http/modules/ngx_http_upstream_least_conn_module.c
patching?file?src/http/ngx_http_upstream_round_robin.c
patching?file?src/http/ngx_http_upstream_round_robin.h

切换到 Nginx 源码目录,打补丁 ( 注意与自己的 Nginx 版本匹配 )

shell?>?./configure?--prefix=/usr/local/nginx-1.12.2?--add-module=/usr/local/src/nginx_upstream_check_module
shell?>?make?&&?make?install

重新编译、安装 Nginx,注意加上原来的编译参数

shell?>?vim?/usr/local/nginx-1.12.2/conf/nginx.conf

????upstream?ls?{
????????server?192.168.10.24:8080;
????????server?192.168.10.24:8081;
????????server?192.168.10.24:8082;

????????check?interval=3000?rise=2?fall=5?timeout=1000?type=http;
????}

????server?{
????????listen??80;

????????location?/?{
????????????proxy_pass?http://ls;
????????}

????????location?/status?{
????????????check_status;
????????????access_log?off;
????????????#?allow?x.x.x.x;
????????????#?deny?all;
????????}
????}

去掉了权重值,注意:是可以同时存在的。

添加了一行,检测间隔3000毫秒,连续成功2次标记为UP,连续失败5次标记为DOWN,超时时间1000毫秒,检测类型HTTP。

shell?>?/usr/local/nginx-1.12.2/sbin/nginx?-t
nginx:?the?configuration?file?/usr/local/nginx-1.12.2/conf/nginx.conf?syntax?is?ok
nginx:?configuration?file?/usr/local/nginx-1.12.2/conf/nginx.conf?test?is?successful

shell?>?/usr/local/nginx-1.12.2/sbin/nginx?-s?stop
shell?>?/usr/local/nginx-1.12.2/sbin/nginx

直接 -s reload 貌似不行~

shell?>?curl?localhost/status?format=json
{"servers":?{
??"total":?3,
??"generation":?1,
??"server":?[
????{"index":?0,?"upstream":?"ls",?"name":?"192.168.10.24:8080",?"status":?"up",?"rise":?20,?"fall":?0,?"type":?"http",?"port":?0},
????{"index":?1,?"upstream":?"ls",?"name":?"192.168.10.24:8081",?"status":?"up",?"rise":?18,?"fall":?0,?"type":?"http",?"port":?0},
????{"index":?2,?"upstream":?"ls",?"name":?"192.168.10.24:8082",?"status":?"up",?"rise":?19,?"fall":?0,?"type":?"http",?"port":?0}
??]
}}

总共有三台机器,都属于负载均衡 ls 组,状态 up,连续成功次数等等。

shell?>?curl?localhost/status?format=json
{"servers":?{
??"total":?3,
??"generation":?1,
??"server":?[
????{"index":?0,?"upstream":?"ls",?"name":?"192.168.10.24:8080",?"status":?"up",?"rise":?73,?"fall":?0,?"type":?"http",?"port":?0},
????{"index":?1,?"upstream":?"ls",?"name":?"192.168.10.24:8081",?"status":?"down",?"rise":?0,?"fall":?6,?"type":?"http",?"port":?0},
????{"index":?2,?"upstream":?"ls",?"name":?"192.168.10.24:8082",?"status":?"up",?"rise":?68,?"fall":?0,?"type":?"http",?"port":?0}
??]
}}

关一台后端的话,就变成了这样!重启检测成功后,会被重新加入到负载均衡中!

以上是关于详解:Nginx反向代理及后端检测模块的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置详解

后端技术:Nginx 应用场景详解

nginx以upstream 分组的方式实现http反向代理

Nginx反向代理实例与负载均衡实现(全网详解)

Nginx配置参数详解

nginx的负载均衡模块详解