Bootstrap

nginx反向代理严重错误[crit] (13: Permission denied) while reading upstream问题

nginx作为使用最广泛的一款反向代理软件,其性能也是非常优秀的,一般情况下,直接配置就可以使用,而且也都是稳定高效的,但是在实际应用中,对于不同的应用场景,总是会出现各种各样的问题,只能遇到问题再查找解决问题的解决办法了。

1、现象

前端页面提示打开文件失败:

意思就是加载文件失败。

https://bull.lab/owa/prem/15.1.1979.3/scripts/boot.owaframe.0.narrow.js?bo=1

直接打开文件的时候,文件是可以正常访问的。

查看error.log报错信息:

2024/07/30 15:29:02 [crit] 9021#9021: *251268 open() "/var/lib/nginx/tmp/proxy/6/66/0000000666" failed (13: Permission denied) while reading upstream, client: 10.8.13.42, server: bull.lab, request: "GET /owa/prem/15.1.1979.3/scripts/boot.owaframe.3.narrow.js HTTP/1.1", upstream: "https://10.11.24.44:443/owa/prem/15.1.1979.3/scripts/boot.owaframe.3.narrow.js", host: "bull.lab"

2、原因分析

从错误信息来看,nginx是在写代理 临时文件目录 temp下文件时候出现了权限不足 Permission denied

没有配置:proxy_temp_file_write_size属性。属性作用:当你访问资源信息超过该参数设置的大小时,nginx会先将文件写入临时目录(这里是:/var/lib/nginx/tmp)。所以这里我们可以配置该属性重启nginx解决问题。但这不是问题证明解决方法。即无权限问题,我们查看进程及文件目录用户属性。

查看对应的目录权限:

#: ll /var/lib/nginx/
total 0
drwxr-x--- 7 root root 78 May 31 13:24 tmp

在没有出现问题的机器上是这样的,可以看到目录权限为root。

继续查看另外没有出现问题的机器上的信息如下,可以看到nginx用户具有相关权限。

# ll /var/lib/nginx
drwxrwx--- 7 nginx root 78 Jul 27  2022 tmp

查询进程的执行用户。

# ps -ef | grep nginx
root     29603 25150  0 09:18 pts/1    00:00:00 grep --color=auto nginx
nginx    91485 97955  0 Jul30 ?        00:00:00 nginx: worker process
nginx    91486 97955  0 Jul30 ?        00:00:00 nginx: worker process
nginx    91487 97955  0 Jul30 ?        00:00:00 nginx: worker process
nginx    91488 97955  0 Jul30 ?        00:00:00 nginx: worker process

nginx进程的用户为nginx。

3、解决方法

1、修改proxy_temp_file_write_size限制大小,避免写入临时文件

proxy_temp_file_write_size 64k; #设定缓存文件夹大小

实际上,有时下载文件达到几百K,比如本次遇到问题是的文件原始大小为605K,所以添加这个配置,也只是缓解一般情况下的问题,不解决根本性的问题。
2、修改temp目录用户权限和启动nginx worker权限一致,重新加载配置(nginx -s reload

chown -R nginx:nginx /usr/local/nginx/temp

这种方式是合适的解决办法。

3. 修改nginx的启动用户,在nginx的配置文件nginx.conf文件中

user root;

设置完成后,重新加载配置(nginx -s reload)即可。

;