17

当初我要是这么学习Nginx就好了!(多图详解)1584392476624270

 4 years ago
source link: https://developer.51cto.com/art/202003/612549.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

当初我要是这么学习Nginx就好了!(多图详解) - 51CTO.COM

当初我要是这么学习Nginx就好了!(多图详解)

本文主要帮助大家熟悉 Nginx 有哪些应用场景、Nginx 特点和架构模型以及相关流程、Nginx 定制化开发的几种模块分类。读完本文你将对 Nginx 有一定的认识。

作者:李航来源:51CTO技术栈|2020-03-16 08:00

【51CTO.com原创稿件】本文主要帮助大家熟悉 Nginx 有哪些应用场景、Nginx 特点和架构模型以及相关流程、Nginx 定制化开发的几种模块分类。读完本文你将对 Nginx 有一定的认识。

69744323f395ed77b76ee5722c1e9063.jpg-wh_651x-s_2201808391.jpg

图片来自 Pexels

本文将围绕如下几个部分进行讲解:

  • Nginx 简介及特点
  • Nginx 应用场景
  • Nginx 框架模型介绍
  • Nginx 内部流程介绍
  • Nginx 自定义模块开发介绍
  • Nginx 核心时间点模块介绍
  • Nginx 分流模块介绍
  • Nginx 动态 upstream 模块介绍
  • Nginx query_upstrem 模块介绍
  • Nginx query_conf 模块介绍
  • Nginx 共享内存支持 Redis 协议模块介绍
  • Nginx 日志回放压测工具介绍

Nginx 简介以及特点

Nginx (engine x) 是一个高性能的 Web 服务器和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器:

  • 它由俄罗斯程序员 Igor Sysoev 于 2002 年开始开发。
  • Nginx 是增长最快的 Web 服务器,市场份额已达 33.3%。
  • 全球使用量排名第二,2011 年成立商业公司。

Nginx 社区分支:

  • Openresty:作者 @agentzh(章宜春)开发的,最大特点是引入了 ngx_lua 模块,支持使用 Lua 开发插件,并且集合了很多丰富的模块,以及 Lua 库。
  • Tengine:主要是淘宝团队开发。特点是融入了因淘宝自身的一些业务带来的新功能。
  • Nginx 官方版本,更新迭代比较快,并且提供免费版本和商业版本。

Nginx 源码结构(代码量大约 11 万行 C 代码):

  • 源代码目录结构 Core(主干和基础设置)
  • Event(事件驱动模型和不同的 IO 复用模块)
  • HTTP(HTTP 服务器和模块)
  • Mail(邮件代理服务器和模块)
  • OS(操作系统相关的实现)
  • Misc(杂项)

Nginx 特点如下:

  • 反向代理,负载均衡器
  • 高可靠性、单 Master 多 Worker 模式
  • 高可扩展性、高度模块化
  • 低内存消耗

Nginx 应用场景

Nginx 的应用场景如下:

  • 静态文件服务器
  • 反向代理,负载均衡
  • 智能路由(企业级灰度测试、地图 POI 一键切流)
  • 图片实时压缩

Nginx 框架模型介绍

进程组件角色:

  • Master 进程:监视工作进程的状态;当工作进程死掉后重启一个新的;处理信号和通知工作进程。
  • Worker 进程:处理客户端请求,从主进程处获得信号做相应的事情。
  • Cache Loader 进程:加载缓存索引文件信息,然后退出。
  • Cache Manager进程:管理磁盘的缓存大小,超过预定值大小后最少使用数据将被删除。

Nginx 的框架模型如下图:

1529297a71699dd46f32c37ef4f10b4f.jpg

框架模型流程如下图:

50a39cf853bb6121dc089378ed086db8.jpg

Nginx 内部流程介绍

Nginx 框架模型流程如下图:

a97f4cbeaf2ae588feaa3ef73059d119.png

Master 初始化流程,如下图:

1ad00c86ff9ea07b4957dff77b61037a.jpg-wh_600x-s_2718888696.jpg

Worker 初始化:

a6a5862efb16ca1910048b6a056bada4.jpg-wh_600x-s_3866710231.jpg

Worker 初始化流程图如下:

46024364f7b47b757491deb905c70d65.jpg-wh_600x-s_626705573.jpg

静态文件请求 IO 流程如下图:

78b54c39c6652aee7d02aba914072d36.png

