nginx 403 Forbidden Error 在用户主目录中托管

dgh*_*dgh 9 ubuntu permissions nginx ubuntu-12.04

我已经在本地机器上的 Ubuntu 12.04 上安装了 nginx 1.1.19,并保留了默认值,/etc/nginx/nginx.conf除了更改用户指令。

/etc/nginx/nginx.conf

user nginx www-data;
worker_processes 4;
pid /var/run/nginx.pid;
...
Run Code Online (Sandbox Code Playgroud)

我想在我的用户目录中使用 web 根目录创建一个简单的静态站点(假设我的用户名是“ubuntu”)。这是我的测试站点的配置。

/etc/nginx/sites-available/test-site

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /home;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.html
    try_files $uri $uri/ /index.html;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules
    }

}
Run Code Online (Sandbox Code Playgroud)

现在显然将我的所有文件放在网络根目录中,因此我不会将其放在真正的服务器上,但这说明了我的观点。如果我在 /home/index.html(不在我的 ubuntu 用户文件夹中)创建一个简单的网页,我可以访问该页面http://localhost/

这很好用。现在我想简单地将 Web 根目录放在用户文件夹中。因此,在 /etc/nginx/sites-available/test-site 中,我将 root 指令更改为 `root /home/ubuntu;。我重新创建测试站点的符号链接,将 /home/index.html 移动到 /home/ubuntu/index.html 并停止并启动 nginx 服务器。现在我收到 403 Forbidden 错误。

我的第一个怀疑是这是一个权限问题。但是,当我跑步时,ls -al index.html我看到

-rw-r--r--  1 nginx   www-data   183 Aug 12 13:13 index.html
Run Code Online (Sandbox Code Playgroud)

哪个看起来对我?甚至运行 chmod 777 /home/ubuntu/index.html 以便权限是

-rwxrwxrwx 1 nginx www-data 183 Aug 12 13:13 index.html
Run Code Online (Sandbox Code Playgroud)

没有帮助。/etc/init.d/nginx configtest也不会产生任何错误,我确定符号链接/etc/

所以我已经在这里呆了几个小时,现在我想知道我的用户目录有什么特别之处,以至于我无法在其中提供任何内容?这些天Ubuntu加密主目录?这可能是问题吗?我在 EC2 Ubuntu 12.04 实例上也有这个问题(不知道用户目录是否在那里加密)

dgh*_*dgh 14

默认用户主目录权限

因此,Ubuntu 12.04 中用户主目录的默认权限似乎是 700。Nginx 需要对应该提供的文件具有读取权限,并且在从根到提供的文件的路径上的每个父目录中都具有执行权限。

您可以通过运行为您的用户目录授予这些权限

chmod 701 user_home
Run Code Online (Sandbox Code Playgroud)

您也可以使用 755,这是许多系统上主目录的默认权限设置。

只要 nginx 运行的用户/组(如 nginx.conf 中定义)对要提供的所有文件具有 READ 权限并且对所有 Web 根目录执行权限。

我只是将我的 web 根目录中的所有目录设置为由我的用户帐户拥有并具有 755 权限,并且我将所有从 web 根目录提供的文件都设置为具有 664 权限,因为这些是我机器上的默认设置。

关于将许可编号转换为字符串代表的注意事项。

Ex. drwxr-x--x becomes 751.
Run Code Online (Sandbox Code Playgroud)

忽略第一个字符(d 表示目录,- 表示文件等)。剩下的 9 个字符形成一个二进制三元组,其中任何非破折号字符都是 1,破折号是 0。

So drwxr-x--x becomes rwxr-x--x 
becomes 111 101 001 
which is converted to a decimal 751
Run Code Online (Sandbox Code Playgroud)

当我处理权限时,我需要复习一下。

  • 我不认为为每个人添加主目录的执行权限是最好的解决方案。最好使用 acl。鉴于您已在 /etc/fstab 中为给定分区设置了 acl,请执行:`setfacl -m 'u:nginx:--x' /home/given_user ` (4认同)