nginx高并发低时延特点如何体现在代理模块上

本文背景:

xxx系统投产前夕,由于代码中富文本内容都存到了数据库中,在查询资讯信息详情的时候加载需要几秒钟-十几秒的时间(根据返回体的大小不同而不同),所以计划先缩减咨询的图片大小,然后我们立即修改图片存储的方式(图片上传到文件服务器,db只存路径)。但是在做生产网络巡查以及流程验证时发现,《资讯详情》偶现网络异常的错误。

  1. 表现层错误:


    image.png

2.服务端错误:


image.png

3.看到这里从网上了解到服务端错误并不是代码问题,于是查了nginx日志。

[crit] 225644#0: *50493152 open() “/data/nginx/nginx/temp/proxy_temp/4/24/0000000244” 
failed (13: Permission denied) while reading upstream, client: xxx.xxx.xxx.xx, 
server: localhost, request: “GET /api/wx/health/info/3 HTTP/1.1”, 
upstream: “http://ip:9000/wx/health/info/3”, host: “域名”, referrer: “域名/nc-WeChatAccount/"
image.png

看到这些错有点疑惑nginx为啥报权限不足的错误,百度搜索之后发现是nginx的机制导致的。

百度查询的错误原因:

当前用户是nginx,proxy_temp文件属主是nobody。
注意: 此文件有个坑: 若nginx服务启动用户是nginx,而执行nginx -t 操作时用的是root用户,就会强行改变proxy_temp临时目录的权限(会变成nobody),注意注意!!!!
难怪汇报permission denied。

此时修改的文件夹的属主之后当前问题解决,但是疑惑加深了,为什么网络异常是偶现

看到这里那么恭喜你了,经过架构师的帮助,究其原因还是nginx的机制导致。

nginx的特点如何体现在代理服务器上

先说一下nginx的特点:

  • 静态代理
  • 负载均衡
  • 限流
  • 黑白名单
  • ...
    此处我们重点关注代理的机制
    其实就是生产者消费者模式
    image.png

    响应结果时:client可以看做消费者,backend server可以看做是生产者,此时就存在2种可能。
  • 消费者速度 > 生产者
  • 生产者速度 > 消费者 (重点)
    nginx为了解决消费者速度慢导致的nginx与服务端的链接问题,使用了buffer来解决这一问题。下图完整表达了nginx此时的处理逻辑。也就是用buffer解决生产者速度快,消费者速度慢的问题。但是buffer毕竟空间少,当buffer满了的时候,nginx会将服务端的响应存到硬盘,所以就出现了前文的permission denied。下文详细资料参考博文:https://www.digitalocean.com/community/tutorials/understanding-nginx-http-proxying-load-balancing-buffering-and-caching。
image.png

以上。

你可能感兴趣的:(nginx高并发低时延特点如何体现在代理模块上)