高性能Nginx最佳实践
23 次浏览
发表于 2021-02-23 15:17

Nginx监听端口

基本语法:listen address:port
默认:listen 80;
作用:listen参数决定Nginx服务器如何监听端口。在listen后可以加IP地址,端口和主机名,非常灵活
例如:
listen 127.0.0.1:8000;
listen 127.0.0.1; # 默认80端口
listen 8000; # listen *:8000; # listen locahost:8000
这样就可以配置多个server,监听不同的端口
扩展语法:listen address:port [default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|defered|bind|ipv6only=[on|off]|ssl]]

参数意义
default将所在得server设置为整个web服务的默认server块。如果没有这个设置,那么会以在nginx.conf中找到的第一个server作为默认server。(default_server:同上)
backlog=num表示TCP中backlog列表的大小
rcvbuf=size设置监听句柄的SO_RECVBUF参数
sndbuf=size设置监听句柄的SO_SNDBUF参数
accept_filter设置accept过滤器,只对FreeBSD有用
defered在设置参数后,若用户发起建立请求,并且完成了TCP三次握手,内核也不会为这次连接调度worker进程来处理,只有用户真的发送数据时(内核已经在网卡中收到请求包),内核才会唤醒worker进程处理这个请求
bind绑定当前端口、地址对。只有同时对一个端口监听多个地址时才会生效
ssl在当前监听的端口上建立的连接必须基于SSL协议
Nginx虚拟主机
类别主机名server_names_hash_bucket_size
语法server_name name […]server_names_hash_bucket_size size;
默认server_name “”;server_names_hash_bucket_size 32
配置块server;http,server,location
作用实现虚拟主机的关键为了快速找到相应的server name的能力,Nginx使用散列表来存储server name。这个设置了桶的大小。

worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
upstream aidan.org{
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
server {
listen 80;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}

Nginx配置location

语法:location [=|~*|@]/uri/{…}
配置块:server
详情:location会尝试根据用户请求中的uri来匹配上面的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进程ID的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 [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
(dynamic) Dynamic engine loading support
[ unavailable ]

Nginx Worker进程优先级设置
语法:worker_priority nice;
默认:worker_priority 0;
作用:在Linux和Unix中,当许多进程都处于可执行状态时,按照优先级来决定本次内核选择哪一个进程执行。进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长(例如,在默认情况下,最小时间片是5ms,最大则有800ms)。优先级由静态优先级和内核根据进程的执行情况所做的动态调整(目前只有±5的调整)共同决定。nice是进程的优先级,他的取值范围是-20~+19,-20是最高优先级,+19是最低优先级。不建议把nice的值设为比内核进程(通常为-5)还要小。

ab测试

# apt install -y apache2-utils
$ yum install -y httpd-tools
$ ab -n 20000 -k http://aidan.org/a/a

参考

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|eventport];
默认:Nginx会选出最合适的事件模型
作用:对于Linux系统,可供选择的事件驱动模型有:poll,select,epoll三种,一般来说,epoll是性能最高的。

每个worker的最大连接数
语法:worker_connections number;
作用:定义每个worker进程可以同时处理的最大连接数。

Nginx事件模型

epoll是Linux内核为处理大批量文件描述符而作的改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
优点:

  • 支持一个进程打开大数目的socket描述符。
  • IO效率不随FD数目增加而线性下降
  • 使用mmap加速内核与用户空间的消息传递。
Nginx配置实例

worker_processes auto;
events {
use epoll;
worker_connections 65535;
}
http {
upstream aidan.org{
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
server {
listen 80;
server_name aidan.org;
location / {
proxy_pass http://aidan.org;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}

如果您觉得不错,就打赏支持一下吧〜
已有 0 人进行打赏
发表评论
发表者

张东明001

Nothing is impossible!

  • 13

    文章

  • 0

    关注

  • 5

    粉丝

活动推荐
版权所有©F5 Networks,Inc.保留所有权利。京ICP备16013763号-5