HTTP 请求流程如下图:

1d47b3e408cc01c23829cd6e9e7943b7.jpg-wh_600x-s_3821507132.jpg

HTTP 请求 11 个阶段,如下图所示:

5cde835f2670de853cedff15b2bad1e8.jpg-wh_600x-s_607987273.jpg

upstream模块:

  • 访问第三方 Server 服务器
  • 底层 HTTP 通信非常完善
  • 异步非阻塞
  • 上下游内存零拷贝,节省内存
  • 支持自定义模块开发

upstream 框架流程,如下图:

8d987067c167121191d7e866b3b577bf.png

upstream 内部流程,如下图:

452b33d2e6a4c55b1c909cb1cd6c457b.jpg-wh_600x-s_2915335393.jpg

反向代理流程,如下图:

ae30c178d45d1aa641acf8d9116d9580.png-wh_600x-s_1961452935.png

Nginx 定制化模块开发

Nginx 的模块化设计特点如下:

  • 高度抽象的模块接口
  • 模块接口非常简单,具有很高的灵活性
  • 配置模块的设计
  • 核心模块接口的简单化
  • 多层次、多类别的模块设计

内部核心模块:

35e42b47fa7dcb8c147d180e135f187c.png-wh_600x-s_916744120.png

f3400945645c293457c1f0835b78b54f.jpg

Handler 模块:接受来自客户端的请求并构建响应头和响应体。

3e9e7d0ae7d07da0c749203cf4dfd33d.png

Filter 模块:过滤(filter)模块是过滤响应头和内容的模块,可以对回复的头和内容进行处理。它的处理时间在获取回复内容之后,向用户发送响应之前。

c83961549335022863c0369997a753d6.png

Upstream 模块:使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转发,纯异步的访问后端服务。

f3f2391c70e633c9e1b310a74e39fe3a.png-wh_600x-s_4013896644.png

Load_Balance:负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。

bd343e6d9e749766f5de87120e6b167f.png-wh_600x-s_4019619363.png

ngx_lua 模块:

  • 内存开销小
  • 运行速度快
  • 强大的 Lua 协程
  • 业务逻辑以自然逻辑书写

9c460fdc77fefa927c197e9cca28c4d6.jpg-wh_600x-s_839182982.jpg

定制化开发 Demo

