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