为什么需要chmod o + r父目录来修复Nginx和Passenger的403访问禁止错误?

这可能是一个Nginx的皱纹,也可能是因为我不懂Unix的权限。

我们使用Hudson CI来部署我们的临时实例。 所以RAILS_ROOT/var/lib/hudson/jobs/JOBNAME/workspace

  • 哈德森作为哈德森用户运行
  • Nginx作为www-data用户运行
  • hudsonnginx都是www组的成员
  • 根据我的nginx conf指向RAILS_ROOT/public按照正常。
  • RAILS_ROOT/config/environment.rb属于www-data (所以Passenger作为www-data运行)
  • RAILS_ROOT及其中的所有内容由www组拥有,组具有r / w / x权限

就目前而言,Nginx在请求任何url时都403 permission denied403 permission deniederror.log包含这样的条目: public/index.html" is forbidden (13: Permission denied)

这些并没有解决或改变错误(每一个停止/开始的Ngnix):

  • chmod 777 -R RAILS_ROOT
  • chgrp www -R /var/lib/hudson

我也以root身份尝试过Nginx,并且乘客抱怨找不到config/environment (尽pipe错误页面显示的path是正确的)。

解决的办法是确保everybody都有读取权限在每个目录在heirachy 。 在这种情况下, chmod o+r /var/lib/hudson

但是,如果该对目录具有读取权限,并且nginx是该目录所有者组的成员,为什么需要允许所有人读取权限? 有什么没有关于权限grokked?

 $nginx -V nginx version: nginx/0.7.61 built by gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu8) configure arguments: --prefix=/opt/nginx --add-module=/usr/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/nginx --with-http_ssl_module --with-pcre=~/src/pcre-8.00/ --with-http_stub_status_module $cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=9.10 DISTRIB_CODENAME=karmic DISTRIB_DESCRIPTION="Ubuntu 9.10" 

www-data可能有类似于/bin/false shell,所以如果你想确切地检查问题出在哪里,请执行以下操作:切换到root( susudo -i ),然后运行

 # su -s /bin/bash www-data $ cat /path/to/problem/file 

你会看到,这是关于权限或其他地方的问题。

UPD
嗯…我不会看后写作时间。 在serverfault.com上有“necropost”成就吗? 🙂

* nix和组权限可以有点有趣。 如果用户是多个组的成员,则他们可能有权访问某些文件,而实际上却无法访问它们! 就我所了解的典型的* nix系统而言,你一次看起来属于一个组。 成为会员意味着你可以切换到另外一个组,或者更彻底地检查事情的程序(比如su运行在redhat变体上)也能够看到你是正确组的成员。

有一个sg命令,可以让你像su开关用户一样切换组。

为了解决你的实际问题,我想你可能可以在passwd文件中改变这个组,这样你想要的组就是默认的。 这是假设它不会导致您无法访问您需要的其他文件。

我相信还有另外一个可以安装的nix的ACL解决scheme,它可以以更直观的方式工作,但我并不知道它们。

不,这是乘客问题。 我正在使用独angular兽来运行Rails应用程序,只有最less的权限授予nginx。 (整个应用程序目录不是全局/组可读/可执行的 – 除了根目录710和公共目录710以及其内的文件640)