目录
- `Nginx`核心配置
- 一、并发处理机制
- 二、全局模式
- work_process
- worker_cpu_affinity
- worker_rlimit_nofile
- 三、Event模块
- worker_connections
- accept_mutex on
- accept_mutex_delay
- multi_accept
- use
- 四、`Http`模块
- ⾮调优属性简介
- `include mime.types;`
- `default_type application/octet-stream; `
- `charset utf-8;`
- `sendfile on`
- `tcp_nopush on`
- `tcp_nodelay on`
- `keepalive_timeout 60`
- client_body_timeout 10`
- 五、请求定位
- 1.资源访问
- 修改配置⽂件
- 路径匹配优先级
- 普通匹配
- 长路径匹配
- 正则匹配
- A、区分⼤⼩写
- B、不区分⼤⼩
- 短路匹配
- 精确匹配
- 六、缓存配置
- 全局缓存
- 局部缓存
- 七、`Nginx`变量
- 自定义变量
- 内置变量
- 八、日志管理
- http模块管理
- server模块管理
- location模块管理
- 九、日志压缩
- 浏览器压缩协议
- gzip
- sdch
- Zopfli
- 常用设置
- 十、负载均衡
- 工作层次
- 七层负载均衡
- 四层负载均衡
- 三层负载均衡
- 二层负载均衡
- 负载策略
- 负载参数设置
- backup
- down
- fail_timeout
- max_fails
- max_conns
- 配置实现
- 轮询/权重
- 其他
Nginx
核心配置
完整文档
一、并发处理机制
并发处理一般有以下三种方式:多进程、多线程,与异步机制。
Nginx
对于并发的处理同时采⽤了三种机制。当然,其异步机制使⽤的是异步⾮阻塞
⽅式。
Nginx
的进程分为两类: master
进程与 worker
进程。
每个 master
进程可以⽣成多个worke
进程,所以其是多进程的。
每个 worker进程可以同时处理多个⽤户请求,每个⽤户请求会由⼀个线程来处理,所以其是多线程的.
二、全局模式
主要针对的是nginx.conf
文件夹的调优配置
work_process
工作进程数,指定nginx
的工作进程数,其数值一般设置为CPU
核数的整数倍
不过需要注意,该值不仅仅取决于 CPU
内核数量,还与硬盘数量及负载均衡模式相关。在不确定时可
以指定其值为 auto
worker_cpu_affinity
将work
进程与具体的内核进行绑定。不过,若指定work_process
的值为auto
,则无法设置work_cpu_affinity
内核数量 | 工作进程数 | 进程与内核绑取值 | 说明 |
2 | 2 | 01 10 | 每个进程各使用一个内核 |
2 | 4 | 01 10 01 10 | 每个进程交替使用各个内核 |
4 | 4 | 0001 0010 0100 1000 | 每个进程各使用一个内核 |
4 | 2 | 0101 1010 | 每个进程使用两个内核。CPU要进行大量运算的应用可以让每个进程使用多个cpu内核 |
8 | 8 | 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 | 0001表示启用第一个CPU内核,0010表示启用第二个CPU内核【类推即可】 |
备注: 0-内核关闭 1-内核开启 ----- 有⼏个内核,就需要使⽤⼏个⼆进制位
工作进程数最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
worker_rlimit_nofile
设置一个worker
进程所能打开的最大文件数量【655356】,默认值与当前Linux
系统可打开的最大文件数相同
三、Event模块
worker_connections
每⼀个 worker
进程可以并发处理的最⼤连接数, 该值不能超过worker_rlimit_nofile
的值
accept_mutex on
on: 默认值,当⼀个新连接到达时,那些没有处于⼯作状态的 worker
将以串⾏⽅式来处理;(效率慢)
off: 表示当⼀个新连接到达时, 所有的 worker 都会被唤醒,不过只有⼀个 worker 能获取新连接,
其它的worker
会重新进⼊阻塞状态,这就是“惊群”现象。(效率⾼ 但是会有浪费)
accept_mutex_delay
设置队⾸worker
会尝试获取互斥锁的时间间隔。 默认值为 500 毫秒
multi_accept
off: 系统会逐个拿出新连接按照负载均衡策略, 将其分配给当前处理连接个数最少的worker
。
on: 系统会实时的统计出各个worker
当前正在处理的连接个数, 然后会按照“缺编”
最多的 worker
的“缺编” 数量,⼀次性将这么多的新连接分配给该 worker
。(效率⾼)
use
设置 worker与客户端连接的处理⽅式。Nginx
会⾃动选择适合当前系统的最⾼效的⽅式。当然,也可
以使⽤ use 指令明确指定所要使⽤的连接处理⽅式。
use
的取值有以下⼏种:select | poll | epoll
四、Http
模块
⾮调优属性简介
include mime.types;
将当前⽬录(conf
⽬录)中的 mime.types
⽂件包含进来
default_type application/octet-stream;
对于⽆扩展名的⽂件,默认其为 application/octet-stream
类型,
即Nginx
会将其作为⼀个⼋进制流⽂件来处理
charset utf-8;
设置请求与响应的字符编码
sendfile on
设置为 on
则开启 Linux 系统的零拷⻉机制,否则不启⽤零拷⻉。 当然,开启后是否起作⽤,要看所使⽤的系统版本。 CentOS6
及其以上版本⽀持 sendfile
零拷⻉
tcp_nopush on
on: 以单独的数据包形式发送 Nginx
的响应头信息,⽽真正的响应体数据会再以数据包的形式发送,
这个数据包中就不再包含响应头信息了。(适⽤于数据量⼤的连接)
off: 默认值, 响应头信息包含在每⼀个响应体数据包中
tcp_nodelay on
on: 不设置数据发送缓存,即不推迟发送,适合于传输⼩数据,⽆需缓存。
off: 开启发送缓存。 若传输的数据是图⽚等⼤数据量⽂件,则建议设置为 off
keepalive_timeout 60
设置客户端与Nginx
间所建⽴的⻓连接的⽣命超时时间,时间到达,则连接将⾃动关闭。单位秒keepalive_requests 10000
设置⼀个⻓连接最多可以发送的请求数。该值需要在真实环境下测试。
client_body_timeout 10`
设置客户端获取 Nginx
响应的超时时限,即⼀个请求从客户端发出到接收到 Nginx
的响应的最⻓时
间间隔。 若超时,则认为本次请求失败
五、请求定位
1.资源访问
修改配置⽂件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDSyPxgK-1591786499784)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591353648793.png)]
root
:前端项目的首页文件夹
index
: 前端项目的首页面
路径匹配优先级
普通匹配 < ⻓路径匹配 < 正则匹配 < 短路匹配 < 精确匹配
普通匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TlFDHrI-1591786499787)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591353858702.png)]
长路径匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOA9GEpF-1591786499795)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591353887152.png)]
正则匹配
在正则匹配与普通匹配(⻓路径匹配也属于普通匹配) 均可匹配上时,正则匹配的优先级⾼
A、区分⼤⼩写
~表示这⾥是正则表达式,默认匹配是区分⼤⼩写的正则表达式
B、不区分⼤⼩
~后跟上*号,表示这是不区分⼤⼩写的正则表达式
短路匹配
以^~开头的匹配路径称为短路匹配,表示只要匹配上,就不再匹配其它的了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yubV2N2-1591786499797)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591354220037.png)]
精确匹配
以等号(=)开头的匹配称为精确匹配,其是优先级最⾼的匹配
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvcO8dp6-1591786499799)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591354310583.png)]
六、缓存配置
Nginx
具有很强⼤的缓存功能,可以对请求的 response进⾏缓存,起到类似CDN
的作⽤,甚⾄有⽐CDN
更强⼤的功能。同时, Nginx
缓存还可以⽤来“数据托底”,即当后台 web
服务器挂掉的时候,Nginx
可以直接将缓存中的托底数据返回给⽤户。此功能就是 Nginx
实现“服务降级”的体现。
全局缓存
定义在http
模块的缓存
http{
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
#...
}
局部缓存
定义在server
模块的缓存
http{
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
set $upstream http://ip:port
location / {
proxy_cache my_cache;
proxy_pass $upstream;
}
}
}
/path/to/cache #本地路径,用来设置Nginx缓存资源的存放地址
levels #默认所有缓存文件都放在同一个/path/to/cache下,但是会影响缓存的性能,因此通常会在/path/to/cache下面建立子目录用来分别存放不同的文件。假设levels=1:2,Nginx为将要缓存的资源生成的key为f4cd0fbc769e94925ec5540b6a4136d0,那么key的最后一位0,以及倒数第2-3位6d作为两级的子目录,也就是该资源最终会被缓存到/path/to/cache/0/6d目录中
key_zone #在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key
max_size #最大cache空间,如果不指定,会使用掉所有disk space,当达到配额后,会删除最少使用的cache文件
inactive #未被访问文件在缓存中保留时间,本配置中如果60分钟未被访问则不论状态是否为expired,缓存控制程序会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是缓存过期,但不会被删除,inactive是删除指定时间内未被访问的缓存文件
use_temp_path #如果为off,则nginx会将缓存文件直接写入指定的cache文件中,而不是使用temp_path存储,official建议为off,避免文件在不同文件系统中不必要的拷贝
proxy_cache #启用proxy cache,并指定key_zone。另外,如果proxy_cache off表示关闭掉缓存。
expires 3m #为静态资源开启缓存
七、Nginx
变量
自定义变量
set $zbomc http://zbomc-blue.com:8080
location /user {
proxy_path $zbomc;
#...
}
内置变量
$body_bytes_sent #已发送的消息体字节数
$content_length HTTP #请求信息⾥的"Content-Length"
$content_type #请求信息⾥的"Content-Type"
$document_root #针对当前请求的根路径设置值
$document_uri #与$uri 相同
$host #请求信息中的"Host",如果请求中没有 Host ⾏,则等于设置的服务器名;
$http_cookie #cookie 信息
$http_referer #来源地址
$http_user_agent #客户端代理信息
$http_via #最后⼀个访问服务器的 Ip 地址
$http_x_forwarded_for #相当于⽹络访问路径。
$limit_rate #对连接速率的限制
$remote_addr #客户端地址
$remote_port #客户端端⼝号
$remote_user #客户端⽤户名,认证⽤
$request #⽤户请求信息
$request_body #⽤户请求主体
$request_body_file #发往后端的本地⽂件名称
$request_filename #当前请求的⽂件路径名
$request_method 请求的⽅法,⽐如"GET"、 "POST"等
$request_uri #请求的 URI,带参数
$server_addr #服务器地址,如果没有⽤ listen 指明服务器地址,使⽤这个变量将发起⼀次系统调⽤以取得地址(造成资源浪费)
$server_name #请求到达的服务器名
$server_port #请求到达的服务器端⼝号
$server_protocol #请求的协议版本, "HTTP/1.0"或"HTTP/1.1"
$uri #请求的 URI,可能和最初的值有不同,⽐如经过重定向之类的
八、日志管理
http模块管理
只要有请求通过 http
协议访问该 Nginx
,就会有⽇志信息写⼊到这⾥的⽇志⽂件
http {
og_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/logs/nginx/error.log;
}
server模块管理
只要有请求访问当前 Server
,就会有⽇志信息写⼊到这⾥的⽇志⽂件
http{
#...
server{
access_log /var/log/nginx/server/access.log main;
error_log /var/logs/nginx/server/error.log;
location {
#...
}
}
}
location模块管理
http{
#...
server{
location /{
root html;
index index.html
access_log /var/log/nginx/server/access.log main;
error_log /var/logs/nginx/server/error.log;
#...
}
}
}
九、日志压缩
浏览器压缩协议
一种过时的压缩算法,是哈夫曼编码的一种加强
gzip
主流压缩算法,对deflate
的一种改进
sdch
谷歌开发的压缩算法,前面两者的压缩思路是修改传输数据的编码格式以达到减少体量的目的,最终传输的数据量并没有减少。而sdch
的算法原理是,让冗余的数据只出现一次,其最终传输的数据变少了
Zopfli
谷歌开发的压缩算法,不推荐
常用设置
http{
#...
gzip on;# 开启gzip压缩
gzip_min_length 5k;#最小启用压缩的文件大小
gzip_comp_level 4;#压缩级别,取值为 1-9,默认为1,推荐为4
gzip_buffers 4 16k;#“4”表示的是缓存颗粒数量,⽽“16k”表示的是缓存颗粒⼤⼩
gzip_vary on;#开启动态压缩
gzip_types text/html text/css test/xml application/x-javascriptg; #通过 MIME 类型来指定要压缩的⽂件类型。 默认值 text/html
server{
#...
}
}
十、负载均衡
工作层次
七层负载均衡
应⽤层, 基于 HTTP 协议, 通过虚拟 URL 将请求分配到真实服务器。 ⼀般应⽤于B/S 架构系统。
Nginx
就是七层负载均衡。
四层负载均衡
传输层, 基于 TCP 协议, 通过“虚拟 IP + 端⼝号” 将请求分配到真实服务器。
⼀般应⽤于 C/S
架构系统。
例如,LVS、 F5、 Nginx Plus
都属于四层负载均衡
三层负载均衡
⽹络层, 基于 IP
协议, 通过虚拟 IP 将请求分配到真实服务器
二层负载均衡
链路层, 基于虚拟 MAC
负载策略
策略 | 说明 |
轮询 | 缺省默认负载策略 |
| 权重方式,在轮询策略的基础上指定轮询的几率 |
|
|
| 把请求转发给连接数较少的后端服务器 |
| 响应时间短的优先匹配 |
|
|
负载参数设置
backup
表示当前服务器为备⽤服务器, 只有在其他的服务器都宕机以后,才会加⼊到集群中,被⽤户访问到
down
表示当前服务器永久停机,标记该服务器不可用
fail_timeout
表示当前主机被 Nginx
认定为停机的最⻓失联时间默认, 为10 秒。常与max_fails
联合使⽤
max_fails
在fail_timeout
允许的时间内最多失败次数,如果超出, 剔出上游服务,标记宕机
max_conns
限制每台server的连接数,⽤于保护避免过载,可起到限流作⽤
配置实现
轮询/权重
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D640joZN-1591786499800)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591777346946.png)]
其他
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzZtgP3y-1591786499802)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1591777383267.png)]