nginx原理

2020-08-07  本文已影响0人  心似南风

nginx原理了解

1.nginx简介

nginx是一款自由的,开源的,高性能的HTTP服务器和反向代理服务器;同时也是一个IMAO,POP3,SMTP代理服务器;NGINX可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现.

1.1 Nginx三个主要应用场景

2.为什么选择nginx?

(1) 更快
这表现在两个方面:

(2) 高扩展性

(3)高可靠性

(4)低内存消耗

(5)单机支持10万以上的并发连接

(6)热部署

(7)最自由的BSD许可协议

3、Nginx高效的原因及原理解析

3.1、服务器的网络服务模型

web服务器和客户端是一对多的关系,Web服务器必须有能力同时为多个客户端提供服务。一般来说完成并行处理请求工作有三种方式



4. 多进程的master-worker IO复用方式

4.1nginx的基本架构

image.png

四、IO复用/EventLoop

1.IO复用是什么?

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程,目前支持I/O多路复用的系统调用有 select , poll , epoll,I/O多路复用就是通过一种机制,一个进程可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。

2、select跟poll

Select介绍:

监视并等待多个文件描述符的属性变化(可读、可写或错误异常)。 select 函数监视的文件描述符分 3 类,分别是writefds、readfds、和 exceptfds。调用
后 select 会阻塞,直到有描述符就绪(有数据可读、可写、或者有错误异常),或者超时( timeout 指定等待时间),函数才返回。当 select ()函数返回
后,可以通过遍历 fdset,来找到就绪的描述符,并且描述符最大不能超过1024

Poll 介绍:

poll 的机制与 select 类似,与 select 在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是 poll 没有最大文件描
述符数量的限制。 poll 和 select 同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是
否就绪,它的开销随着文件描述符数量的增加而线性增大。
问题:
     select/poll 问题很明显,它们需要循环检测连接是否有事件。如果服务器有上百万个连接,在某一时间只有一个连接向服务器发送了数据,
select/poll 需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU资源。

epoll:

epoll 是在2.6内核中提出的,是之前的 poll 和 poll 的增强版本。相对于 select 和 poll 来说, epoll 更加灵活,没有描述符限制,无需轮询。
epoll 使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中。
简单点来说就是当连接有I/O流事件产生的时候, epoll 就会去告诉进程哪个连接有I/O流事件产生,然后进程就去处理这个进程。
这里可以多加一个选择 worker 的原因,因为 worker 是基于 epoll 的异步非阻塞的服务器程序。自然, worker 能够轻松处理10w+的并发连接,也就无可厚非
了。

五、进程相关

1.fork函数

fork函数将创建调用的进程副本,并非根据完全不同的程序创建进程,而是复制正在运行的、调用fork函数的进程,但因为通过同一个进程、复制相同的内存空间,之后需要根据返回值加以区分:

2、处理僵尸进程

对于多进程程序而言,父进程一般需要跟踪子进程的退出状态。因此,当子进程结束运行时,内核不会立即释放该进程的进程表表项,以满足父进程后续对该子进程退出信息的查询 (如果父进程还在运行)。
在子进程结束运行之后,父进程读取其退出状态之前,我们称该子进程处于俚尸态,另外一种使子进程进人僵尸状态是:父进程结束或者异常终止,而子进程继续运行。
由此可见,无论哪种情况,如果父进程没有正确地处理子进程的返冋信息,子进程都将停留在僵尸态,并占据若内核资源.这是绝对不能容许的,毕竞内核资源有限,所以我们需要做的就是在父进程中调用wait函数等待查询子进程的信息,回收子进程。

六、nginx操作

6.1 nginx快速编译安装

yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel

wget http://nginx.org/download/nginx-1.14.1.tar.gz
tar -zxvf nginx-1.14.1.tar.gz
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module\
--with-http_realip_module\
--with-http_sub_module \
--with-http_ssl_module\
--with-http_realip_module \
--with-http_sub_module \
--with-http_gunzip_module\
--with-http_gzip_static_module\
--with-http_auth_request_module\
--with-http_random_index_module \
--with-http_slice_module \
--with-http_stub_status_module

make && make install
# 查看加载的模块及版本信息
nginx -V

6.2 配置文件解释

main (全局设置), main 部分设置的指令将影响其它所有部分的设置;
http(http服务器设置),http标准核心模块,http服务的相应配置
server (主机设置)
接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机( server )的概念来将这些不同的服务配置隔离
location (URL匹配特定位置后的设置), location 部分用于匹配网页位置(比如,根目录“/”,“/images”,等等), server 是对应一个域名进行的配置,而location 是在一个域名下对更精细的路径进行配置.

详细解析

配置语法说明:
1、配置文件由指令与指令块构成
2、每条指令以;分号结尾,指令与参数间以空格符号分隔
3、指令块以{}大括号将多条指令组织在一起
4、使用#符号添加注释,提高可读性
5、include语句允许组合多个配置文件以提升可维护性
6、使用$符号使用变量
7、部分指令的参数支持正则表达式
Nginx的各种指令以及配置繁多,有些配置可以在如下的链接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官方文档上查看

6.3 nginx常用命令

1、查看Nginx的版本号:nginx -V
2、停止 nginx -s stop
3、退出 nginx -s quit
4、重启加载配置 nginx -s reload
5、配置文件启动 nginx -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的
6、nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

6.4、nginx控制信号

再次回过头看看nginx的原理图,我们还可以通过信号去操作 nginx ,默认, nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中

命令 解释
TERM,INT 快速关闭
QUIT 从容关闭
HUP 重载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程

nginx 停止命令,等所有请求结束后关闭服务
Kill -QUIT nginx 主进程号
重新载入配置
kill -HUP nginx 主进程号

上一篇 下一篇

猜你喜欢

热点阅读