分布式系统系列--(三)Nginx配置文件的相关参数说明
Nginx的相关配置参数说明
在安装Nginx的时,会有一个关于Nginx启动时默认的配置文件nginx.conf,里边指定了Nginx服务器的各种参数配置信息,下边我们就来具体讲一讲它的各个配置项。
Nginx的监听端口
listen参数决定Nginx服务器监听的具体端口。在listen后可以加IP地址,端口和主机名,非常灵活。
基本语法:
listen address:port
扩展语法:
listen address:port [default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|snbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];
各个参数的含义如下:
default
将所在的server设为整个web服务的默认server模块,如果没有这个设置,那么会在nginx.conf中找到的第一个server作为默认server。(default_server同上)
backlog=num
表示TCP中backlog队列的大小
rcvbuf=size
设置监听句柄的SO_RECVBUF参数
snbuf=size
设置监听句柄的SO_SNBUF参数
accept_filter
设置accept过滤器,支持FreeBSD时有用
deferred
在设置参数后,若用户发起建立请求,并且完成了TCP的三次握手,内核也不会为这次连接调度worker进程来处理,只有用户真的发送数据时,内核才会唤醒worker进程处理这个请求。
bind
绑定当前端口、地址对。只有同时对一个端口监听多个地址时才会生效
ssl
在当监听的端口上建立的连接必须基于SSL协议
listen默认的监听80端口
,例如:
listen 127.0.0.1:8000;
# 默认监听80端口
listen 127.0.0.1;
# 等同于listen *:8000;或者listen localhost:8000;
listen 8000;
比如我们在Nginx监听80和8080两个端口,并向客户端发送他们当前监听的端口信息,Mac电脑上的配置如下:
#user nobody;
worker_processes 1;
pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;
events {
#use epoll; //此命令只有在Linux系统才有效
worker_connections 1024;
}
http {
# 监听的服务端口 80
server {
listen 80;
location / {
default_type text/html;
return 200 "Hello,Nginx!I am working on port 80.\n";
}
}
# 监听的服务端口 8080
server {
listen 8080;
location / {
default_type text/html;
return 200 "Hello,Nginx!I am working on port 8080.\n";
}
}
}
Nginx虚拟主机
基本语法:
server_name name
它是在server配置快下设置的,Mac电脑下具体的配置例子如下:
worker_processes 1;
pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
# 设置负载均衡映射到的地址
upstream www.young.cn {
server 127.0.0.1:8080;
}
# 通过访问虚拟主机的地址www.yes.com,然后反向代理到http://www.young.cn,然后被服务器分发到127.0.0.1:8080的服务器地址上
server {
listen 80;
# 设置虚拟主机
server_name www.yes.com;
location / {
# 设置反向代理的地址
proxy_pass http://www.young.cn;
}
}
# 监听8080服务器
server {
listen 8080;
location / {
default_type text/html;
return 200 "Hello,Nginx!I am working on port 8080!\n";
}
}
}
Nginx配置location
基本语法:
location [=|~*|^~|@]/uri/{···}
location是配置在server配置块中的,正如我们上边所用到的那样。
它的作用是:通过配置location,服务器会尝试根据用户请求的uri来匹配location后边的表达式,如果可以匹配,就选择location块中的配置来处理用户请求;如果不匹配,则不响应请求。具体的匹配方式说明如下:
=/uri
表示完全匹配~/uri
表示匹配uri时大小写敏感~*/uri
表示匹配uri时忽略大小写^~/uri
表示匹配uri时只需要其前半部分匹配即可/uri
表示不带任何修饰符,也表示前缀匹配,但是在正则匹配之后/
表示通用匹配,任何未能匹配到其他location的请求都会匹配到,相当于switch语句中的default
注意,如果请求匹配了上了多个location的表达式,那么它会只执行第一个匹配上的那个location。
我们来看一下具体的示例(Mac电脑下):
worker_processes 1;
pid /usr/local/Cellar/nginx/1.19.2/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
#设置符合多中格式请求的location
server {
listen 80;
# 所有都匹配不到,则会执行该location
location / {
default_type text/html;
return 200 "location / : I am default location!\n";
}
#完全匹配
location =/goodjob {
default_type text/html;
return 200 "location = /goodjob\n";
}
#匹配uri时大小写敏感
location ~/Goodjob {
default_type text/html;
return 200 "location ~ /Goodjob\n";
}
#匹配uri时忽略大小写
location ~*/goodjob {
default_type text/html;
return 200 "location ~*/goodjob\n";
}
#匹配uri时只需要其前半部分匹配即可
location ^~/goodjob {
default_type text/html;
return 200 "location ^~/goodjob\n";
}
}
}
Nginx事件配置
是否打开accept锁
语法: accept_mutex[on|of];
默认: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是性能最高的。
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版,它能显著提高程序在大量并发中只有少量活跃的情况下的系统CPU利用率。它的特点:
- 支持一个进程打开大数目的socket描述符
- IO效率不随FD数目的增加而线性下降
- 使用mmap加速内核与用户空间的消息传递
worker的最大连接数
语法:worker_connections number;
作用:定义每个worker进程可以同时处理的最大连接数
其他常规配置
定义环境变量
语法:evn VAR|VAR=value
作用:用户可以直接设置操作系统上的环境变量
例子:evn TESTPATH=/tmp
嵌入其他文件
语法:include /path/file;
作用:可以把其他配置文件引入进来,路径可以使绝对路径也可以是相对路径,还可以含有通配符。
pid文件
语法:pid path/file;
默认:pid logs/nginx.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 worker进程个数
语法: worker_processes number;
默认: worker_processes 1;
作用: 在master_worker运行方式下,定义worker进程的个数。worker进程的数量会直接影响性能。每个worker都是单线程的进程,它会调用各个模块来实现各种功能。如果确定这些模块不会出现堵塞式调用,那么进程数可以和CPU的核心数一样;反之,则稍少一些较好。
绑定worker进程到指定的CPU内核
语法:worker_cpu_affinity cpumask [cpumask...]
作用:假设每个worker都是很繁忙的,如果多个进程都在抢同一个CPU,那么就会出现同步问题。反之,如果每个worker进程独享一个CPU,就实现了完全的并发。
例子:
worker_processes 1;
worker_cpu_affinity 1000 0100 0010 0001;
ssl硬件加速
语法:ssl_engine device;
作用:如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以用OpenSSL提供的命令来查看是否有SSL硬件加速设备:openssl engine -t
worker进程优先级设置
语法:worker_priority nice;
默认:worker_priority 0;
作用:在Linux和Unix中,当许多进程都处于可执行状态时,按照优先级来决定本次内核选择哪一个进程进行。进程分配的CPU时间片大小与优先级有关,优先级越高,时间片越长(例如,在默认情况下,最小时间片是5ms,最大择优800ms)。优先级由静态优先级和内核根据进程的执行情况所做的动态调整共同决定。nice是进程的优先级,它的取值范围是-20到+19。-20是最高优先级,+19是最低优先级,不建议把nice的值设为比内核进程(通常为-5)还要小。
user配置
语法:user username;
作用:用来指定进程运行的用户和用户组
pid配置
语法: pid /path/file
作用:保存master进程ID的pid文件存放路径
use配置
语法:use epoll;
作用:选择事件模型
upstream配置
语法:
upstream address {
#负载均衡策略
ip_hash;
#负载均衡分发的地址列表
server ip:port;
}
作用:用于将访问的网址通过负载均衡策略分发给内网的各个服务器地址。
proxy_pass配置
语法:proxy_pass address;
作用:指定反向代理后的服务器网址。