上游阅读时权限被拒绝


40

我们已经在Nginx和passenger上部署了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"


:您可以设置日志级别调试nginx.org/en/docs/debugging_log.html
Rimian

Answers:


39

我在NGINX / PHP-FPM设置上遇到了相同的问题(php-fpm =针对PHP改进了fcgi)。

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

ps aux | grep "nginx: worker process"

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

ls -l /opt/nginx/proxy_temp/

就我而言,nginx的运行方式为www-data,我的代理目录中的两个目录属于root。

我还不知道它是怎么发生的,但是我通过做(作为root)来解决了

chown www-data.www-data /opt/nginx/proxy_temp

4
最好的解决方案!
efkan

为什么还不接受呢?
Kishor Pawar

1
对于那些谁使用#openresty - “CHOWN WWW的数据:WWW的数据-R在/ usr /本地/ openresty / nginx的/ * _温度”
BG布鲁诺

1
我停止了我的nginx进程,将文件夹重命名为另一个名称,重新启动了nginx进程,它再次使用正确的权限创建了该文件夹。像魅力一样工作!
Chirayu Shishodiya

8

您可能从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

已由root拥有,因此您的nginx(或您尝试切换到的任何名称)用户无法访问它们,因为它们的权限为700。

因此解决方案很容易。停止nginx,然后:

rm -rf /var/cache/nginx/*

或发行和发布的路径。然后重新启动nginx,它将使用适当的权限重新创建这些文件夹。


8

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

我遇到了在目录权限上设置用户名/ nginx的问题,但是nginx.conf用户仅指定了用户名。默认情况下,如果未将组分配给user指令,则其使用的名称与user相同。因此,用户名/用户名试图访问目录,而不是用户名/ nginx。更新配置解决了我的问题。

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


2
您能在这里发布您提到的配置吗?
paweloque 2014年

4

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

setenforce 0

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

直到在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

我真的希望这可以为我节省3个小时的时间。


1
你没看错,我不知道为什么有人投票-1(对他/她感到羞耻)。问题出在基于RedHat / CentOS的主机和selinux中。一种方法是setenforce 0(粗鲁),另一种方法是使用setsebool和网络选项。
periket2000

它对CentOS 7.2有所帮助。
MKatleast3

setsebool -P httpd_can_network_connect 1 来自stackoverflow.com/a/24830777/721331
McKelvin,

3

从非特权帐户启动nginx时use_temp_path=off

proxy_cache_path ... use_temp_path=off;

这需要避免nginx尝试将文件放入默认值proxy_temp_path。从nginx文档:

临时文件的目录是根据use_temp_path参数(1.7.10)设置的。如果忽略此参数或将其设置为on的值,则将使用proxy_temp_path指令为给定位置设置的目录。如果将该值设置为off,则临时文件将直接放置在缓存目录中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.