nginx详解
2020-04-30 本文已影响0人
麟之趾a
nginx 模型
异步,非阻塞,事件驱动型
nginx 的用途
- HTTP服务 静态服务
- 反向代理
http/https代理 fastcgi代理 memcache代理
- 邮件服务
nginx 进程
- master/worker
master:负责nginx进程工作
worker:负责处理用户请求 - proxy cache 反向代理的缓存
cache loader 缓存加载进程
cache 缓存管理进程
nginx 配置文件说明
fastcgi_params: fastcgi 代理的服务
uwsgi_params: uwsgi代理配置
nginx.conf: nginx主配置文件
mime.conf: mime协议可被浏览器和服务器识别的文件类型
nginx 配置文件模块说明
核心模块: core
标准模块: http (7层代理) steam(TCP流模式的代理)mail(邮件服务)
第三方模块:
nginx.conf 大致说明
main
event {} 定义nginx进程的
http {} 定义 http 服务的
steam{} 定义 TCP的
mail {} 定义 mail邮件的
nginx.conf配置详解
# nginx进程相关的
worker_process: auto
机器有几个cpu核心就写几个,由于一个核心在一个时间只能运行一个进程,如果多于cpu核心的进程就会导致worker进程来回切换,效率不高。
worker_cpu_affinity: auto 手动绑定进程到cpu核心上
绑定进程可以提高cpu缓存的命中率,简单的绑定,比如4个核心,4个进程分别绑定在4个核心上,不用切换进程,从而cpu缓存不会失效,加大缓存命中率。前提次服务器,为nginx的专用机,如果服务器还跑其余的服务,则建议不使用
[root@mysql nginx]# ps axo comm,pid,psr |grep nginx
nginx 10149 0
nginx 10150 0
可以查看nginx进程运行在哪个cpu上,使其对它压测,watch命令监控。来验证worker_cpu_affinity的参数
worker_priority设置[-20,20] worker进程的优先级,优先级越高,cpu越优先调度
[root@mysql nginx]# ps axo comm,pid,psr,ni |grep nginx
nginx 10149 0 0
nginx 10150 0 0
程序的默认优先级为0
worker_priority -5
[root@mysql nginx]# ps axo comm,pid,psr,ni |grep nginx
nginx 10149 0 0
nginx 10181 0 -5
worker_rlimit_nofile worker进程打开文件的数目,注是所有worker进程打开文件的数目
每一个连接都为一个socket,即打开socket的数目
nginx.conf http模块相关的参数
sendfile on
tcp_nopush on;
在sendfile模式下生效,由于sendfile on直接从内核空间发送http响应,没有封装http请求头,所以http请求头,在tcp响应后面到达,而tcp_nopush on 是在内核空间等待http响应头到达之后,一起发送给客户端
tcp_nodelay on
每发送一个小的字节比如一个字节,系统会等待小的数据都攒成一个MTU的包发送过去。而tcp_nodelay on 无论多么小的包,都会发送。不会等待,提高了用户体验。必须长连接下生效,因为短连接的情况下没有办法确定,两次发送的客户端是否是同一客户端
## server标签下
server_name 客户端访问的域名,可以写成正则表达试
在多虚拟机下,客户端匹配server_name的机制
1 .有一样的优先匹配
2 .左侧为*号的优先匹配
3 .右侧为*号的优先匹配
4 .正则匹配
location =|~|~*|^~ uri {}
= 精确匹配
~ 区分大小写匹配
~* 不区分大小写匹配
^~ 从左侧匹配(正常匹配)
匹配uri的优先级
1 . = 精确匹配
2 .^~从左侧正常匹配
3 . ~/~* 正则匹配
4 . /xxx 默认匹配一样的路径
5 . / 默认匹配
root和alias的区别
location /images {
root /data
}
root /data, data为images uri的左侧的/,即images 必须在data路径下才能访问到
location /images {
alias /data
}
alias /data. data为images 右侧的/,即访问images,直接访问到data路径下
rewrite 重写机制
rewrite regex(uri) replacement [flag]
替换的uri 要替换成的内容
locaiton uri {
rewrite
rewrite
rewrite
}
last: 相当于continue.uri当匹配到这个标志的rewrite,会重新加载nginx.conf,从头开始再匹配。如新的uri,匹配到location,在进行rewrite,在重新加载nginx.conf,从头开启匹配,如果在匹配到location,会一直循环下去。循环10次,nginx就会返回内部错误
break: 当uri匹配到这个location,这个location发生rewrite,会接着往下加载nginx.conf,而不会重新加载。
redirect: 302 临时重定向
permanent: 301 永久重定向
302 浏览器不会保存跳转记录,301 浏览器会保存跳转记录
last和break 相当于在nginx内部跳转,浏览器不会改变url、
redirect和permanent nginx直接返回浏览器URL,浏览器进行重写url,可进行服务器外跳转
if 判断
if ($variables){}
正则表达式匹配:
==:等值比较;
~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;
2、文件及目录匹配判断:
-f, !-f:判断指定的路径是否为存在且为文件;
-d, !-d:判断指定的路径是否为存在且为目录;
-e, !-e:判断指定的路径是否存在,文件或目录均可;
-x, !-x:判断指定路径的文件是否存在且可执行;
$variables 为字符串,非空为真,空为假
$ variables 为数字时,非0 为真,0为假
valid_referers 有效的跳转
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
none:指从浏览器中直接键入
blocked:指referers值为空
server_names: 只从哪个域名跳转
$invalid_referer 只不在$vaild_referer中的内容
if ($invalid_referer){ return 403}
只不是指定的有效的域名就返回403,用于防盗链
客户端相关参数配置
keepalive_timeout 长连接
client_body_buffer_size 客户端请求body的缓冲
send_timeout 响应访问的间隔时间。
当client 请求server端,后client 网络不通,server端响应的间隔时间
client_body_tmp_path /path [level1][level2][level3]
客户端post上传文件的地址
[level1][level2][level3] 为3级子目录,因为文件名的md5值,最大值为e,按16进制恰好能代表最大值得md5的字母,所以到e 为16
client_body_tmp_path /data/ 2 1 1
2 为 16*16 256个一级子目录
1 为 16 个二级子目录
1 为 16个三级子目录
3 则代表 16*16*16
为什么要划分子目录,因为如果上传到1个目录的话,假设有10万个文件。则不利于查找,和管理。
文化系统相关的参数
AIO on 开启AIO
open_file_cache_max 缓存的最大文件数,注意此处缓存的为文件元数据信息.客户端请求,及读取服务端的文件
gip on
gzip_comp_level 压缩级别
gizp_types 压缩的类型
服务端状态页面
stub_status;
Active connections: 2
server accepts handled requests
2 2 1
Reading: 0 Writing: 1 Waiting: 1
Active_connections 活动的连接数
accepts 接受请求的连接数
handle 处理请求的连接数
requests 总的请求的数
全部的请求书----》接受请求的连接数 ------》处理请的连接数
Reading 请求报文的连接数
writing 响应报文的连接数
waiting 在长连接的情况下,第一次返回响应报文的连接,在keepalive_timeout期间等待请求报文的连接数