Handler 模块:

  • 编写 config 文件
  • 编写模块产生内容响应信息
  1. #配置文件: 
  2. server { 
  3.     location test { 
  4.         test_counter on; 
  5. #config 
  6. ngx_addon_name=ngx_http_test_module 
  7. HTTP_MODULES="$HTTP_MODULES ngx_http_test_module" 
  8. NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_test_module.c" 
  9. #ngx_http_test_module.c 
  10. static ngx_int_t 
  11. ngx_http_test_handler(ngx_http_request_t *r) 
  12.     ngx_int_t                               rc; 
  13.     ngx_buf_t                               *b; 
  14.     ngx_chain_t                             out; 
  15.     ngx_http_test_conf_t                    *lrcf; 
  16.     ngx_str_t                               ngx_test_string = ngx_string("hello test"); 
  17.     lrcf = ngx_http_get_module_loc_conf(r, ngx_http_test_module); 
  18.     if ( lrcf->test_counter == 0 ) { 
  19.         return NGX_DECLINED; 
  20.     /* we response to 'GET' and 'HEAD' requests only */ 
  21.     if ( !(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)) ) { 
  22.             return NGX_HTTP_NOT_ALLOWED; 
  23.     /* discard request body, since we don't need it here */ 
  24.     rc = ngx_http_discard_request_body(r); 
  25.     if ( rc != NGX_OK ) { 
  26.         return rc; 
  27.     /* set the 'Content-type' header */ 
  28.      *r->headers_out.content_type.len = sizeof("text/html") - 1; 
  29.      *r->headers_out.content_type.data = (u_char *)"text/html"; 
  30.     ngx_str_set(&r->headers_out.content_type, "text/html"); 
  31.     /* send the header only, if the request type is http 'HEAD' */ 
  32.     if ( r->method == NGX_HTTP_HEAD ) { 
  33.         r->headers_out.status = NGX_HTTP_OK; 
  34.         r->headers_out.content_length_n = ngx_test_string.len; 
  35.         return ngx_http_send_header(r); 
  36.     /* set the status line */ 
  37.     r->headers_out.status = NGX_HTTP_OK; 
  38.     r->headers_out.content_length_n =  ngx_test_string.len; 
  39.     /* send the headers of your response */ 
  40.     rc = ngx_http_send_header(r); 
  41.     if ( rc == NGX_ERROR || rc > NGX_OK || r->header_only ) { 
  42.         return rc; 
  43.     /* allocate a buffer for your response body */ 
  44.     b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); 
  45.     if ( b == NULL ) { 
  46.         return NGX_HTTP_INTERNAL_SERVER_ERROR; 
  47.     /* attach this buffer to the buffer chain */ 
  48.     out.buf = b; 
  49.     out.next = NULL; 
  50.     /* adjust the pointers of the buffer */ 
  51.     b->pos = ngx_test_string.data; 
  52.     b->last = ngx_test_string.data + ngx_test_string.len; 
  53.     b->memory = 1;    /* this buffer is in memory */ 
  54.     b->last_buf = 1;  /* this is the last buffer in the buffer chain */ 
  55.     /* send the buffer chain of your response */ 
  56.     return ngx_http_output_filter(r, &out); 

Nginx 核心时间点模块介绍

解决接入层故障定位慢的问题,帮助 OP 快速判定问题根因,优先自证清白,提高接入层高效的生产力。

a13e5a24772706c7481667785f6de04f.jpg-wh_600x-s_1827459.jpg

Nginx 分流模块介绍

Nginx 分流模块特点如下:

  • 实现非常灵活的动态的修改策略从而进行切流量。
  • 实现平滑无损的方式进行流量的切换。
  • 通过秒级切换流量可以缩小影响范围,从而减少损失。
  • 按照某一城市或者某个特征,秒级进行切换流量或者禁用流量。
  • 容忍单机房级别容量故障,缩短了单机房故障的止损时间。
  • 快速的将流量隔离或者流量抽样。
  • 高效的灰度测试,提高生产力。

a35579bc7d55bfd379d4780d1320b7ee.jpg-wh_600x-s_4037910048.jpg

Nginx 动态 upstream 模块介绍

让接入层可以适配动态调度的云环境,实现服务的平滑上下线、弹性扩/缩容。

从而提高接入层高效的生产力以及稳定性,保证业务流量的平滑无损。

d7aa8b70d8db8f311892cb054769552d.jpg

Nginx query_upstream 模块介绍

链路追踪,梳理接口到后端链路的情况。查询 location 接口对应 upstream server 信息。

457100c5ac533ce967c55b195ac2b8a4.jpg-wh_600x-s_3701605556.jpg

Nginx query_conf 模块介绍

获取 Nginx 配置文件格式化为 json 格式信息:

7e170c69624459c4a40fa60238f5acb3.jpg-wh_600x-s_1740827534.jpg

Nginx 共享内存支持 Redis 协议模块介绍

根据配置文件来动态的添加共享内存:

  1. https://github.com/lidaohang/ngx_shm_dict  

ngx_shm_dict:共享内存核心模块(红黑树,队列)

ngx_shm_dict_manager:添加定时器事件,定时的清除共享内存中过期的 Key,添加读事件,支持 Redis 协议,通过 redis-cli get,set,del,ttl

ngx_shm_dict_view:共享内存查看

3bde2a0707c2b82e796669c13d59dce2.jpg-wh_600x-s_265789436.jpg

Nginx 日志回放压测工具

解析日志进行回放压测,模拟后端服务器慢等各种异常情况 :

  1. https://github.com/lidaohang/playback-testing 

方案说明:

  • 客户端解析 access.log 构建请求的 host,port,url,body。
  • 把后端响应时间,后端响应状态码,后端响应大小放入 header 头中。
  • 后端服务器获取相应的 header,进行模拟响应 body 大小,响应状态码,响应时间。

使用方式:

  • 拷贝需要测试的 access.log 的日志到 logs 文件夹里面。
  • 搭建需要测试的 Nginx 服务器,并且配置 upstream 指向后端服务器断端口
  • 启动后端服务器实例
  1. server/backserver/main.go 
  1. bin/wrk -c30 -t1 -s conf/nginx_log.lua http://localhost:8095 

146aada7999429c7071ffdb3020aaba6.gif

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】
点赞 1

关注“51CTO技术栈”微信公众号获取更多精彩内容


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK