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

admin6个月前笔记49

image.png

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}
  ]
}}


相关文章

linux 文件权限解析

linux 文件权限解析

常用权限linux系统内有档案有三种身份 u:拥有者 g:群组 o:其他人这些身份对于文档常用的有下面权限:r:读权限,用户可以读取文档的内容,如用cat,more查看w:写权限,用户可以编辑文档x:...

在 Linux 中安装 Spotify

在 Linux 中安装 Spotify

如何在 Ubuntu Linux 桌面上安装 spotify 来在线听音乐?Spotify 是一个可让你访问大量歌曲的数字音乐流服务。你可以免费收听或者购买订阅,可以创建播放列表。...

详解Redis内部运作机制

Redis数据库(Redis 如何表示一个数据库,数据库操作是如何实现的)当Redis服务器初始化的时候会创建 redis.h/REDIS_DEFAULT_DBNUM(后面简写 N ) 个数...

详解Linux常见命令及终端使用技巧

常用 Linux 命令的基本使用原因Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作、文件存取、目录操作、进程管理、文件权限 设定等在职场中,大量的&nbs...

从 0 开始了解 Docker

从 0 开始了解 Docker

序Docker 自开源以来受到了各大公司的广泛关注,或许现在互联网公司的运维体系不承载在 Docker(或 Pouch 等)之上都不好意思说自己的互联网公司。本文会简单介绍下 Docker 的基础概念...

打不死的redis集群

打不死的redis集群

最近遇到部分系统因为redis服务挂掉,导致部分服务不可用。所以希望搭建一个redis集群镜像,把原先散落各处的redis服务器统一管理起来,并且保障高可用和故障自动迁移。一 redis集群分类大家都...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。