nginx upstream server主动健康监测模块添加https检测功能【上】

这篇具有很好参考价值的文章主要介绍了nginx upstream server主动健康监测模块添加https检测功能【上】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 缘起

  前面的《nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析》系列已经分析了ngx_http_upstream_check_module的实现原理,并且在借助这个模块的框架实现了一个udp健康检测的新功能。
  但是ngx_http_upstream_check_module还缺乏基于https监测上游服务器健康状况的能力,始终是一个缺憾,因此,本文基于《nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析》和《nginx stream proxy 模块的ssl连接源码分析》两篇博文的分析成果,来实现一个基于https的上游服务器健康检测的能力。

1.1 功能定义

  本次支持的功能:

  • 支持向上游服务器发起https请求功能
  • 请求的报文复用原有的http检测的请求报文定义
  • 响应的状态码检测复用原有的http检测的响应码的定义
  • 支持ssl握手过程中添加sni扩展信息
  • 支持ssl握手协议类型的配置
  • 支持ssl握手协议加密套件的配置

  暂时不支持的功能:

  • 不支持ssl会话复用(会话复用可以降低上游服务器的ssl握手压力)
  • 不支持ssl证书双向验证
  • 不支持服务器端证书有效性验证

&ems;  由于本次主要是检验https的链接握手流程,对一些不是特别关键的ssl握手特性暂时不支持主要是为了简化代码逻辑,但是不影响业务流程,这样也便于在本文中将整个实现流程进行阐述。后续可以参照ngx_stream_proxy_module中的实现,继续将这些特性进行完善,以臻于完美。

2. 实现后的效果

  首先来看一下实现后的效果,有一些感性的认识。

2.1 配置文件


#user  nobody;
worker_processes  1;
daemon off;
master_process off;

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

load_module  objs/ngx_http_upstream_check_module.so;

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;
    keepalive_timeout  65;

	upstream backend {
		check type=https interval=3000 rise=2 fall=5 timeout=1000 port=443;
		check_http_send "GET / HTTP/1.1\r\nHost: www.test.com\r\n\r\n";
		check_http_expect_alive http_2xx http_3xx;
        check_ssl_server_name www.test.com;
		server 192.168.0.1:443;
	}

    server {
        listen       9080;
        server_name  localhost;

        # 开启本模块的状态查询接口	
		location /status {
			check_status html;
		}

        location / {
			proxy_pass http://backend;
        }

        #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;
        }

    }
}

   以上配置文件中的upstream块中定义了一个https的健康检测类型, check_http_send复用了http的定义,而check_ssl_server_name是新增的指令,用来配置ssl握手设置sni扩展主机host信息。

2.2 运行效果

查看nginx的error.log日志, 可以看到如下信息:

2024/02/16 09:31:33 [error] 23638#0: https check failed with return code: 403
2024/02/16 09:31:33 [error] 23638#0: check protocol https error with peer: 192.168.0.1:443
2024/02/16 09:31:45 [info] 23663#0: enable check peer: 192.168.0.1:443

error.log中的前面两条因为服务器响应403报了错误,对应在配置了“check_http_expect_alive http_2xx http_3xx;”的情况。如果配置改成“check_http_expect_alive http_2xx http_3xx http_4xx;” 则报后面那条上游服务器enable的信息。证明https的检测功能已经可用了。

3. 代码实现

3.1 配置指令

3.1.1 配置指令定义:

支持的配置指令如下:

  • check_ssl_ciphers:
        配置加密套件,格式参考proxy_ssl_ciphers
  • check_ssl_protocols:
        和服务器交互采用的ssl协议版本,如TLSv1.1 TLSv1.2等,格式参考proxy_ssl_protocols。
  • check_ssl_server_name:
        和服务器进行ssl握手时候采用的sni扩展host名字,如果不设置并且upstream块中的server是用域名设置的,那么默认就采用设置的服务器名字。
  • check_ssl_verify:[on/off]
        是否校验服务器的证书有效性。(待后续实现)
  • check_ssl_session_reuse: [on/off]
        和上游服务器进行ssl握手的时候是否复用ssl会话信息。

3.1.2 配置指令结构体:


