啰嗦几句
在Apache服务器上,一个服务器进程在同一时刻只能处理一个网络请求,如果希望apache能够承受更多的并发,那么要启动更多的服务器进程,这使得服务器之间的进程来回切换频繁,耗费过多的系统资源
Nginx模型:一个master进程多个worker进程,master进程只负责管理worker进程,而不负责网络请求
worker进程数最好与当前机器的CPU核心数相同,这样使得每一个worker进程有匹配一个自己的核心
也不用使得进程间来回切换。
当然Nginx高性能不只是因为以上这个层面,还有epoll模型的应用。我们慢慢了解,
使用Nginx核心是什么?当然是配置文件!!
一段简单的配置
http {
gzip on;
server {
location /api {
gzip off;
}
}
}
如上,我们大致可以了解到的信息,格式特点
-key value
-可以嵌套,应用级别以json相应val同括号优先级最高
-KV由当前Nginx安装模块来确定是否可以识别
-每个配置项的结尾需要加上分号
时间大小单位:
time | 含义 |
---|---|
ms | 毫秒 |
s | 秒 |
m | 分钟 |
h | 小时 |
d | 天 |
w | 周 |
M | 月 |
y | 年 |
空间大小单位
space | 含义 |
---|---|
k | 千字节 |
M | 兆字节 |
配置项的值是否可以使用这些单位,取决于Nginx提供的相应解析模块
配置项,持续更新——
每个worker最大连接数
worker_connections [number]
定义每个worker进程可以同时处理的最大连接数,一般设置为cpu核心数或auto;
选择事件模型
use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport]
对于Linux有三种驱动模型分别是select poll epoll.而性能最高的为EPOLL
是否以master/worker方式工作
master_process on|off
默认为on
是否以守护进程运行Nginx
daemon on|off
默认都是打开的,Nginx需要守护进程运行
仅对指定的客户端输出debug级别的日志
debug_connection [IP|CIDR]
events{
debug_connection 10.224.66.14
debug_connection 10.224.57.0/24
}
这个配置项属于事件类配置,因为它必须放在events中才有效,它的值可以是IP地址或者CIDR地址
绑定Nginx worker进程到指定CPU内核,实现真正的并发[这个参数只有Linux系统才可以]
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001
假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么就会出现同步问题,
反之,如果一个worker进程都度享一个CPU。那么就在内核的调度策略上实现了完全的并发
Nginx worker进程优先级
worker_priority nice;
默认 worker_priority 0;
进程所分配的CPU时间偏大小与进程优先级相关,
优先级越高,进程分配到的时间偏也就越大。
取值范围 -20~+19 -20是最高优先级, +19是最低优先级。
因此,如果用户希望Nginx占有更多的系统资源。那么可以把nice
值配置的更小一些,但不建议比内核进程的nice值还要小,一般为-5
负载均衡锁开关与lock文件
accept_mutex [on|off]
默认accept_mutex on
accept_mutex 为Nginx的负载均衡锁,这把锁,可以让多个worker进程轮流的,序列化的与新的客户端
建立TCP连接,当某一个worker进程建立的连接数量达到worker_connecions配置的最大连接数的 8分之7时,会
大大的减少该worker进程建立新的TCP连接的机会,以此实现所有worker进程处理请求数量均衡。
如果关闭这个锁,那么建立TCP连接耗时会更短,但是均衡负载将会失效。
所以不建议关闭
当accept锁关闭的时候,lock文件是不生效的,但是当accept锁开启的时候
,由于编译程序,操作系统架构等因素导致Nginx不支持原则锁的时候,就会需要lock
文件持有锁的概念。
在基于i386,AMD64,SPARC64,PPC64的操作系统上,如果使用GCC,intelC++,SunPro C++编译器
来编译Nginx,则可以肯定这时的Nginx是支持原子锁的。因为Nginx会利用CPU的特性并用汇编语言实现它
批量建立新连接
multi_accept[on|off]
默认multi_accept off
当事件模型通知有新连接时,尽可能对本次调度中客户端发起的所有TCP都建立连接.
系统调用gettimeofday的执行频率
timer_resolution t;
比如 timer_resolution 100ms
表示至少每100ms才调用一次gettimeofday
目前大多数内核,如果X86-64的体系架构,gettimeofday只是一个vsyscall,仅仅对共享内存也的数据做访问,
并不是通常的系统调用,代价并不大。一般不用做配置,
但是如果是内核空间到用户空间的内存复制,那么该频率还是有必要配置来提高效率。
一般来讲,日志中的LOG时间误差越小,该频率应该越高
SSL硬件加速
如果服务器上有SSL硬件加速设备,那么就可以进行配置来加快SSL协议的处理速度
ssl_engine device
查看服务器上的ssl加速设备
openssl engine -t
指定Nginx worker进程可以打开的最大句柄描述符个数
worker_rlimit_nofile limit
是指一个worker进程可以打开的最大文件句柄数,理论值得应该为
ulimit -n的值 与CPU核数相除得来
但考虑到分配均匀的问题,基本上设置为ulimit也可以
设定每个用户发往Nginx的信号队列大小
worker_rlimit_sigpending limit;
当某个用户的信号队列满了,那么这个用户再次发送的信号将被丢掉
Nginx Debug与debug限制
是否处理几个特殊的调试点
debug_points [stop|abort]
如果设置为stop,那么Nginx的code执行到这些调试点,
就会发出SIGSTOP信号用于调试。
如果设置为abort,则会产生一个coredump文件,
可以使用gdb来查看nginx当时的各种信息
--限制coredump核心转储文件的大小
worker_rlimit_core size;
此LOG也属于DEBUG日志所以在用本配置项时,要确保configure加入了
--with-debug参数,
本参数在定位问题时很必要。如果不加此限制,
那么一个core文件可能达到几GB。很难以排查问题所在.
嵌入其他配置文件
include/path/file
include mime.types
include vhosts/*.conf
pid文件的路径
pid path/file
默认 pid logs/nginx.pid
保存master进程的ID的pid文件存放路径。
默认与configure执行的参数--pid-path所指定的路径是相同的。