初始nginx
华子目录
- nginx介绍
- nginx功能介绍
- 基础特性
- web服务相关功能
- `nginx进程结构`
- `web请求处理机制`
- `nginx进程间通信`
- nginx启动与http连接建立
- http处理过程
- `nginx模块介绍`
- nginx命令演示
nginx介绍
-
nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
-
nginx官网:http://nginx.org -
nginx的其它二次发行版:
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目官网: http://tengine.taobao.org/OpenResty:基于Nginx与Lua语言的高性能Web平台,章亦春团队开发,官网:http://openresty.org/cn/
nginx功能介绍
静态的web资源服务器html,图片,js,css,txt等静态资源http/https协议的反向代理- 结合
FastCGI/uWSGI/SCGI等协议反向代理动态资源请求 tcp/udp协议的请求转发(反向代理)imap4/pop3协议的反向代理
基础特性
模块化设计,较好的扩展性高可靠性支持热部署:不停机更新配置文件,升级版本,更换日志文件低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存event-driven,aio,mmap,sendfile
web服务相关功能
虚拟主机(server)- 支持
keep-alive和管道连接(利用一个连接做多次请求) 访问日志(支持基于日志缓冲提高其性能)url rewirte路径别名基于IP及用户的访问控制- 支持
速率限制及并发数限制 重新配置和在线升级而无需中断客户的工作进程
nginx进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定
Nginx是多进程组织模型,而且是一个由Master主进程和多个Worker工作进程组成

主进程(master process)的功能:
对外接口:接收外部的操作(信号)对内转发:根据外部操作的不同,通过信号管理Worker监控:监控worker进程的运行状态,worker进程异常终止后,自动重启worker进程- 读取
Nginx配置文件并验证其有效性和正确性 建立、绑定和关闭socket连接按照配置生成、管理和结束worker工作进程接受外界指令,比如重启、升级及退出服务器等指令不中断服务,实现平滑升级,重启服务并应用新的配置开启日志文件,获取文件描述符不中断服务,实现平滑升级,升级失败进行回滚处理编译和处理perl脚本
工作进程(worker process)的功能:
所有Worker进程都是平等的实际处理:网络请求,由Worker进程处理Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源(worker进程数量一般与cpu核心数一一对应)增加上下文切换的损耗接受处理客户的请求- 将
请求依次送入各个功能模块进行处理 I/O调用,获取响应数据- 与
后端服务器通信,接收后端服务器的处理结果 缓存数据,访问缓存索引,查询和调用缓存数据发送请求结果,响应客户的请求接收主程序指令,比如重启、升级和退出等

nginx进程间通信
工作进程是由主进程生成的,主进程使用fork()函数在Nginx服务器启动过程中主进程根据配置文件决定启动worker工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的workder工作进程,主进程生成worker工作进程后会将新生成的worker工作进程加入到worker工作进程表中,并建立一个单向的管道并将其传递给worker工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互
worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息,就只能通过主进程来实现- 为了实现
worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了worker进程之间的通信- 另外
worker进程可以通过共享内存来通讯,比如upstream中的zone,或者limit_req、limit_conn中的zone等。操作系统提供了共享内存机制

nginx启动与http连接建立

Nginx启动时,Master进程加载配置文件Master进程,初始化监听的socketMaster进程,fork出多个Worker进程Worker进程,竞争新的连接,获胜方通过三次握手,建立Socket连接,并处理请求
http处理过程

nginx模块介绍
nginx有多种模块
核心模块:是Nginx服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能标准HTTP模块:提供HTTP协议解析相关的功能,比如:端口配置 、 网页编码设置 、 HTTP响应头设置等等可选HTTP模块:主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash多媒体传输、解析GeoIP请求、网络传输压缩、安全协议SSL支持等邮件服务模块:主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持Stream服务模块:实现反向代理功能,包括TCP协议代理第三方模块:是为了扩展Nginx服务器应用,完成开发者自定义功能,比如:Json支持、Lua支持等
模块分类:
核心模块:core module
标准模块:
HTTP模块: ngx_http_*
Mail模块: ngx_mail_*
Stream模块:ngx_stream_*
第三方模块

nginx命令演示
#-v只会列出nginx的版本
[root@nginx-node1 ~]# nginx -v
nginx version: nginx/1.24.0#-V会列出编译时用到的模块和nginx版本
[root@nginx-node1 ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
built with OpenSSL 3.0.1 14 Dec 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module
#-t检查nginx主配置是否正确
[root@nginx-node1 ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#优雅停止服务,即所有请求处理完后退出服务
[root@nginx-node1 ~]# nginx -s quit #强行停止服务
[root@nginx-node1 ~]# nginx -s stop #重新加载配置文件
#在不关闭nginx的情况下,重新reload加载配置文件后,会回收旧的worker进程,重新起一个新的worker进程,master进程不变
[root@nginx-node1 ~]# nginx -s reload
#-g:开启nginx时,指定全局配置
[root@nginx-node1 ~]# nginx -g "worker_processes 1;"

[root@nginx-node1 ~]# nginx -s stop
[root@nginx-node1 ~]# nginx -g "worker_processes 6;"
[root@nginx-node1 ~]# ps -axf | grep nginx770 ? Ss 0:00 avahi-daemon: running [nginx-node1.local]3128 pts/2 S+ 0:00 | \_ grep --color=auto nginx3120 ? Ss 0:00 nginx: master process nginx -g worker_processes 6;3121 ? S 0:00 \_ nginx: worker process3122 ? S 0:00 \_ nginx: worker process3123 ? S 0:00 \_ nginx: worker process3124 ? S 0:00 \_ nginx: worker process3125 ? S 0:00 \_ nginx: worker process3126 ? S 0:00 \_ nginx: worker process
- 通过
-g参数指定的配置,这个配置一定是配置文件中没有的或被注释掉的,如果配置文件中有这个配置,则会报错