struct ngx_http_upstream_check_srv_conf_s {
    ngx_uint_t                               port;
    ngx_uint_t                               fall_count;
    ngx_uint_t                               rise_count;
    ngx_msec_t                               check_interval;
    ngx_msec_t                               check_timeout;
    ngx_uint_t                               check_keepalive_requests;

    ngx_check_conf_t                        *check_type_conf;
    ngx_str_t                                send;

    union {
        ngx_uint_t                           return_code;
        ngx_uint_t                           status_alive;
    } code;

    ngx_array_t                             *fastcgi_params;

    ngx_uint_t                               default_down;
    ngx_uint_t                               unique;
    ngx_uint_t                               udp : 1;                       /* 是否udp socket */
    ngx_int_t                                match_part : 1;                /* 是否只要部分匹配就可以了 */
    ngx_int_t                                match_offset;                  /* udp响应期望的内容从哪个字节开始匹配 */
    ngx_str_t                                expect;                        /* udp响应的期望内容 */

#if (NGX_HTTP_SSL)
    ngx_ssl_t                               *ssl;                            /* ssl 配置上下文 */
    ngx_str_t                                ssl_ciphers;                    /* ssl 加密套件 */
    ngx_uint_t                               ssl_protocols;                  /* 采用的ssl协议 */
    ngx_str_t                                ssl_server_name;                /* ssl握手的sni扩展hostname */
#endif
};

  以上添加的ssl_protocols参数在ngx_http_upstream_check_create_srv_conf函数中需要将其设置为NGX_CONF_UNSET_UINT,避免nginx在解析配置文件的时候出现参数重复的报错。

3.1.3 配置指令源码定义:

#if (NGX_HTTP_SSL)
    { ngx_string("check_ssl_ciphers"),
      NGX_HTTP_UPS_CONF|NGX_CONF_TAKE1,
      ngx_conf_set_str_slot,
      NGX_HTTP_SRV_CONF_OFFSET,
      offsetof(ngx_http_upstream_check_srv_conf_t, ssl_ciphers),
      NULL },

    { ngx_string("check_ssl_protocols"),
      NGX_HTTP_UPS_CONF|NGX_CONF_1MORE,
      ngx_conf_set_bitmask_slot,
      NGX_HTTP_SRV_CONF_OFFSET,
      offsetof(ngx_http_upstream_check_srv_conf_t, ssl_protocols),
      &ngx_upstream_check_ssl_protocols },

    { ngx_string("check_ssl_server_name"),
      NGX_HTTP_UPS_CONF|NGX_CONF_FLAG,
      ngx_conf_set_str_slot,
      NGX_HTTP_SRV_CONF_OFFSET,
      offsetof(ngx_http_upstream_check_srv_conf_t, ssl_server_name),
      NULL },
#endif

  通过以上配置指令,可以将解析到的参数设置到ngx_http_upstream_check_srv_conf_s结构体对应的字段中。其中ngx_upstream_check_ssl_protocols是一个可选协议的列表,定义如下:

#if (NGX_HTTP_SSL)

static ngx_conf_bitmask_t  ngx_upstream_check_ssl_protocols[] = {
    { ngx_string("SSLv2"), NGX_SSL_SSLv2 },
    { ngx_string("SSLv3"), NGX_SSL_SSLv3 },
    { ngx_string("TLSv1"), NGX_SSL_TLSv1 },
    { ngx_string("TLSv1.1"), NGX_SSL_TLSv1_1 },
    { ngx_string("TLSv1.2"), NGX_SSL_TLSv1_2 },
    { ngx_string("TLSv1.3"), NGX_SSL_TLSv1_3 },
    { ngx_null_string, 0 }
};

#endif

nginx upstream server主动健康监测模块添加https检测功能【完整版】文章来源地址https://www.toymoban.com/news/detail-830170.html

