一、nginx框架
1.1 多进程模型
Nginx低资源消耗、高稳定、高性能的并发处理能力,来源于其优秀的代码架构。它采用了多进程模型,使自身具有低资源消耗的特性。以事件驱动的异步非阻塞多进程请求处理模型,使Nginx的工作进程通过异步非阻塞的事件处理机制,实现了高性能的并发处理能力,让每个连接的请求均可在Nginx进程中以工作流的方式得到快速处理。
Nginx采用的是固定数量的多进程模型,由一个主进程(管理进程)(Master Process)和数量与主机CPU核数相同的工作进程(Worker)协同处理各种事件。
- 主管理进程负责工作进程的配置加载、启停等操作,工作进程负责处理具体请求。Master不处理具体的TCP/HTTP请求,只接收UNIX信号,管理和监控Worker进程;
- 进程间的资源都是独立的,每个工作进程处理多个连接,每个连接由一个工作进程全
权处理,不需要进行进程切换,也就不会产生由进程切换引起的资源消耗问题; - Nginx的多个进程间就是通过信号、管道、共享内存的方式共享数据的,主进程启动时创建共享内存,工作进程创建(fork方式)完成后,所有的进程都开始使用共享内存;
- 当某个worker因为意味中止时,master进程会fork出一个新的worker进程。
主进程:
master进程主要用来管理worker进程,具体包括如下4个主要功能:
1)接受来自外界的信号。其中master循环中的各项标志位就对应着各种信号,如:ngx_quit代表QUIT信号,表示优雅的关闭整个服务。
2)向各个worker进程发送信。比如ngx_noaccept代表WINCH信号,表示所有子进程不再接受处理新的连接,由master向所有的子进程发送QUIT信号量。
3)监控worker进程的运行状态。比如ngx_reap代表CHILD信号,表示有子进程意外结束,这时需要监控所有子进程的运行状态,主要由ngx_reap_children完成。
4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程。主要也是在ngx_reap_children。
nginx为什么不采用多线程的方式:
- 采用独立的进程,可以让互相之间不会影响。一个进程异常崩溃,其他进程的服务不会中断,提升了架构的可靠性。
-
进程之间不共享资源,不需要加锁,所以省掉了锁带来的开销。
1.2 模块化
Nginx一直秉持模块化的理念,其模块化的架构中,除了少量的主流程代码,都是模块。模块化的设计为Nginx提供了高度的可配置、可扩展、可定制特性。
模块代码包括核心模块和功能模块两个部分:核心模块负责维护进程的运行、内存及事件的管理;功能模块则负责具体功能应用的实现,包括路由分配、内容过滤、网络及磁盘数据读写、代理转发、负载均衡等操作。
二、nginx配置指令
2.1 nginx配置指令
Nginx的配置指令很多,为了方便理解和使用,可以按照其在代码中的分布,将其分为核心配置指令和模块配置指令两大类。
核心配置指令分为事件核心配置指令和HTTP核心配置指令。
- 事件核心配置指令主要是与Nginx自身软件运行管理及Nginx事件驱动架构有关的配置指令;
- HTTP核心配置指令是对客户端从发起HTTP请求、完成HTTP请求处理、返回处理结果,到关
闭HTTP连接的完整过程中的各个处理方法进行配置的配置指令。 - 模块配置指令是在每个Nginx模块中对所在模块的操作方法进行配置的配置指令。
2.2 核心配置指令
2.2.1 Nginx配置文件(nginx.conf)的结构解析
配置文件都会保存在/usr/local/nginx/conf目录下,在配置文件目录下,Nginx默认的主配置文件是nginx.conf,这也是Nginx唯一的默认配置入口。
conf/
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types
├── mime.types.default
├── nginx.conf
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├──uwsgi_params
├──uwsgi_params.default
├──win-utf
其中,以“.default”为扩展名的文件是Nginx配置文件的配置样例文件。
nginx.conf:Nginx默认的配置入口文件,语法格式如下
#user nobody;
worker_processes 1; # 只启动一个工作进程
events { #配置event 配置块
worker_connections 1024; # 每个工作进程的最大连接为1024
}
http { #配置http 配置块
include mime.types; # 引入MIME类型映射表文件
default_type application/octet-stream; #全局默认映射类型为application/octet-stream
#log_format main '$remote_addr -$remote_user [$time_local] "$request" '
# '$status $body_bytes_sent"$http_referer" '
# '"$http_user_agent”"$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on; # 启用零复制机制
keepalive_timeout 65; # 保持连接超时时间为65s
server { #配置server 配置块
listen 80; # 监听80端口的网络连接请求
server_name localhost; # 虚拟主机名为localhost
#charset koi8-r;
#access_log logs/host.access.log main;
location / { #location配置块
root html; #设置http请求的根目录
index index.html index.htm;#设置默认的index文件
}
error_page 500 502 503 504 /50x.html; #设置错误返回页
location = /50x.html { #设置http请求的根目录
root html;
}
}
}
events和http所包含的部分分别为事件指令域和HTTP指令域,指令域内的指令则明确约定了该区域内的指令的应用范围。
核心配置指令可分为进程管理、进程调优、进程调试、事件处理四部分。
(1)worker_processes 进程管理
用户对nginx的运行方式、动态加载模块、日志输出等配置的基础指令。
worker_processes、master_processes、deamon等。
(2)events
Ngnix采用事件驱动,利用操作系统内核提供的epoll、kqueue等系统调用处理网络连接,events处理事件机制。
(3)http
ngnix使用http配置http相关的所有功能,包括cache、fastcgi、gzip、server(虚拟主机)、location、proxy、upstream(配置上游服务器)等。
server指令域被包含于http指令域中,同时又包含了location指令域,各指令域中的共
用范围逐层被上层指令域限定,可见各指令域匹配的顺序是由外到内的。
包含在最内层的指令将对外层同名指令进行指令值覆盖,并以最内层指令配置为最终生效配置。
其他配置:
TCP/UDP 服务、反向代理、负载均衡、代理转发。