【问题标题】:Why does Nginx return a 403 even though all permissions are set properly?即使所有权限设置正确,为什么 Nginx 仍返回 403?
【发布时间】:2014-04-30 10:30:54
【问题描述】:

我已经设置好 Nginx 并正确显示了测试页面。如果我尝试更改根路径,我会收到 403 Forbidden 错误,即使所有权限都相同。另外,nginx用户存在。

nginx.conf:

user nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;

pid        /run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    index   index.html index.htm;

    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html; #changed from the default /usr/share/nginx/html
    }
}

namei -om /usr/share/nginx/html/index.html

f: /usr/share/nginx/html/index.html
dr-xr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root share
drwxr-xr-x root root nginx
drwxr-xr-x root root html
-rw-r--r-- root root index.html

namei -om /var/www/html/index.html

f: /var/www/html/index.html
dr-xr-xr-x root root /
drwxr-xr-x root root var
drwxr-xr-x root root www
drwxr-xr-x root root html
-rw-r--r-- root root index.html

错误日志

2014/03/23 12:45:08 [错误] 5490#0: *13 open() “/var/www/html/index.html”失败(13:权限被拒绝),客户端: XXX.XX.XXX.XXX,服务器:localhost,请求:“GET /index.html HTTP/1.1”,主机:“ec2-XXX-XX-XXX-XXX.compute-1.amazonaws.com”

【问题讨论】:

  • tail 日志文件/var/log/nginx/error.log; 告诉我你看到了什么错误?
  • 已添加错误日志 - 抱歉,最初忘记添加 - 这是每个请求的唯一条目。 (我用 Xs 替换了 IP。似乎是预期的错误,不是吗?)
  • @Adam - restorecon -r /var/www/ 将恢复 /var/www/ 及以下的 SELinux 上下文。如果您从mvcp 从外部/var/www 到内部/var/www,那么试试restorecon。我相信这是因为原始的 SELinux 上下文将遵循文档。然而,Kurt 或 Terry 的回答可能解决了这个问题。
  • @Adam - 这个选择的答案还有一些不足之处。它更像是一个观察和另一个问题,而不是一个答案。如果你重新审视问题的细节,我认为你应该选择一个不同的。

标签: nginx installation http-status-code-403


【解决方案1】:

我遇到了同样的问题,这是由于 SELinux 造成的。

检查 SELinux 是否正在运行:

# getenforce

在下次重启前禁用 SELinux:

# setenforce Permissive

重启 Nginx 看看问题是否依然存在。如果您想永久更改设置,您可以编辑/etc/sysconfig/selinux

