1.什么是Ngnix?
Nginx背景:俄国 针对一个当地并发访问量很大的网站专门写了一个http服务器,由于性能优异,在全球异军突起。
设计定位:高并发,高拓展,跨平台
优秀特性:高并发,高拓展,跨平台
特点:高性能是品质,高稳定性是保障,低资源消耗是基石,而高扩展性是Nginx生命力的源泉
架构设计原则
模块加载过程:模块独立,
事件分发模块
采用了异步非阻塞,提升事件处理效率
win : select, Mac:kqueue,linux:poll,epoll.
2.为什么要用Nginx?
Nginx优点和劣势
优点:同上
劣势:模块单一,如果需要其他模块只能去集成其他功能或者自定义模块嵌入进去,且没有提供一个成熟的调试方案出来。
3.怎么去使用Nginx?
Nginx配置,相关模块的使用,相关参数的配置
在我们下载Nginx包下来后,在conf目录下有一个conf.xml 文件,这个文件定义了全局变量参数,需要加载的模块,日志路径等相关信息,我们通过/sbin/nginx c /target/目录,指定执行的conf.xml加载的路径,通过/sbin/nginx -p /target/nginx目录 启动。这样,我们通过发起http请求的话,经过location的导向会进入到默认的index.html路径下。
通过嵌入其他业务功能模块,利用Nginx优秀的事件处理机制,满足我们的业务需求,网关,鉴权等
4.什么时候去使用Nginx?
业务到达什么时候可以使用Nginx,或者说有什么特性回去考虑Nginx。
5.在哪里使用Nginx?
6.Main源码初步解析
Nginx模块包结构以及包的划分
包的划分:
core:存放了Nginx使用到的关键的数据结构和内核实现的源码。
nginx.*:包含了Nginx程序入口函数main的文件,实现了对Nginx各模块整体的控制。
ngx_connection.*:实现了网络连接管理的的功能
ngx_inet.*:实现了与网络Socket套接字相关的功能
ngx_cycle.*:实现了对系统整个运行过程中的参数,资源的统一管理和调配。
ngx_log.*:实现了日志输出了和管理的相关功能。
ngx_file.*:实现了文件读写的相关功能。
ngx_regex.*:实现了服务器对正则表式的支持。
ngx_string.*:实现了对字符串处理的基本功能。
ngx_times.*:实现了对时间的获取和处理的功能。
ngx_array(list,hash,tree,queue,chain等相关数据结构),内存管理(ngx_palloc,shmtx,open_file_cache),
enent:存放实现了服务器的事件驱动模型,实现了服务器的消息机制。影响服务器的承载能力。
modules目录下:实现了Nginx服务器支持的各类事件驱动模型(AIO,epoll,kqueue,rtsig,win32平台和Linux平台select,/dev/poll,poll等)
modules目录之外:实现了和时间驱动机制相关的数据结构的定义和初始化功能,完成事件的接收,传递,管理功能
http:存放了nginx服务器对WEB服务提供的主要支持。
modules目录下:存放了http模块的实现源码
modules目录之外:存放了实现了Nginx服务器提供Http服务需要依赖的的数据结构定义,初始化,完成网络连接的建立,管理和断开的功能,数据报文解析,服务器管理的功能。
mail:存放了实现服务器邮件服务的源码,smtp,pops,imap协议等。
misc: 里面存放了两个文件,cpp_test 测试程序中引用的头文件是否与C++兼容。google_perftools 支持googleperftools的使用。
os: unix,win32,存放两个系统的特殊实现
stream:
7.nginx和lua的使用,加载流程,为什么lua?
8.nginx 和其他系统的集成,mysql,redis,MongoDB
9.nginx如何解决“惊群问题”?
10.upstream 是反向代理的基础,它是nginx在http处理框架里实现了upstream框架,提供了全异步,高性能的请求转发机制,能够让nginx超越单机的限制,访问任意第三方应用服务器的收发数据,获得扩展能力。
11.http handler ,filter模块,是http中殿堂中最闪亮的厅堂
12.nginx http 子请求
13. ngx_http_request_s
1.背景 创始人 基于什么目的 解决什么问题 定位
由1994年毕业于俄罗斯国立莫斯科鲍曼技术大学的Igor Sysoerv 为俄罗斯访问量居首的Rambler.ru站点设计开发的。
是一款免费开源的高性能HTTP服务器及反向代理服务器产品,同时,也提供了IMAP/POP3代理服务等功能,在实际使用中,可以提供更为丰富的功能。(虚拟主机,地址重定向,静态文件缓存加速访问等)
3.Nginx 功能 反向代理 负载均衡(load balance)静态资源服务器 网关CGI
反向代理:转发前端请求
负载均衡:分流或者请求到多个后端网络节点,分别处理,保证前端用户的访问效率。策略:轮询,加权轮询,IP HASH 。扩展策略 url hash,fair(响应时间最小)
2.Nginx 特点 高并发(几万到几十万并发请求) 模块化(具体划分) 高稳定(dump机重启相比IIS apache少) 跨平台 (linux,OS X,Win)
4.Nginx 配置文件 nginx.conf 四大块 main events http->server->location
main:影响Nginx服务器整体运行的配置指令,全局(worker processes, 进程PID和日志存放路径,配置文件引入)
user user [group]
pid file
work_processes number | auto
error_log file
include file
accept_mutex on | off
event{}:影响服务器和用户的网络连接(是否允许同时接受多个网络连接,选取哪种事件驱动模型,每个worker最大连接数)影响性能。
use method;
worker_connections number
http{ //文件引入,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求上限。
server{ // 虚拟主机概念
listen port; 监听端口号
server_name name ...; 对外提供的虚拟主机名 (对于匹配方式优先级,准确匹配>开始匹配>结尾匹配>正则表达式匹配)
location [ = | ~ | ~* | ^~ ] uri { //在多个location块中记录搜索是否有匹配项,获取匹配度 最高的
root path; //path 为服务器收到请求后 查找资源的根目录路径 请求:/data/index.htm /path/data/index.html
}
location [ = | ~ | ~* | ^~ ] uri {
alias path; //path 为服务器收到请求后 改变接收到的URI请求路径 请求:/data/index.htm /path/index.html
}
error_page 410= 301 /path
location /path{
root /path1/path2/serverpath;
}
}
server{
location{}
}
...
}
分别讲解里面有哪些主要用的配置指令
rewrite,proxy_pass, upstream
upstream name {
ip_hash;
server address [ weight | max_fails | fail_timeout | backup | down]
}
正向代理服务的使用
server{
resolver 8.8.8.8
listen 82;
location /{
proxy_pass URL; //代理服务器协议和地址
}
}
rewrite :实现url的重写 rewrite regex replacement
5.Nginx变量使用 :和配置文件里固定的参数不同,值是可变的,善用变量能极大的增加Nginx配置的灵活性,让
配置文件更像是一种小型语言。
目前变量只用于HTTP块,很多变量与具体的请求相关,URI,IP地址。
/ngx_http_variable_s
/ngx_http_core_main_conf_t //配置解析完成之后,会把模块所有的定义的变量全部集中存储在这里。
/ngx_http_request_t ngx_http_variable_value *var;//存放所有可能的变量
set $variable value 变量第一个字符$
5.Nginx 具体源码分析
基本数据结构
模块化 module
ngx_conf_file.h / ngx_module_s
生命周期 数据结构 cycle
Nginx main()初始化过程
结合树形表
内存管理:使用内存池的方式对程序使用的内存进行统一分配和回收,是当下比较时尚的做法,也是行之有效的管理手段,很大程度上降低了内存管理的难度。
1.内存池的逻辑结构:ngx_palloc.h/ngx_pool_s ngx_pool_date_t ngx_pool_large_s ngx_pool_clean_s
图示figure2
2.内存池的管理 创建,销毁,重置
ngx_create_pool ngx_destroy_pool ngx_reset_pool
3.内存的使用:申请,释放,回收
ngx_pcalloc() ngx_pnalloc() ngx_calloc()
大内存直接调用ngx_free(),其他数据空间的释放给内存池销毁的过程。
在Nginx程序中,有些数据类型在回收其所占的内存资源的时,不能直接通过释放内存空间的方式进行,而
需要再释放之前对数据进行指定的操作。
ngx_palloc.c /ngx_pool_cleanup_add()
结合图示
内存调用结果分配示意图
介绍ngx_destroy_pool,ngx_create_pool
创建好内存池以后,服务器程序向内存池申请内存的方法:ngx_palloc(),ngx_pnalloc(),ngx_calloc()
http框架
1.handler模块:直接处理客户端请求,产生响应数据。
2.filter模块:对handler产生的数据做各种加工过滤处理
3.upstream模块:实现反向代理功能,转发请求到上游服务器,从后端获取响应数据再发回给客户端。
/ngx_http.h ngx_http_request_s
贯穿Nginx处理HTTP请求的整个流程,可以说在Nginx中处理Http请求就是操作Ngx_http_request_t这个数据结构。
/http/ngx_http_request.c ngx_http_create_request 新建
为了能更加细粒度控制处理流程,Nginx划分了11个精确的阶段hook点,相互协作以流水线的方式处理请求,达到高度灵活性。
可以把阶段理解为调用接口,里面可以存储数个回调函数,Nginx会逐个调用里面的函数,完成请求的处理。
http/ngx_http_core_module.h ngx_http_phases 其中四个阶段 只能由http框架使用。
FIND_CONFIG_PHASE,POST_REWRITE_PHASE,POST_ACCESS_PHASE,TRY_FILES_PHASE
http/ngx_http_core_module.h ngx_http_phase_t(存储每个阶段可用的处理函数handler)
http/ngx_http_core_module.h ngx_http_core_main_conf_t(定义了数组phasess,用来存储处理阶段所有可用的handler)
2.filter ngx.http.c
ngx_http_output_header_filter_pt
ngx_http_output_body_filter_pt
这个过滤处理阶段 可以理解为在 NGX_HTTP_CONTENT_PHASE 和 NGX_HTTP_LOG_PHASE的一个无名阶段。响应头和响应体
经过过滤器链表的加工处理,最后才真正发送给客户端。
3.upstream :为了访问外部资源,Nginx在HTTP处理框架里面提供了upstream框架,提供了全异步,高性能的请求转发机制,让
Nginx超越单机的限制,访问任意的第三方应用服务器收发数据。同时,它也是Nginx反向代理的基础。
6.http 阶段划分 哪些阶段我们可以介入,哪些阶段不可介入
一个http请求的生命周期 从出生到死亡
7.Nginx 事件机制 event epoll poll select kqueue 区别 源码实现
WEB服务器和客户端的关系是1对多,其必须有能力同时为多个客户端提供服务。
方式有三种1.多进程(apache)2.多线程(IIS)3.异步方式(Nginx)
同步:发送方发送完请求之后,需要等到接收方发回的相应之后,才接着发送下一个请求。
异步:发送方发送完请求之后,不需要等到接收方的相应,就接着发送下一个请求。
阻塞:调用结果返回之前,当前的线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行。
非阻塞:如果调用结果不能马上返回,当前线程不会被挂起,而是立即返回执行下一个调用。
产生了同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
Nginx 如何处理客户端请求:当work_processes 接收到客户端的请求,调用IO进行处理,如果不能立马获取结果,就去 处理其他的
请求;而客户端在此期间也无需等待响应。当IO调用返回结果的时候,就会通知工作线程。该进程得到通知,暂时挂起当前处理的事务,
去响应客户端的请求。
至于进程怎么获取通知,
1.隔一段时间检查有没有完成IO,完成则响应。
2.IO调用完成后主动通知工作线程。
10.设计思路和技巧
1.在加载配置文件的时候,就把文件模块结构化在内存中,不必要每次都进行请求。
2.集中管理内存,保证了稳定性。
3.采用指针传递,并非值传递,因为值传递需要复制一份,假如数据量大,消耗空间和时间。
4.分模块
5.malloc内存之后进行NULL检测,一个好的编程实践。
6.proactor是Nginx快速高效的根本秘密
11.自我体会
Nginx背景:俄国 针对一个当地并发访问量很大的网站专门写了一个http服务器,由于性能优异,在全球异军突起。
设计定位:高并发,高拓展,跨平台
优秀特性:高并发,高拓展,跨平台
特点:高性能是品质,高稳定性是保障,低资源消耗是基石,而高扩展性是Nginx生命力的源泉
架构设计原则
模块加载过程:模块独立,
事件分发模块
采用了异步非阻塞,提升事件处理效率
win : select, Mac:kqueue,linux:poll,epoll.
2.为什么要用Nginx?
Nginx优点和劣势
优点:同上
劣势:模块单一,如果需要其他模块只能去集成其他功能或者自定义模块嵌入进去,且没有提供一个成熟的调试方案出来。
3.怎么去使用Nginx?
Nginx配置,相关模块的使用,相关参数的配置
在我们下载Nginx包下来后,在conf目录下有一个conf.xml 文件,这个文件定义了全局变量参数,需要加载的模块,日志路径等相关信息,我们通过/sbin/nginx c /target/目录,指定执行的conf.xml加载的路径,通过/sbin/nginx -p /target/nginx目录 启动。这样,我们通过发起http请求的话,经过location的导向会进入到默认的index.html路径下。
通过嵌入其他业务功能模块,利用Nginx优秀的事件处理机制,满足我们的业务需求,网关,鉴权等
4.什么时候去使用Nginx?
业务到达什么时候可以使用Nginx,或者说有什么特性回去考虑Nginx。
5.在哪里使用Nginx?
6.Main源码初步解析
Nginx模块包结构以及包的划分
包的划分:
core:存放了Nginx使用到的关键的数据结构和内核实现的源码。
nginx.*:包含了Nginx程序入口函数main的文件,实现了对Nginx各模块整体的控制。
ngx_connection.*:实现了网络连接管理的的功能
ngx_inet.*:实现了与网络Socket套接字相关的功能
ngx_cycle.*:实现了对系统整个运行过程中的参数,资源的统一管理和调配。
ngx_log.*:实现了日志输出了和管理的相关功能。
ngx_file.*:实现了文件读写的相关功能。
ngx_regex.*:实现了服务器对正则表式的支持。
ngx_string.*:实现了对字符串处理的基本功能。
ngx_times.*:实现了对时间的获取和处理的功能。
ngx_array(list,hash,tree,queue,chain等相关数据结构),内存管理(ngx_palloc,shmtx,open_file_cache),
enent:存放实现了服务器的事件驱动模型,实现了服务器的消息机制。影响服务器的承载能力。
modules目录下:实现了Nginx服务器支持的各类事件驱动模型(AIO,epoll,kqueue,rtsig,win32平台和Linux平台select,/dev/poll,poll等)
modules目录之外:实现了和时间驱动机制相关的数据结构的定义和初始化功能,完成事件的接收,传递,管理功能
http:存放了nginx服务器对WEB服务提供的主要支持。
modules目录下:存放了http模块的实现源码
modules目录之外:存放了实现了Nginx服务器提供Http服务需要依赖的的数据结构定义,初始化,完成网络连接的建立,管理和断开的功能,数据报文解析,服务器管理的功能。
mail:存放了实现服务器邮件服务的源码,smtp,pops,imap协议等。
misc: 里面存放了两个文件,cpp_test 测试程序中引用的头文件是否与C++兼容。google_perftools 支持googleperftools的使用。
os: unix,win32,存放两个系统的特殊实现
stream:
7.nginx和lua的使用,加载流程,为什么lua?
8.nginx 和其他系统的集成,mysql,redis,MongoDB
9.nginx如何解决“惊群问题”?
10.upstream 是反向代理的基础,它是nginx在http处理框架里实现了upstream框架,提供了全异步,高性能的请求转发机制,能够让nginx超越单机的限制,访问任意第三方应用服务器的收发数据,获得扩展能力。
11.http handler ,filter模块,是http中殿堂中最闪亮的厅堂
12.nginx http 子请求
13. ngx_http_request_s
1.背景 创始人 基于什么目的 解决什么问题 定位
由1994年毕业于俄罗斯国立莫斯科鲍曼技术大学的Igor Sysoerv 为俄罗斯访问量居首的Rambler.ru站点设计开发的。
是一款免费开源的高性能HTTP服务器及反向代理服务器产品,同时,也提供了IMAP/POP3代理服务等功能,在实际使用中,可以提供更为丰富的功能。(虚拟主机,地址重定向,静态文件缓存加速访问等)
3.Nginx 功能 反向代理 负载均衡(load balance)静态资源服务器 网关CGI
反向代理:转发前端请求
负载均衡:分流或者请求到多个后端网络节点,分别处理,保证前端用户的访问效率。策略:轮询,加权轮询,IP HASH 。扩展策略 url hash,fair(响应时间最小)
2.Nginx 特点 高并发(几万到几十万并发请求) 模块化(具体划分) 高稳定(dump机重启相比IIS apache少) 跨平台 (linux,OS X,Win)
4.Nginx 配置文件 nginx.conf 四大块 main events http->server->location
main:影响Nginx服务器整体运行的配置指令,全局(worker processes, 进程PID和日志存放路径,配置文件引入)
user user [group]
pid file
work_processes number | auto
error_log file
include file
accept_mutex on | off
event{}:影响服务器和用户的网络连接(是否允许同时接受多个网络连接,选取哪种事件驱动模型,每个worker最大连接数)影响性能。
use method;
worker_connections number
http{ //文件引入,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求上限。
server{ // 虚拟主机概念
listen port; 监听端口号
server_name name ...; 对外提供的虚拟主机名 (对于匹配方式优先级,准确匹配>开始匹配>结尾匹配>正则表达式匹配)
location [ = | ~ | ~* | ^~ ] uri { //在多个location块中记录搜索是否有匹配项,获取匹配度 最高的
root path; //path 为服务器收到请求后 查找资源的根目录路径 请求:/data/index.htm /path/data/index.html
}
location [ = | ~ | ~* | ^~ ] uri {
alias path; //path 为服务器收到请求后 改变接收到的URI请求路径 请求:/data/index.htm /path/index.html
}
error_page 410= 301 /path
location /path{
root /path1/path2/serverpath;
}
}
server{
location{}
}
...
}
分别讲解里面有哪些主要用的配置指令
rewrite,proxy_pass, upstream
upstream name {
ip_hash;
server address [ weight | max_fails | fail_timeout | backup | down]
}
正向代理服务的使用
server{
resolver 8.8.8.8
listen 82;
location /{
proxy_pass URL; //代理服务器协议和地址
}
}
rewrite :实现url的重写 rewrite regex replacement
5.Nginx变量使用 :和配置文件里固定的参数不同,值是可变的,善用变量能极大的增加Nginx配置的灵活性,让
配置文件更像是一种小型语言。
目前变量只用于HTTP块,很多变量与具体的请求相关,URI,IP地址。
/ngx_http_variable_s
/ngx_http_core_main_conf_t //配置解析完成之后,会把模块所有的定义的变量全部集中存储在这里。
/ngx_http_request_t ngx_http_variable_value *var;//存放所有可能的变量
set $variable value 变量第一个字符$
5.Nginx 具体源码分析
基本数据结构
模块化 module
ngx_conf_file.h / ngx_module_s
生命周期 数据结构 cycle
Nginx main()初始化过程
结合树形表
内存管理:使用内存池的方式对程序使用的内存进行统一分配和回收,是当下比较时尚的做法,也是行之有效的管理手段,很大程度上降低了内存管理的难度。
1.内存池的逻辑结构:ngx_palloc.h/ngx_pool_s ngx_pool_date_t ngx_pool_large_s ngx_pool_clean_s
图示figure2
2.内存池的管理 创建,销毁,重置
ngx_create_pool ngx_destroy_pool ngx_reset_pool
3.内存的使用:申请,释放,回收
ngx_pcalloc() ngx_pnalloc() ngx_calloc()
大内存直接调用ngx_free(),其他数据空间的释放给内存池销毁的过程。
在Nginx程序中,有些数据类型在回收其所占的内存资源的时,不能直接通过释放内存空间的方式进行,而
需要再释放之前对数据进行指定的操作。
ngx_palloc.c /ngx_pool_cleanup_add()
结合图示
内存调用结果分配示意图
介绍ngx_destroy_pool,ngx_create_pool
创建好内存池以后,服务器程序向内存池申请内存的方法:ngx_palloc(),ngx_pnalloc(),ngx_calloc()
http框架
1.handler模块:直接处理客户端请求,产生响应数据。
2.filter模块:对handler产生的数据做各种加工过滤处理
3.upstream模块:实现反向代理功能,转发请求到上游服务器,从后端获取响应数据再发回给客户端。
/ngx_http.h ngx_http_request_s
贯穿Nginx处理HTTP请求的整个流程,可以说在Nginx中处理Http请求就是操作Ngx_http_request_t这个数据结构。
/http/ngx_http_request.c ngx_http_create_request 新建
为了能更加细粒度控制处理流程,Nginx划分了11个精确的阶段hook点,相互协作以流水线的方式处理请求,达到高度灵活性。
可以把阶段理解为调用接口,里面可以存储数个回调函数,Nginx会逐个调用里面的函数,完成请求的处理。
http/ngx_http_core_module.h ngx_http_phases 其中四个阶段 只能由http框架使用。
FIND_CONFIG_PHASE,POST_REWRITE_PHASE,POST_ACCESS_PHASE,TRY_FILES_PHASE
http/ngx_http_core_module.h ngx_http_phase_t(存储每个阶段可用的处理函数handler)
http/ngx_http_core_module.h ngx_http_core_main_conf_t(定义了数组phasess,用来存储处理阶段所有可用的handler)
2.filter ngx.http.c
ngx_http_output_header_filter_pt
ngx_http_output_body_filter_pt
这个过滤处理阶段 可以理解为在 NGX_HTTP_CONTENT_PHASE 和 NGX_HTTP_LOG_PHASE的一个无名阶段。响应头和响应体
经过过滤器链表的加工处理,最后才真正发送给客户端。
3.upstream :为了访问外部资源,Nginx在HTTP处理框架里面提供了upstream框架,提供了全异步,高性能的请求转发机制,让
Nginx超越单机的限制,访问任意的第三方应用服务器收发数据。同时,它也是Nginx反向代理的基础。
6.http 阶段划分 哪些阶段我们可以介入,哪些阶段不可介入
一个http请求的生命周期 从出生到死亡
7.Nginx 事件机制 event epoll poll select kqueue 区别 源码实现
WEB服务器和客户端的关系是1对多,其必须有能力同时为多个客户端提供服务。
方式有三种1.多进程(apache)2.多线程(IIS)3.异步方式(Nginx)
同步:发送方发送完请求之后,需要等到接收方发回的相应之后,才接着发送下一个请求。
异步:发送方发送完请求之后,不需要等到接收方的相应,就接着发送下一个请求。
阻塞:调用结果返回之前,当前的线程从运行状态被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行。
非阻塞:如果调用结果不能马上返回,当前线程不会被挂起,而是立即返回执行下一个调用。
产生了同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
Nginx 如何处理客户端请求:当work_processes 接收到客户端的请求,调用IO进行处理,如果不能立马获取结果,就去 处理其他的
请求;而客户端在此期间也无需等待响应。当IO调用返回结果的时候,就会通知工作线程。该进程得到通知,暂时挂起当前处理的事务,
去响应客户端的请求。
至于进程怎么获取通知,
1.隔一段时间检查有没有完成IO,完成则响应。
2.IO调用完成后主动通知工作线程。
10.设计思路和技巧
1.在加载配置文件的时候,就把文件模块结构化在内存中,不必要每次都进行请求。
2.集中管理内存,保证了稳定性。
3.采用指针传递,并非值传递,因为值传递需要复制一份,假如数据量大,消耗空间和时间。
4.分模块
5.malloc内存之后进行NULL检测,一个好的编程实践。
6.proactor是Nginx快速高效的根本秘密
11.自我体会