贵阳网站建设王道下拉惠,个人主页是指什么,兴化网页定制,xml网站地图怎么做概述
我们了解下配置文件中的一个全局段#xff0c;有哪些配置参数#xff0c;包括后面的 events 字段#xff0c;有哪些配置参数这里面也有一些核心参数, 对于我们Nginx运行的性能也是有很重要的帮助我们现在首先关注整个 main 段的一个核心参数用法所谓 main 段#xff…概述
我们了解下配置文件中的一个全局段有哪些配置参数包括后面的 events 字段有哪些配置参数这里面也有一些核心参数, 对于我们Nginx运行的性能也是有很重要的帮助我们现在首先关注整个 main 段的一个核心参数用法所谓 main 段是指在 nginx.conf 配置文件中除了有 events 字段还有 http 段在此两个段之外的一些段我们都把它称为 main 段也就是我们的核心段, 如下 前面的这些配置信息并没有包含在某一个段中它直接写在我们整个配置文件中我们把这样一些参数就称之为 main 段也就是全局配置的配置main 端对于整个 nginx 都是生效的它们通常是来定义 Nginx 整个运行的一些相关参数 比如, 需要起几个 worker processes起几个 worker 子进程每一个 worker 子进程应该工作在哪一种模式下包括我们如何对我们的work子进程和我们的CPU核心进行一个绑定等等
核心参数 1 全局段核心参数
user user USERNAME [GROUP]解释指定运行nginx的worker子进程的属主和属组其中属组可以不指定示例user nginx nginx; pid pid DIR解释指定运行nginx的master主进程的pid文件存放路径示例pid /opt/nginx/logs/nginx.pid; worker_rlimit_nofile worker_rlimit_nofile number解释指定worker子进程可以打开的最大文件句柄数示例 worker rlimit nofile 20480; worker_rlimit_core worker_rlimit_core size解释指定worker子进程异常终止后的core文件用于记录分析问题示例worker rlimit core 50M;示例working_directory /opt/nginx/tmp; worker_processes worker processes number | auto解释指定nginx启动的worker子进程数量示例 worker_processes 4worker_processes auto; worker_cpu_affinity worker_cpu_affinity cpumask1 cpumask2…解释将每个worker子进程与我们的CPU物理核心绑定示例 worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心4个worker子进程worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 001000000100000010000000; # 8物理核心8个worker子进程worker cpu affinity 01 10 01 10; # 2个物理核心4个子进程备注将每个worker子进程与特定CPU物理核心绑定优势在于避免同一个worker子进程在不同的CPU核心上切换缓存失效降低性能其并不能真正的避免进程切换 worker_priority worker_priority number解释指定worker子进程的nice值以调整运行nginx的优先级通常设定为负值以优先调用 nginx示例 worker_priority -10 备注Linux默认进程的优先级值是120值越小越优先nice设定范围为-20到19 worker_shutdown_timeout time 解释指定worker子进程优雅退出时的超时时间示例worker_shutdown_timeout 5s; timer_resolution interval 解释worker子进程内部使用的计时器精度调整时间间隔越大系统调用越少有利于性 能提升反之系统调用越多性能下降示例worker_resolution 100ms; daemon on|off 解释设定nginx的运行方式前台还是后台前台用户调试后台用于生产示例daemon off;
2 ) 针对部分字段的详解 worker_rlimit_nofile 代表我们每一个 worker 子进程能够打开的最大文件句柄数linux上可以通过ulimit命令来看当前用户可以打开的一个文件句柄数linux的一个哲学就是一切皆文件对于每一个进程来说它能够打开的文件句柄数也是有限制的这是linux自身所固有的一个特性对于 Nginx 进程来说尤其是高并发的系统的而言我们在这儿必须要对这样一个参数进行一个设置默认配置下它跟我们系统的参数应该是一致的比如说 worker_rlimit_nofile 20480 对于每一个用户他所打开的文件具柄数也是不一样的对于work子进程来说在上面比如说我们指定 user nginx nginx它就使用 nginx 用户和组 默认打开的文件句柄数上面的设置意味着每一个worker子进程能够打开的最大文件句柄数就是 20480其实对于任何一个用户请求发送过来以后真正处理这些用户请求的都是我们的这个worker子进程对于worker 子进程来说每一个连接都会发起一个TCP连接TCP连接之后它会发送很多这样一些数据包文。对于每一个连接来说至少都需要一个套接字来维持这样一个连接其实一个套接字可以理解成它就是一个文件句柄。所以说我们的Nginx想要承载更大的并发量的话肯定把这个参数调高如果 worker_processes 设置成 4每个 woker 子进程设置为 20480那整个 Nginx 服务器所能够承载的最大并发数应该是 20480 * 4大概就是十一万多的并发量但是这个只是一个理论上的数值对 nginx 自身来说的话它并不能够承受这样的并发量我们通常单台服务器来说对于 nginx 这样一个用户来说它最大能够打开的文件句柄数都是有限制的最多是 65535这是我们linux的自身的一个最大限制也就是说我们整个操作系统来说最大可以打开的文件句柄数也就是 65535也就是说这样一个 woker 子进程所能够打开的文件句柄数即使设置了4个最多也就是 65535所以这里写 20480 其实是不可能真正达到 20480 * 4 这么多并环连接的但是在很多的一些配置文件中这可能不止写一个 20480可能写五万甚至十万的都有这意味着超额设置最起码来说对于高并发系统不会达到我们的瓶颈虽然我们达不到但是它会充分使用 linux 自身的一个特性去达到一个最顶峰的一个性能 worker_rlimit_core 用来记录我们的woker子进程因为某一些原因异常终止后或重启的日志这就是说我们如果设定了这样一个参数之后我们的worker 子进程在异常终止之后会自动去记录这样一个 core 文件我会把一些异常信息给记录到这样一个 core 文件中便于开发人员或者是运维人员在发现这样一个情况之后可以查找具体的原因查到是哪些原因导致了我们的worker 子进程出现上述问题便于进行改进参数 size 表示这样一个文件的大小默认情况下因为我们不指定 worker_rlimit_core它是不会记录这样一个 core 文件的同时还需要指定 core 文件的目录也就是通过 worker_directory 指定的目录这里有个问题在我们的 worker 子进程中比如上面指定了它启动的是 nginx 用户对真正情况下来说我们都知道我们的master进程是root用户运行的但是真正处理用户请求的是 worker子进程 和 nginx用户这又意味着你指定的目录, 对Nginx用户来说必须是具有写权限的保证我们的worker子进程能够在异常终止之后将正常的一个信息给写入到这样一个目录下 worker_processes 这个我们可以有两种用法第一种可以直接指定个数直接只写一个number比如说直接指定4那第二种情况下在Nginx的高版本中都有一个auto的属性也就是, worker_processes 会自动启动跟我们当前物理CPU核心的个数一致的一个子进程把它设定auto之后我们就不需要去管了只有Nginx服务自动去探测当前服务器上CPU的物理核心个数从而它将它设定为和物理核心个数一致的子进程 worker_cpu_affinity 也就是将我们的每一个worker子进程程与我们的CPU物理核心进行一个绑定来看下图对于我们当前的nginx进程来说呢它会启动一个 master process 管理进程 这个管理进程只是用来维护我们的work子进程更新配置文件并将新的配置文件信息传递给我们的work子进程但是它并不会真正的处理用户请求真正处理用户请求的是下面主进程复制出来的几个work子进程那假如说现在当前有4个work子进程不管是什么进程在CPU上都不可能是永远运行的也就是说这个CPU不可能永远归你一个人, 每一个进程需要去CPU上申请CPU资源运行的时候它通常会根据自己当前的一个优先级在CPU上申请一个时间片时间线就是一个时间, 申请了这样一个时间片之后它就开始等待CPU的调度在某一时刻CPU可能说OK你现在可以运行了这个时候我们的worker子进程就会被CPU所调度上去从而使用当前CPU的资源进行一个计算到了一定的时间片完了之后我们当前这个进程必须从当前的CPU上给退下来或者是进入睡眠状态或者是去处理一些等待一些其他的事情总之这个CPU他是不能再用了因为这个CPU可能需要被其他的进程进行调度使用现在就有一个问题比如说我们的 worker 子进程对于多核心的服务器架构来说比如说我们现在有4个物理核心和我们的worker子进程数量一样的物理核心比如说当前某一个时刻我们这个worker 子进程编号为 A, 其他的为 BCD比如说我们的 1号CPU 被A所调度了A在1号CPU上运行了一段时间之后由于时间片到了它必须要从1号CPU上切换下来一号CPU就被其他的一些进程调度了可能不是我们的 A 号worker子进程被其他linux的进程抢走去运行其他资源一段时间之后我们的worker子进程了又申请到时间片了又要去在CPU上运行了这个时候可能不是1号CPU去调度A这个worker子进程了可能这个时候A申请到的是第三颗CPU这个时候它再去第三个CPU上进行运行运行一段时间之后它再下来这样来回的在每一个CPU之间切换这样有一个最大的问题频繁的这些从CPU上运行又下来调度给其他进程这个进程切换的过程中注意进程切换在很多地方也称为上下文切换对于这样一些进程切换来说都是有性能开销的我们应该在一种理想的情景下尽可能的减少这些进程切换虽然进程切换不可避免但是我们如果能够尽可能的降低这些技能切换并充分利用单颗CPU的缓存就可以大幅提高性能现在我们需要将1号CPU和 A这个worker子进程绑定在一块同样2号CPU和B, 3号和C4号和D绑定在一块绑定完之后比如说A这个worker子进程就永远只能被一号CPU所调度这样的好处是A不再会与2,3,4号CPU绑定只会等待1号的调度我们每一个worker子进程所使用的CPU缓存来说它永远是有效的假如我们不把worker子进程和CPU核心进行绑定的话不同CPU的调度缓存会失效所以把 worker 子进程和CPU绑定一个最大的好处就是尽可能的是减少CPU缓存的失效性能降低但是它并不能避免进程切换因为进程切换是CPU的一个特性对于每一个进程来说都不可能完全的去拥有CPU尤其是对现在的一个linux操作系统来说它是一个多任务的操作系统这样的绑定也是充分利用多核心的一个特性我们看它的一个绑定指令的一个写法上面示例中的 cpumask 是用掩码形式来标记cpu核心worker_cpu_affinity 0001 0010 0100 1000; 4个物理核心和4个worker子进程每个物理核心与一个子进程绑定 0001 表示第一颗0010 表示第二颗0100 表示第三颗1000 表示第四颗 worker cpu affinity 01 10 01 10; 这里表示2个物理核心4个子进程 这时要: 2个子进程共享1个物理核心上述表示A 和 C 共享1号B和D 共享2号核心 worker_priority 这个参数主要是用来指定我们worker子进程中的一个nice值以调整运行Nginx优先级通常设定为负值以优先调用Nginx, 在 linux上可以通过调整nice值从而去改变一个进程运行的优先级从而尽可能的被调度进程优先级越高它就尽可能的被CPU所调度linux本身默认的进程优先级是 120值越小越优先而 nice 值设定的范围是 -20 ~ 19这样值为 100 是最优先的值为 139 是排到最后的我们设置 worker_priority -10, 这样就保证我们的每一个worker子进程的优先级都是比较高的从而尽可能的被CPU所调度使用从而保证我们的Nginx处理的高性能这个在实际的生产环境中通常把这个设定的一个负值就行了这个需要根据你自身这个操作系统上很多的应用程序来判断当然Nginx服务器一般只跑Nginx这样能够保证Nginx承载很高并发量我们不会选择在Nginx服务器上跑其他的应用程序 worker_shutdown_timeout 用来指定我们的 worker 子进程优雅的退出的超时时间比如在 Nginx 的热部署中在更新了配置文件包括我们的程序文件信息之后我们需要给worker子进程发送一个什么指令, 我们会给他发送一个优雅退出的指令优雅退出表示我们的 worker 指令不会主动的去关闭客户端所发送过来的连接它会优先将客户端的连接给请求处理完之后去等待客户端关闭连接那这样就存在一种情形比如说我们的客户端因为一些情况的异常了他这个客户端发起TCP请求之后它与我们Nginx服务器建立了一个TCP连接建立完TCP连接之后需要发送对应的HTTP请求需要将HTTP的header信息发送到服务器服务器收到之后再响应某些情况下它建立一个连接之后就是不发送请求或者是发送了一个请求之后得到我们服务器的回应之后它就是不返回确认的数据包为了应对这样一种情形防止Nginx服务器被很多恶意程序所攻击比如说很多恶意程序的故意发送这样一个数据报文它就是不跟你确认不让你关闭如果永远不关闭的话这个连接就相当于是永远不会释放了这会严重的影响我们的Nginx性能这个时候, 就需要去设定一个 worker_down_timeout也就是说, 我在给你发送完正常的回应之后我会等待这个强制性的时间比如说五秒内如果五秒之后不管你有没有回应或主动断开我会我强制你断开用以防止攻击 timer_resolution worker 子进程内部使用的计算器精度比如设成5毫秒比如说我们的Nginx自身运行的过程中它会向我们的内核态发起很多系统调用比如说它要去获取时间计时器上面这个参数既然定义了5秒超时时间肯定要有一个计时器这个计时器通过获取内核态的一个系统时间对所有的用户进程需要向内核态发起系统调用的时候这个对性能来说是有很大的影响的每一次用户态向内核态的切换都会降低性能所以需要把这个时间间隔尽可能设置的小一点当然如果说你这个应用本身对实间精度要求特别高的话需要去把这个值设的尽可能大一般在情况下会把这个值设置小一点参考如下 客户端请求处理流程 假设右边这张图就是我们的Nginx服务器它启动了4个worker子进程用来响应客户端发送过来的用户请求Nginx 自身是运行的用户态的我们的应用程序是七层的它肯定是运行在我们的用户态的我们都知道操作系统是有内核态的内核态处理什么比如说TCP/IP协议中的数据包都是由内核态来做处理的再比如说我们需要磁盘IO了在操作系统获取系统时间等等这样一些系统调用包括我们去获取磁盘上的文件信息我们打开某一个文件它的一个应用程序需要向我们内核态的一个read函数发起一个系统调用从而由我们的内核态去和我们磁盘上的文件打交道把内容再返回给我们用户态进程所以说对于这样一个用户请求比如说我们现在有一个用户他发送一个TCP连接打到我们的网卡上网卡收到之后把这个TCP连接拆包给TCP/IP协议TCIP协议能够解开这样一个数据包如果网卡把二层的数据包给拆掉之后它发现一些三层的信息比如说是否是当前的IP如果是当前的IP再继续处理如果不是当前的IPTCP/IP协议栈会直接将这个数据包给丢掉如果发现这个三层的这个IP数据包是自己的IP的话它会继续拆包到四层再看这个端口是谁发现是向80端口发起的服务请求。这个时候我们的内核态会知道 80端口就是监听在用户态的某一个应用程序所提供的服务比如说我们的Nginx服务, 这时候TCP/IP协议栈会将这样一个用户请求的这个数据包继续扔给我们这个用户态空间的worker子进程由worker子进程具体去处理假如说我们需要频繁的去获取系统的时间或者是跟磁盘打交道等等当一些用户态应用程序做不了一些事情的时候比如计时器获取系统时间就要发起系统调用这时候就会和内核态来打交道这种系统调用很耗费性能如果说你的时间精度要求高的话比如说间隔可能是十毫秒也就是十毫秒不停的需要有用户态切换到内核态并且从内核态的切换到用户态这样会极大影响性能所以 timer_resolution 这个字段为了尽可能减少应用程序和内核态之间的频繁切换来节约性能 daemon 是一个守护进程的参数, 如果值是 on 就代表Nginx运行方式是在后台也就是默认的方式如果说在一些调试情况下在开发的过程中可能会遇到很多很多的问题。需要打开调试模式的时候我们可以将这个这样一个参数设定为 off这个时候它会运行在前台将很多的错误信息给你输出当然这个参数需要配合其他很多的一些调试参数来使用啊其实这个参数我们用的也很少它能够供我们来调试debug使用
具体配置参考 1 ) nginx.conf
user nginx nginx;
worker_processes auto;
pid /opt/nginx/logs/nginx.pid;
worker_rlimit nofile 12500
worker_rlimit core 50M;
working_directory /opt/nginx/tmp;
worker_cpu_affinity 0001 0010 0100 1000
worker_priority -10
worker_shutdown_timeout 5s;
timer_resolution 100ms;
daemon on;2 ) 调试过程可能需要的一些辅助命令
创建子进程工作目录并设置权限 $ mkdir /opt/nginx/tmp$ chown -R nginx.nginx /opt/nginx/tmp 查看cpu的信息 $ lscpu检查配置 $ /opt/nginx/sbin/nginx -t加载配置 $ /opt/nginx/sbin/nginx -s reload调试辅助 $ ps -ef | grep nginx$ kill 7271 这里可能是 nginx root 的pid进程可以先终止$ /opt/nginx/sbin/nginx 终止后启动nginx$ cat /opt/nginx/logs/nginx.pid