如果 SELinux 是您的问题,您可以运行以下命令以允许 nginx 为您的 www 目录提供服务(确保在测试之前重新打开 SELinux。即 # setenforce Enforcing

# chcon -Rt httpd_sys_content_t /path/to/www

如果您仍然遇到问题,请查看 getsebool -a 中的布尔标志,特别是您可能需要打开 httpd_can_network_connect 才能访问网络

# setsebool -P httpd_can_network_connect on

对我来说,让 http 为我的 www 目录提供服务就足够了。

【讨论】:

  • 嘿Kurt,你的回答和下面亚当的回答有关系吗?执行您的步骤似乎并没有解决问题(尽管禁用 SELinux 确实如此)。遵循亚当的回答确实解决了这个问题,即使启用了 SELinux。认为您可能对此有更深入的了解。
  • 感谢您的回答!我在这个问题上敲了几个小时(字面意思)后到了这里。我正在共享一个基于熔断器的挂载(例如,到 S3,如 riofs、ObjectiveFS 等)并且 chcon 命令不起作用(“不支持操作”尝试使用 ObjectiveFS 挂载)。您可以使用以下命令来启用它:$ setsebool httpd_use_fusefs 1(我从 ObjectiveFS 支持人员那里得到了这个答案 - 谢谢!)。之后,我可以从保险丝支架提供文件。显然,类似的解决方案应该适用于 nfs(httpd_use_nfs,没有尝试)
  • 最好,在设置所有权限后像魅力chcon -Rt httpd_sys_content_t /path/to/www 一样工作,谢谢。
  • 查看记录 selinux 消息的 /var/log/messages,然后按照消息说明启用正确的策略。
  • 谢谢——我已经放弃了希望。
【解决方案2】:

我遇到了同样的问题。如果您使用 Fedora/RedHat/CentOS,这可能会对您有所帮助:

  • 根据 SELinux:setsebool -P httpd_read_user_content 1

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    首先你必须运行以下命令来允许 nginx 访问文件系统

    sudo setsebool -P httpd_read_user_content 1

    您可以使用以下命令检查文件或目录:

    ls -Z
    

    如果仍然无法访问,您可以尝试使用以下命令更改文件和文件夹的 SELinux 属性:

    chcon -Rt httpd_sys_content_t /path/to/www
    

    但是,上述命令不能应用于FUSE或NFS系统下的文件。

    要启用从 FUSE 挂载提供文件,您可以使用:

    setsebool httpd_use_fusefs 1
    

    要启用从 NFS 挂载提供文件,您可以使用:

    setsebool httpd_use_nfs 1
    

    【讨论】:

      【解决方案4】:

      这是对 Prowlas 答案的补充,但我没有足够的声誉来评论: 如果 /path/to/www 是用户的主目录。你应该试试:

      setsebool -P httpd_enable_homedirs=1
      

      这解决了我的问题

      来源:http://forums.fedoraforum.org/archive/index.php/t-250779.html

      【讨论】:

        【解决方案5】:

        拒绝访问有 2 个可能的原因:

        1. 访问被DAC 拒绝。仔细检查用户、组和文件权限。确保 nginx 进程在以其配置文件中指定的用户身份运行时,可以访问新的 html 根路径。

        2. 访问被MAC 拒绝。其中使用最广泛的是 SELinux。要检查是否导致问题,您可以停止 nginx 进程并运行以下命令:

          setenforce Permissive
          

          然后再次启动nginx,查看是否允许访问。

          或者,您可以检查文件上下文:

          setenforce Enforcing
          ls -Zd /usr/share/nginx/html /var/www/html
          

          如果两个上下文不同,您可能需要更改新 html 根路径的上下文:

          chcon -R -t httpd_sys_content_t /var/www/html
          

          重启nginx看看是否正常。如果是这样,您可以使更改永久化:

          semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
          restorecon -Rv /var/www/html
          

          其中一些命令需要以 root 身份运行。

        【讨论】:

          【解决方案6】:

          看起来合乎逻辑,所有文件都是root用户,尝试将其更改为nginx用户,只是想确保它不是首先被拒绝的列表权限。

          sudo chown -R nginx:nginx /var/www/html
          

          【讨论】:

          • 将所有所有者和组更改为 nginx(包括 /var),我得到相同的错误:2014/03/23 13:08:47 [error] 5595#0: *23 open()" /var/www/html/index.html”失败(13:权限被拒绝),客户端:XXX.XX.XXX.XXX,服务器:localhost,请求:“GET /index.html HTTP/1.1”,主机:“ec2 -XXX-XX-XXX-XXX.compute-1.amazonaws.com"
          • 如果我将它放入 /usr/share/nginx/html 目录,相同的索引文件将起作用,所以我想这是一种解决方法,但我真的很想弄清楚这一点。感谢您的帮助。
          • 有点奇怪,我通常既不使用/var/www也不使用/usr/share/nginx,我真的不能说我以前见过这个错误
          • www-data 用户呢?
          • @NerdOfCode 我会说这取决于 linux 发行版,找到你的发行版正在使用什么并用它替换 nginx
          【解决方案7】:

          当我添加一个带有文件夹/home/new_user 的新用户作为新的虚拟主机时,我遇到了这个问题。确保这些文件夹(/home/home/new_user/home/new_user/xxx...)是755,以便解决我的问题。最后,根据/var/log/nginx/error.log文件,我发现我的问题是正确的。

          【讨论】:

            【解决方案8】:

            请记住,您需要允许其他用户阅读整个路径。还要记住 Dropbox 会将 700 设置为其根目录。所以chmod 755 ~/Dropbox 解决了我的问题。

            【讨论】:

              【解决方案9】:

              我正在使用:

              sudo service nginx start
              

              如果我使用:

              sudo nginx 
              

              ...一切正常。谁能解释一下这两者的区别?

              【讨论】:

              • 在此处查看答案:serverfault.com/a/656371 同样以我的拙见,我认为您应该接受库尔特的回答。
              【解决方案10】:

              我遇到了同样的问题:

              • 检查 nginx.conf 以验证用户
              • 权限设置正确
              • 确保为整个路径设置了“x”权

              从命令行重新启动(我一直在使用 Webmin)并注意到此错误:

               aed@aed:/var/www/test.local$ sudo service nginx restart
               * Restarting nginx nginx 
              nginx: [warn] conflicting server name "test.local" on 0.0.0.0:80, ignored
              nginx: [warn] conflicting server name "test.local" on 0.0.0.0:80, ignored
              

              显然有一个重复的定义,因此我访问“test.local”的尝试失败了。

              【讨论】:

                【解决方案11】:

                在 nginx 上工作对我来说很好

                semanage permissive -a httpd_t
                

                【讨论】:

                  【解决方案12】:

                  使用 /home/{user} 目录为他们的网站提供服务的人们需要在他们的 /home/{user} 目录上提供 chmod 755 访问权限才能完成这项工作。

                  另外,如果服务器上启用了 SELinux,请使用下面提到的命令:-

                  1. sudo setsebool -P httpd_can_network_connect on
                  2. chcon -Rt httpd_sys_content_t /path/to/www

                  【讨论】:

                    【解决方案13】:

                    另一个可能的原因(不在这种情况下)是 index.html 文件指向另一个目录的符号链接。

                    ls -lrt /usr/share/nginx/html/

                    rsync 文件到该特定目录将很容易解决问题。

                    或禁用 nginx.conf 中的符号链接

                    http {
                        disable_symlinks off;
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      修改文件nginx.conf,将用户名改成你的账户名,重启nginx.it就可以了!

                      【讨论】:

                        【解决方案15】:

                        这解决了同样的问题:

                        重启 Nginx 并重试。如果失败,请再次检查日志。这对我有用

                        【讨论】:

                          猜你喜欢
                          • 2017-05-16
                          • 1970-01-01
                          • 2012-03-05
                          • 2021-04-03
                          • 2019-06-15
                          • 1970-01-01
                          • 2020-03-26
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多