工作纪实_11-Nginx基础解读

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

内核数量工作进程数进程与内核绑取值说明
2201 10每个进程各使用一个内核
2401 10 01 10每个进程交替使用各个内核
440001 0010 0100 1000每个进程各使用一个内核
420101 1010每个进程使用两个内核。CPU要进行大量运算的应用可以让每个进程使用多个cpu内核
8800000001 00000010 00000100 00001000 00010000 00100000 01000000 100000000001表示启用第一个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 地址将请求分配到真实服务器

负载策略

策略说明
轮询缺省默认负载策略
weight权重方式,在轮询策略的基础上指定轮询的几率
ip_hashIP分配,使用较少
least_conn把请求转发给连接数较少的后端服务器
fair【第三方】响应时间短的优先匹配
url_hash【第三方】url分配,使用较少

负载参数设置

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)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值