高性能Nginx最佳实践
三,Nginx配置location
配置块:server
详情:location会尝试根据用户请求中的uri来匹配location的uri表达式,如果可以匹配,就选择location块中的配置来处理用户请求。
- =/uri :表示完全匹配
- ~/uri:表示匹配uri时是大小写敏感的
- ~*/uri:表示匹配uri时忽略大小写
- ^~/uri:表示匹配uri时只需要其前半部分匹配即可
- /uri:不带任何修饰符,也表示前缀匹配,但是是在正则匹配之后
- /:通用匹配,任何未匹配到其他location的请求都会匹配到,相当于switch中的default
示例:
四,Nginx常规配置:
(一),定义环境变量:
语法:evn VAR|VAR=VALUE
作用:用户可以直接设置操作系统上的环境变量
举例:evn TESTPATH=/tmp;
(二),嵌入其他配置文件
语法:include/path/file
作用:可以把其他配置文件引入进来,路径可以是绝对路径,也可以时相对路径。还可以含有通配符。
(三),PID文件
语法:pid path/file;
默认:pid logs/nginx.pid;
作用:保存master进程的pid文件存放路径。
(四),Nginx worker进程运行的用户和用户组
语法:user username[groupname]
默认:user nobody nobody
作用:master进程fork出的进程在哪个用户和用户组下
(五),指定Nginx worker进程可以打开的最大句柄描述符个数
语法:worker_rlimit_nofile limit;
作用:设置一个worker可以打开的最大句柄数
(六),限制信号队列:
语法:worker_rlimit_sigpending limit;
作用:设置每个用户发往Nginx的信号队列的大小。也就是说,当某个用户的信号队列满了,这个用户再发送的信号量就会被丢掉。
五,Nginx高性能配置:
(一)Nginx worker进程个数
语法:worker_processes number;
默认:worker_processes 1;
作用:在master_worker运行方式下,定义worker进程的个数。worker进程的数量会直接影响性能。每个worker都是单线程的进程,他会调用各个模块来实现各种功能。如果确定这些模块不会出现堵塞式调用,那么进程数可以和CPU核心数一样;反之,则稍少一些。
(二)绑定Nginx worker进程到指定的CPU内核
语法:worker_cpu_affinity cpumask
作用:假设每个worker都是很繁忙的,如果多个进程都在抢同一个cpu,那么就会出现同步问题。反之,如果每个worker进程独享一个CPU,就实现了完全的并发。
举例:worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
(三),SSL硬件加速
语法:ssl_engine device;
作用:如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以用OpenSSL提供的命令来查看是否有SSL硬件加速设备:openssl engine -t
六,Nginx事件配置
(一)是否打开accept锁
语法:accept_mutex [on/off];
默认:accept_mutex on;
作用:accept_mutex是Nginx的负载均衡锁。这把锁可以让多个worker进程轮流的,序列化的与新的客户端建立TCP连接。accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但不利于负载均衡,因此不建议关闭。
(二)使用accept锁后到真正建立连接之间的延迟时间
语法:accept_mutex_delay Nms;
默认:accept_mutex_delay 500ms
作用:在使用accept锁后,同一时间只有一个worker进程能够拿到accept锁。这个accept锁不是堵塞锁,如果取不到会立刻返回。如果只有一个worker进程试图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次试图取锁。
(三)批量建立新连接:
语法:multi_accept[on/off];
默认:multi_accept off;
作用:当事件模型有新连接时,尽可能的对本次调度中客户端发起的所有TCP请求都建立连接。
(四)选择事件模型:
语法:use[kqueue|rtsig|epoll|dev|poll|select|poll|]
作用:对于Linux系统,可供选择的事件驱动模型有:poll,select,epoll三种,一般来说,epoll是性能最高的。
(五)每个worker的最大连接数
语法:worker_connections number;
作用:定义每个worker进程可以同时处理的最大连接数。