初始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进程
,初始化监听
的socket
Master进程
,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参数
指定的配置
,这个配置
一定是配置文件
中没有的
或被注释掉的
,如果配置文件
中有这个配置
,则会报错