Nginx常⻅问题
- Server优先级
- location优先级
- try_files的使用
- alias与root区别
- 获取用户真实IP
- 常见HTTP状态码
- 网站相关术语
- 网站访问原理
- Nginx优化⽅案
- Nginx架构总结
参考地址:
Server优先级
在开始处理一个http请求时,nginx会取出header头中的host,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。
server_name与host匹配优先级如下:
- 完全匹配
- 通配符在前的,如
*.test.com
- 通配符在后的,如
www.test.*
- 正则匹配,如
~^\.www\.test\.com$
如果都不匹配
- 如果有default或者default_server , 优先选择listen配置项后有default或default_server的
- 如果没有default或者default_server ,找到匹配listen端口的第一个server块
执行优先级可以使用nginx -t
检测
1 | server { |
1 | nginx -t |
正则与default的优先级
1 | server { |
1 | curl http://server.1/test |
正则匹配虽然优先级较低,但是仍然高于default;在都匹配不到的情况下,default开始起作用。
在全部匹配失败时,使用default
1 | server { |
1 | curl http://server.1/test |
default只能作用于匹配不到的情况下,而且nginx.conf不可以配多个default,否则nginx重启时候会提示错误
全部匹配失败,且没有default,靠前为赢
1 | server { |
1 | curl http://sever.1/test |
在server_name都匹配失败的前提下,并且listen没有default属性,那么端口号和server的顺序将发挥作用,它会去找端口匹配的位置最靠前的server。
location优先级
⼀个 server 出现多个 location
匹配 | 优先级由高到低 | 示例 |
---|---|---|
= | 进⾏普通字符精确匹配, 完全匹配 | location = /static/img/file.jpg |
^~ | 表示普通字符匹配, 使⽤前缀匹配 | location ^~/static/img/ |
~ | 执行一个正则匹配,区分大小写 | location ~ /static/img/.*.jpg$ |
~* | 执行一个正则匹配,不区分大小写 | location ~* /static/img/.*.jpg$ |
- 字符匹配成功(
=
,^~
) , 则不再查找其他匹配项。 - 正则匹配成功(
~
,~*
) , 则使用正则表达式最长的那个。
以下是按优先级排列说明:
- 先匹配精确模式,命中精确模式,直接返回。否则,继续匹配前缀模式。
- 前缀模式中使用最大前缀原则,选出匹配普通匹配(空格)或非正则匹配(^~)的最长location。
- 若最长前缀location是非正则匹配(^~),则返回该最长前缀location。否则,还需要继续匹配正则模式。
- 正则模式的原则是按照正则location定义顺序匹配,第一个匹配的location为正则模式结果。
- 若正则模式匹配成功,返回正则模式结果。否则,返回前缀模式中的最长前缀location。
注意 :如果命中多个前缀匹配,则记住最长的前缀匹配
1 | location /static/ { |
记住最长的前缀匹配,即上例中的 /static/img/
简记
=
, 精确匹配 , 优先级为1^~
, 前缀匹配 , 优先级为2~
, 正则匹配(不区分大小写) , 优先级为3~*
, 正则匹配(区分大小写) , 优先级为3
try_files的使用
nginx 的 try_files 按顺序检查⽂件是否存在
1 | location / { |
alias与root区别
1 | server { |
curl http://192.168.69.113/request_path/code/index.html
的实际请求本地⽂件路径为 : /local_path/code/request_path/code/index.html
1 | server { |
curl http://192.168.69.113/request_path/code/index.html
的实际访问本地路径为 : /local_path/code/index.html
获取用户真实IP
Nginx 传递用户的真实IP地址
- 经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过
$remote_addr
变量拿到的将是反向代理服务器的ip地址。 - 这句话的意思是说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取
$remote_addr
),取得的是nginx的地址,即$remote_addr
变量中封装的是nginx的地址,当然是没法获得用户的真实ip的
$remote_addr
只能获取到最近⼀台服务器访问IPx_forwarded_for
头部信息容易被篡改
最佳实践:
- 在代理1里执行
set x_real_ip=$remote_addr
- 在后端服务你直接获取
$x_real_ip
1 | proxy_set_header Host $http_host; |
然后,在web端可以这样获取:request.getAttribute("X-Real-ip")
示例 :
1 | server { |
常⻅HTTP状态码
- 200 正常请求
- 301 永久跳转
- 302 临时跳转
- 400 请求参数错误
- 401 账户密码错误(authorization required)
- 403 权限被拒绝(forbidden)
- 404 ⽂件没找到(Not Found)
- 413 用户上传⽂件⼤⼩限制(Request Entity Too Large)
- 502 后端服务⽆响应(bad gateway)
- 504 后端服务执行超时(Gateway Time-out)
网站相关术语
PV(page view,页面浏览量)
- 用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次。即访问量。
- 主要用来衡量网站用户访问的网页数量。是评价网站流量最常用的指标之一。
UV( unique visitor,网站独立访客)
- 通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客。
- 该概念的引入,是从用户个体的角度对访问数据进行划分。
- 以
cookie
为依据。
IP(独立IP)
- 1天之内(00:00~24:00),访问网站的不重复的IP数。
- 拥有特定唯一IP的计算机访问网站的次数,因为这种统计方式比较容易实现,具有较高的真实性。
如果⼀栋⼤厦里所有⼯作⼈员通过1个IP公网接⼝上网, 总共100个设备, 当所有⼈同时请求⼀个网站, 并且刷新了5次, 那么请求pv、ip、uv分别是多少
- pv : 500
- uv : 100
- ip : 1
用户访问网站的流程
粗略流程
- DNS解析
- CDN
- HTTP三次握手
- 负载均衡
- web应用
- 程序框架 Opcache
- Redis/Memcached/RabbitMq
- MySQL
每一层都会有响应的缓存
详细流程
- DNS流程
- 查询本地Hosts
- 请求本地localDNS
- 返回对应的IP
- HTTP连接
- 建立TCP三次握手,发送请求内容, 请求头、请求的行、请求的主体
- 将请求传递给负载均衡, 负载均衡做对应的调度
- 如果请求的是静态页面, 那么调度至对应的
静态集群组
即可 - 如果请求的是动态页面, 将请求调度至
动态集群组
- 如果仅仅是请求页面, 可能会经过Opcache缓存返回
- 如果请求页面需要查询数据库, 或者是往数据库插入内容 , 检查对应的操作是查询还是写入,
- 如果是写入数据库 , 写入 , 并且使用Redis缓存对应的查询结果
- 如果是查询数据库 , 检查查询的内容是否有被缓存,
- 如果有缓存 , 则返回 , 并且使用Redis缓存对应的查询结果
- 如果没有缓存 , 则执行查询操作, 并且使用Redis缓存对应的查询结果
- 如果请求的是静态页面, 那么调度至对应的
- 返回对应客户端请求的内容至于WEB节点
- WEB节点收到请求后返回内容至负载均衡
- 负载均衡返回客户端内容, TCP四次挥手断开
- HTTP断开连接
Nginx优化⽅案
- gzip压缩
- expires静态⽂件缓存
- 调整⽹络IO模型,调整Nginx worker进程的最⼤连接数
- 隐藏Nginx名称和版本号
- 配置防盗链,防⽌资源被盗用
- 禁⽌通过IP地址访问,禁⽌恶意域名解析,只允许域名访问
- 防DDOS、cc攻击, 限制单IP并发请求连接
- 配置错误⻚⾯,根据错误代码指定⽹⻚反馈用户
- 限制上传资源⽬录被程序访问,防⽌⽊⻢⼊侵系统
- Nginx加密传输优化
Nginx架构总结
基于Nginx中间件的架构
- 了解需求(定义Nginx在服务体系中的⻆⾊)
- 静态资源服务的功能设计
- 类型分类(视频、图⽚、html)
- 浏览器缓存
- 防盗链
- 流量限制
- 防资源盗用
- 压缩(压缩模式, 压缩⽐例, 压缩类型)
- 代理服务
- 协议类型
- 正向代理
- 反向代理
- 负载均衡
- 代理缓存
- 头信息处理
- Proxy_Pass
- LNMP
- 动静分离
- 静态资源服务的功能设计
- 设计评估
- 硬件 CPU、内存、磁盘
- 系统(用户权限、日志⽬录存放)
- 代理服务/负载均衡 (CPU、内存)
- 静态资源服务(硬盘容量、硬盘转速)
- 动态资源服务(硬盘转速、读写效率)
- 缓存资源服务(SSD固态)
- 配置注意事项
- 合理配置
- 定义http块
- 定义优化参数
- 定义server , location , log
- 了解原理
- http协议原理
- http状态原理
- 操作系统原理
- 关注日志
- 日志是否有打开
- 是否有对应请求
- 请求状态码信息符合
- 错误日志信息吐出来
- 错误日志内容和含义
- 合理配置