读取上游时权限被拒绝

use*_*613 44 nginx

我们已经在 Nginx 和乘客上部署了我们的 rails 应用程序。间歇性地,应用程序页面被部分加载。应用日志没有错误,但是Nginx错误日志显示如下:

2011/02/14 05:49:34 [crit] 25389#0: *645 open() "/opt/nginx/proxy_temp/2/02/0000000022" 
  failed (13: Permission denied) while reading upstream, client: x.x.x.x, 
  server: y.y.y.y, request: "GET /signup/procedures?count=0 HTTP/1.1", 
  upstream: "passenger:unix:/passenger_helper_server:", host: "y.y.y.y", 
  referrer: "http://y.y.y.y/signup/procedures"
Run Code Online (Sandbox Code Playgroud)

cmc*_*cmc 44

我在 NGINX/PHP-FPM 设置(php-fpm=improved fcgi for php)上遇到了同样的问题。

您可以找出 nginx 进程以哪个用户身份运行

ps aux | grep "nginx: worker process"
Run Code Online (Sandbox Code Playgroud)

然后检查您的代理文件中的权限是否正确

ls -l /opt/nginx/proxy_temp/
Run Code Online (Sandbox Code Playgroud)

在我的情况下,nginx 正在运行,www-data并且我的代理目录中的两个目录属于 root。

我还不知道它是怎么发生的,但我通过执行(以 root 用户身份)修复了它

chown www-data.www-data /opt/nginx/proxy_temp
Run Code Online (Sandbox Code Playgroud)

  • 最好的解决方案! (5认同)

bvi*_*tor 11

您可能从 user 开始root,然后更改了它。现在的问题是缓存文件夹,即

/var/cache/nginx/client_temp
/var/cache/nginx/fastcgi_temp
/var/cache/nginx/proxy_temp
/var/cache/nginx/scgi_temp
/var/cache/nginx/uwsgi_temp
Run Code Online (Sandbox Code Playgroud)

已由 拥有root,因此您的nginxwww-data或您尝试切换到的任何对象)用户无法访问它们,因为他们拥有700.

所以解决方法很简单。停止nginx,然后:

rm -rf /var/cache/nginx/*
Run Code Online (Sandbox Code Playgroud)

或无论您的发行版和发行版的路径如何。然后重新启动 nginx,这将使用适当的权限重新创建这些文件夹。


小智 8

还要检查 nginx.conf 文件以确保您指定了正确的用户和组。

我遇到了一个问题,即为用户名/nginx 设置了目录权限,但 nginx.conf 用户只指定了用户名。默认情况下,如果没有给 user 指令指定组,它使用与用户相同的名称。因此,用户名/用户名试图访问目录而不是用户名/nginx。更新配置解决了我的问题。

请参阅:http : //nginx.org/en/docs/ngx_core_module.html#user

  • 你能把你提到的配置贴在这里吗? (2认同)

小智 6

所以我做了上述所有事情,不幸的是,它给了我同样的错误。我正在使用 nginx 的 centos 6.7 机器上运行打包成带有扭矩盒的 jar 文件的 rails 应用程序。我为此奋斗了大约 3 个小时,直到找到了另一个解决方案,我希望它可以帮助其他人。根据这篇文章, nginx 可能会在强制模式下运行。我只是简单地将 nginx 更改为许可模式

setenforce 0
Run Code Online (Sandbox Code Playgroud)

这样,错误就消失了,我能够在暂存/生产环境中运行我的应用程序。

我一无所知,直到我在 audit.log 上发现错误

type=AVC msg=audit(1444454198.438:466): avc:  denied  { name_connect } for  pid=3201 comm="nginx" dest=8080 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket
Run Code Online (Sandbox Code Playgroud)

我真的希望这可以节省我刚刚失去的 3 个小时。


小智 -3

chmod 777 /opt/nginx/proxy_temp/
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的问题,通过 chmod 到该目录解决了。

  • chmod 777 从来都不是一个好主意。 (13认同)