我们已经在 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"
答案1
我在 NGINX/PHP-FPM 设置(php-fpm=improved fcgi for php)上遇到了同样的问题。
您可以找出 nginx 进程以哪个用户身份运行
ps aux | grep "nginx: worker process"
然后检查代理文件中的权限是否正确
ls -l /opt/nginx/proxy_temp/
就我而言,nginx 正在运行,并且www-data
我的代理目录中的两个目录属于根目录。
我还不知道它是怎么发生的,但我通过(以 root 身份)操作解决了这个问题
chown www-data.www-data /opt/nginx/proxy_temp
答案2
您可能从用户开始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
(www-data
或您尝试切换到的)用户无法访问它们,因为他们拥有 的权限700
。
所以解决方案很简单。停止 nginx,然后:
rm -rf /var/cache/nginx/*
或者您发行版和发布版本上的路径。然后重新启动 nginx,它将使用适当的权限重新创建这些文件夹。
答案3
还要检查 nginx.conf 文件以确保您指定了正确的用户和组。
我遇到了一个问题,目录上的权限是为 username/nginx 设置的,但 nginx.conf 用户只指定了 username。默认情况下,如果没有为 user 指令指定组,则它使用与 user 相同的名称。因此,username/username 试图访问目录,而不是 username/nginx。更新配置解决了我的问题。
答案4
从非特权帐户启动 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,则将临时文件直接放在缓存目录中。