【.com原创稿件】本文主要帮助大家熟悉Nginx的应用场景,Nginx的特点和架构模型及相关流程,Nginx定制化开发的几个方面。模块分类。看完这篇文章,你会对Nginx有一定的了解。图片来自Pexels本文将重点介绍以下几个部分:Nginx介绍及特点Nginx应用场景Nginx框架模型介绍Nginx内部流程介绍Nginx自定义模块开发介绍Nginx核心时间点模块介绍Nginx分流模块介绍Nginx动态上游模块介绍Nginxquery_upstrem模块介绍Nginxquery_conf模块介绍Nginx共享内存支持Redis协议模块介绍Nginx日志回放压力测试工具介绍Nginx介绍和特性Nginx(enginex)是一个高性能的web服务器和反向代理服务器,同时也是一个IMAP/POP3/SMTPServer:由俄罗斯程序员IgorSysoev于2002年开始。Nginx是增长最快的Web服务器,市场份额为33.3%。全球使用量排名第2,商业公司成立于2011年。Nginx社区分支:Openresty:由作者@agentzh(张一纯)开发,最大的特点是引入了ngx_lua模块,支持使用Lua开发插件ins,并集成了很多丰富的模块和Lua库。Tengine:主要由淘宝团队开发。其特点是整合了淘宝自身的一些业务带来的新功能。Nginx正式版,更新迭代比较快,提供免费版和商业版。Nginx源码结构(代码量约11万行C代码):源码目录结构Core(主干和基本设置)Event(事件驱动模型和不同IO复用模块)HTTP(HTTP服务器和模块)Mail(mailproxyserverAndmodule)OS(操作系统相关实现)Misc(miscellaneous)Nginx特点如下:反向代理,负载均衡器高可靠性,单master多worker模式高扩展性,高度模块化非阻塞事件驱动低内存消耗热部署Nginx应用场景Nginx的应用场景如下:静态文件服务器反向代理、负载均衡安全防御智能路由(企业级灰度测试、地图POI一键流切换)灰度发布静态消息推送图片实时压缩防盗链Nginx框架模型介绍进程组件的作用:Master进程:监听workerpro的状态关税;当工作进程死亡时重新启动一个新的;处理信号并通知工作进程。工作进程:处理客户端请求,并从主进程获取信号做相应的事情。CacheLoader进程:加载缓存索引文件信息,然后退出。CacheManager进程:管理磁盘的缓存大小,当大小超过预定值时,将删除最少使用的数据。Nginx的框架模型如下图:框架模型流程如下:Nginx内部流程介绍Nginx框架模型流程如下:Master初始化流程,如下图:Worker初始化:Worker初始化流程图如下:静态文件请求IO流程如下:HTTP请求流程如下图:HTTP请求的11个阶段,如下图:upstream模块:访问第三方服务器底层HTTP通信非常完善,异步,非阻塞,上下游内存零拷贝,节省内存支持自定义模块开发上游框架流程,如下图:上游内部流程,如下图:反向代理流程,如下图所示:Nginx定制化模块开发Nginx的模块化设计特点如下:模块间高度抽象face模块接口非常简洁,配置模块设计核心灵活度高简化模块接口多层次、多类模块设计内部核心模块:Handler模??块:接受来自客户端的请求,构建响应头和响应体。过滤模块:过滤模块是过滤响应头和内容的模块,可以对响应的头和内容进行处理。它的处理时间是在得到响应内容之后,发送响应给用户之前。Upstream模块:使Nginx能够超越单机的限制,完成网络数据的接收、处理和转发,纯异步访问后端服务。Load_Balance:负载均衡模块实现了特定的算法。在众多后端服务器中,选择一台服务器作为某个请求的转发服务器。ngx_lua模块:内存开销小,运行速度快的脚本语言强大的Lua协程非阻塞业务逻辑编写自然逻辑自定义开发DemoHandler模??块:编写config文件编写模块生成内容响应信息#Configurationfile:server{...locationtest{test_counteron;}}#configngx_addon_name=ngx_http_test_moduleHTTP_MODULES="$HTTP_MODULESngx_http_test_module"NGX_ADDON_SRCS="$NGX_ADDON_SRCS$ngx_addon_dir/ngx_http_test_module.c"#ngx_http_test_module.cstaticngx_int_tngx_http_test_handler(ngx_http_request_t*r){ngx_int_trc;ngx_buf_t*b;ngx_chain_tout;ngx_http_test_conf_t*lrcf;ngx_str_tngx_test_string=ngx_string("hellotest");lrcf=ngx_http_get_module_loc_conf(r,ngx_http_test_module);if(lrcf->test_counter==0){returnNGX_DECLINED;}/*只响应'GET'和'HEAD'请求*/if(!(r->method&(NGX_HTTP_GET|NGX_HTTP_HEAD))){returnNGX_HTTP_NOT_ALLOWED;}/*discardrequestbody,sincewedon'tneedithere*/rc=ngx_http_discard_request_body(r);if(rc!=NGX_OK){returnrc;}/*设置'Content-type'header*//**r->headers_out.content_type.len=sizeof("text/html")-1;*r->headers_out.content_type.data=(u_char*)"text/html";*/ngx_str_set(&r->headers_out.content_type,"text/html");/*仅发送header,如果请求类型是http'HEAD'*/if(r->method==NGX_HTTP_HEAD){r->headers_out.status=NGX_HTTP_OK;r->headers_out.content_length_n=ngx_test_string.len;returnngx_http_send_header(r);}/*setthestatusline*/r->headers_out.status=NGX_HTTP_OK;r->headers_out.content_length_n=ngx_test_string.len;/*sendtheheadersofyourresponse*/rc=ngx_http_send_header(r);if(rc==NGX_ERROR||rc>NGX_OK||r->header_only){returnrc;}/*allocateabufferforyourresponsebody*/b=ngx_pcalloc(r->pool,sizeof(ngx_buf_t));if(b==NULL){returnNGX_HTTP_INTERNAL_SERVER_ERROR;}/*attachthisbuffertothebufferchain*/out.buf=b;输出。next=NULL;/*调整缓冲区的指针*/b->pos=ngx_test_string.data;b->last=ngx_test_string.data+ngx_test_string.len;b->memory=1;/*thisbufferisinmemory*/b->last_buf=1;/*thisisthelastbufferinthebufferchain*//*sendthebufferchainofyourresponse*/returnngx_http_output_filter(r,&out);}引入Nginx核心时间点模块,解决接入层故障定位慢的问题,帮助OP快速定根问题原因,优先考虑无罪证明,提高接入层效率Nginx分发模块介绍Nginx分发模块的特点如下:实现非常灵活的动态修改策略来削减流量。实现流畅无损的流量切换。通过秒级切换流量,可以缩小影响范围,减少损失。根据某个城市或某个特点,秒级切换流量或禁用流量。容忍单机房级别的容量故障,缩短单机房故障的停损时间。快速隔离或采样流量。高效灰度测试,提高生产力。Nginx动态上游模块介绍,接入层可以适配动态调度的云环境,实现流畅的线上线下业务和弹性伸缩。从而提高接入??层的高效生产力和稳定性,保证业务流量通畅无损。Nginxquery_upstream模块引入链接跟踪,整理出从接口到后端的链接。查询定位接口对应的上游服务器信息。Nginxquery_conf模块介绍获取格式化为json格式信息的Nginx配置文件:Nginx共享内存支持Redis协议模块介绍根据配置文件动态添加共享内存:https://github.com/lidaohang/ngx_shm_dictngx_shm_dict:共享内存核心模块(红黑树、队列)ngx_shm_dict_manager:添加定时器事件,定期清除共享内存中的过期key,添加读取事件,支持Redis协议,使用redis-cliget、set、del、ttlngx_shm_dict_view:共享内存查看Nginx日志回放压力测试工具解析日志进行播放压测,模拟后端服务器慢等各种异常情况:https://github.com/lidaohang/playback-testing解决方案说明:客户端解析access.log搭建主机,请求的端口和url,正文。将后端响应时间、后端响应状态码、后端响应大小放入header中。后端服务器获取相应的header,模拟响应体大小、响应状态码、响应时间。使用方法:将需要测试的access.log复制到logs文件夹下。搭建需要测试的Nginx服务器,配置upstream指向后端服务器坏掉的端口启动后端服务器实例server/backserver/main.go进行压测bin/wrk-c30-t1-sconf/nginx_log。luahttp://localhost:8095【原创稿件,合作网站转载请注明原作者和出处为.com】