到了这里,关于nginx upstream server主动健康监测模块添加https检测功能【上】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

    如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 二、安装依赖包 三、编译安装 四、配置systemd守护 脚本解释: Unit: 服务的启动顺序和依赖关系 Description:对该服务的描述; After:在b.target服务组启动后,再启动本服务; Service:服务具体执行的方式 ExecStart,ExecStop,ExecReload等

    2024年02月12日
    浏览(35)
  • 使用Nginx的upstream实现负载均衡,并配置https,避免Post请求类型转发后变为Get

    Nginx支持负载均衡,可以很方便的帮助我们进行水平扩容,upstream就是nginx中的负载均衡模块 当客户端发送请求时,会先到Nginx,然后Nginx会将请求分发到后台不同的服务器上。 如果后台的服务器群中有一个宕机了,那么Nginx会自动忽略这台服务器,不会将请求再次分发到这台

    2024年02月01日
    浏览(48)
  • Nginx 第三方健康检测模块的使用

    模块开源地址:https://github.com/yaoweibin/nginx_upstream_check_module 官网介绍:http://tengine.taobao.org/document_cn/http_upstream_check_cn.html nginx自带健康检查机制 第三方ngx_http_upstream_check_module模块 被动健康检查 提供主动式后端服务器健康检查的功能 访问时才对后端进行探活且无法预警,影响

    2024年02月03日
    浏览(46)
  • Nginx重新编译并添加模块

            作用:一是检查所需模块是否已安装,二是将configure arguments: 后面的参数复制出来并保存,因为等会重新编译时还需将这些模块一同添加进去。         进入Nginx源码包目录下,执行make clean指令,清除历史编译。         使用./configure --help指令查询需要配置的参

    2024年02月05日
    浏览(36)
  • 杂记 | 使用Docker和Nginx为网站添加HTTPS访问功能

    HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密通信保护网站数据传输的协议。它是 HTTP 协议的安全版本,通过使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)协议对数据进行加密和认证。在 HTTPS 下,传输的数据在客户端和服务器之间是加密的,确保信息不被窃听

    2024年02月10日
    浏览(42)
  • nginx添加nginx-sticky-module模块步骤

    ip_hash 根据客户端ip将请求分配到不同的服务器上. sticky 根据服务器个客户端的cookie,客户端再次请求是会带上此cookie,nginx会把有次cookie的请求转发到颁发cookie的服务器上. 1. 下载sticky 2. 编译nginx 3. 查看模块是否被载入 如下图表表示添加成功 4. 使用 name: cookie的名称 expire: 有效

    2024年02月13日
    浏览(31)
  • 【Nginx05】Nginx学习:HTTP核心模块(二)Server

    第一个重要的子模块就是这个 Server 相关的模块。Server 代表服务的意思,其实就是这个 Nginx 的 HTTP 服务端所能提供的服务。或者更直白点说,就是虚拟主机的配置。通过 Server ,我们可以在同一台服务器上,配置监听不同端口号的 HTTP 应用,配置不同域名解析的 HTTP 服务,并

    2024年02月12日
    浏览(45)
  • 【基础篇】Nginx安装 SSL模块、配置 HTTPS详细步骤

    nginx安装 1、查看 nginx是否安装 http_ssl_module 模块 如果出现 configure arguments: –with-http_ssl_module, 则已安装(下面的步骤可以跳过,进入 SSL 证书部署、nginx.conf 配置)。 否则按下述执行命令。 2、进入nginx源码包,重新执行下面命令,重新编译安装三部曲 3、上述命令执行完以后

    2023年04月16日
    浏览(55)
  • Linux下Nginx配置SSL模块,Nginx安装SSL,Nginx支持https配置详细教程

    前提:Linux安装Nginx,参考教程:CentOS7安装Nginx完整教程,Linux系统下保姆式安装Nginx教程 | 老麻 安装好Nginx之后,需要支持SSL时,要单独安装SSL模块,方法如下: 输入 ./nginx –V 命令,注意V是大写,查看配置是否包含“–with-http_ssl_module”,包含则表示已配置好SSL,如果不包

    2024年02月08日
    浏览(51)
  • Linux下nginx添加stream模块支持Tcp转发

    方式1 yum直接安装 安装nginx 安装模块 添加转发配置 /etc/nginx/nginx.conf底部添加 运行测试 方式2 源码编译 一、安装编译工具 二、安装PCRE PCRE (Perl Compatible Regular Expressions) 是一个用于处理正则表达式的库,它是一个C语言的库,可以在多种编程语言中使用。PCRE库提供了一套API来编

    2024年04月28日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包