欢迎您, 来到 宁时修博客.^_^

Nginx--03 反向代理与后端检测(nginx-1.14.0)

2018/07/12 言则行 Nginx 842
Nginx反向代理、后端检测模块

一、简介

        反向代理模块:ngx_http_proxy_module、ngx_http_upstream_module

        后端健康检测模块:nginx_http_upstream_check_module

        后端健康检测模块是第三方模块(淘宝大神开发),需要编译添加,地址:https://github.com/yaoweibin/nginx_upstream_check_module


        测试环境:

        nginx反向代理:192.168.2.31

        后端web服务器:192.168.2.32,192.168.2.33



二、安装 

[root@nginx-proxy ~]# useradd -M -s /sbin/nologin nginx
[root@nginx-proxy ~]# cd /usr/local/src/
[root@nginx-proxy src]# wget 
[root@nginx-proxy src]# wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip 
[root@nginx-proxy src]# yum -y install gcc gcc-c++ make pcre-devel unzip patch
[root@nginx-proxy src]# tar -zxvf nginx-1.14.0.tar.gz
[root@nginx-proxy src]# unzip master.zip
[root@nginx-proxy src]# cd nginx-1.14.0
[root@nginx-proxy nginx-1.14.0]# patch -p1 < /usr/local/src/nginx_upstream_check_module-master/check_1.12.1+.patch 
patching file src/http/modules/ngx_http_upstream_hash_module.c
Hunk #3 succeeded at 565 (offset 16 lines).
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
[root@nginx-proxy nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.14.0 --with-pcre --with-http_stub_status_module --add-module=/usr/local/src/nginx_upstream_check_module-master

        

    错误:

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

    大意是:HTTP gzip模块需要zlib库,你可以使用 --without-http_gzip_module禁用该模块,或者安装zlib库到系统中,使用 --with-zlib=<path>选项将zlib库添加到nginx中。


    作为反向代理使用,并不需要gzip模块,所以使用--without-http_gzip_module禁用该模块了。想用就yum install zlib-devel -y。


    重编译:

[root@nginx-proxy nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.14.0 --with-pcre --with-http_stub_status_module --add-module=/usr/local/src/nginx_upstream_check_module-master --without-http_gzip_module

.................................
Configuration summary
  + using system PCRE library
  + OpenSSL library is not used
  + zlib library is not used

  nginx path prefix: "/usr/local/nginx-1.14.0"
  nginx binary file: "/usr/local/nginx-1.14.0/sbin/nginx"
  nginx modules path: "/usr/local/nginx-1.14.0/modules"
  nginx configuration prefix: "/usr/local/nginx-1.14.0/conf"
  nginx configuration file: "/usr/local/nginx-1.14.0/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx-1.14.0/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx-1.14.0/logs/error.log"
  nginx http access log file: "/usr/local/nginx-1.14.0/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"

        这就好了,还告诉我们一些配置信息:

Configuration summary
  + using system PCRE library         #使用了系统的PCRE库
  + OpenSSL library is not used       #Openssl库未使用
  + zlib library is not used          #zlib库未使用

        

[root@nginx-proxy nginx-1.14.0]# make && make install
[root@nginx-proxy nginx-1.14.0]# cd /usr/local/
[root@nginx-proxy local]# ln -s nginx-1.14.0/ nginx
[root@nginx-proxy local]# chown -R nginx.nginx nginx nginx-1.14.0
[root@nginx-proxy local]# ll
total 0
lrwxrwxrwx  1 nginx nginx  13 Jul 12 13:17 nginx -> nginx-1.14.0/
drwxr-xr-x  6 nginx nginx  54 Jul 12 13:15 nginx-1.14.0



三、配置

        健康检测配置样例:

upstream backend {
    server 192.168.2.32:8080 weight=1 max_fails=2 fail_timeout=30s;
    server 192.168.2.33:8080 weight=1 max_fails=2 fail_timeout=30s;
    
    check interval=5000 rise=2 fall=3 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

    

        Nginx自带的健康检测模块(ngx_http_proxy_module )参数如下:

weight: 轮询权值也是可以用在ip_hash的,默认值为1

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

fail_timeout: 有两层含义,一是在 30s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,30s时间内不分配请求到这台服务器。

backup: 预留的备份机器。当其他所有的非backup机器出现故障的时候,才会请求backup机器,因此这台机器的压力最轻。

max_conns: 限制同时连接到某台后端服务器的连接数,默认为0即无限制。因为queue指令是commercial,所以还是保持默认吧。

proxy_next_upstream: 这个指令属于 http_proxy 模块的,指定后端返回什么样的异常响应时,使用另一个realserver


        nginx_upstream_check_module 是专门提供负载均衡器内节点的健康检查的外部模块,check 模块的参数只能出现在upstream中,参数如下:

interval : 向后端发送的健康检查包的间隔,单位毫秒

fall : 如果连续失败次数达到fall_count,服务器就被认为是down。

rise : 如果连续成功次数达到rise_count,服务器就被认为是up。

timeout : 后端健康请求的超时时间,单位毫秒

default_down : 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。

type:健康检查包的类型,现在支持以下多种类型:
    tcp:简单的tcp连接,如果连接成功,就说明后端正常。
    http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。
    ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。
    ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。
    mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。
    fastcgi:发送一个fastcgi请求,通过接受解析fastcgi响应来判断后端是否存活
    
    如果 type 为 http ,你还可以使用check_http_send来配置http监控检查包发送的请求内容,为了减少传输数据量,推荐采用 HEAD 方法。当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如: HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n 。当采用 GET 方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。

port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样。

check_http_expect_alive 指定HTTP回复的成功状态,默认人为2xx和3xx的状态是健康的。


    nginx.conf配置:

[root@nginx-proxy ~]# cd /usr/local/nginx/conf/
[root@nginx-proxy conf]# vim nginx.conf
user  nginx;
worker_processes  2;

error_log  logs/error.log;
pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  65;
    
    include /usr/local/nginx/conf/conf.d/*.conf;
    
    server {
        listen       80;
        server_name  localhost;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


[root@nginx-proxy conf]# mkdir conf.d
[root@nginx-proxy conf]# cd conf.d/
[root@nginx-proxy conf.d]# vim proxy.conf
upstream test {
    server 192.168.2.32:8080 weight=1 max_fails=2 fail_timeout=30s ;
    server 192.168.2.33:8080 weight=1 max_fails=2 fail_timeout=30s ;

    check interval=5000 rise=2 fall=3 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}


server {

    location / {
        proxy_pass http://test;


        #Proxy Settings
        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;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;

    }


    location /check_status {
        check_status;
        access_log   off;
        allow all;
    }
}

[root@nginx-proxy conf.d]# cd ..
[root@nginx-proxy conf]# chown -R nginx.nginx conf.d/
[root@nginx-proxy conf]# cd 
root@nginx-proxy ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx-1.14.0/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx-1.14.0/conf/nginx.conf test is successful

[root@nginx-proxy ~]# /usr/local/nginx/sbin/nginx

[root@nginx-proxy ~]# curl http://192.168.2.31/check_status?format=json
{"servers": {
  "total": 2,
  "generation": 2,
  "server": [
    {"index": 0, "upstream": "test", "name": "192.168.2.32:8080", "status": "up", "rise": 50, "fall": 0, "type": "http", "port": 0},
    {"index": 1, "upstream": "test", "name": "192.168.2.33:8080", "status": "up", "rise": 53, "fall": 0, "type": "http", "port": 0}
  ]
}}

        

        访问状态界面:http:192.168.2.31/check_status

20180712152611.png


        访问web:http:192.168.2.31

20180712152834.png




四、测试

        关闭一台Tomcat,然后查看状态:

        shsh.png



    


    

点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群