为什么即使所有权限设置正确,Nginx也会返回403?

Ada*_*man 45 installation nginx http-status-code-403

我有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
    }
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

错误日志

2014/03/23 12:45:08 [错误] 5490#0:*13打开()"/ 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"

Kur*_*urt 179

我遇到了同样的问题,这是由于SELinux.

要检查SELinux是否正在运行:

# getenforce
Run Code Online (Sandbox Code Playgroud)

要在下次重新启动之前禁用SELinux:

# setenforce Permissive
Run Code Online (Sandbox Code Playgroud)

重新启动Nginx并查看问题是否仍然存在.如果您想永久更改您可以编辑的设置/etc/sysconfig/selinux

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

# chcon -Rt httpd_sys_content_t /path/to/www
Run Code Online (Sandbox Code Playgroud)

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

# setsebool -P httpd_can_network_connect on
Run Code Online (Sandbox Code Playgroud)

对我来说,这足以让http服务我的www目录.

  • 最好,在设置所有权限后像魅力一样工作`chcon -Rt httpd_sys_content_t /path/to/www` 就是这种情况,谢谢。 (3认同)
  • 嘿,库尔特,您的答案与下面亚当的答案有关系吗?逐步执行步骤似乎无法解决问题(尽管禁用SELinux可以解决此问题)。遵循Adam的答案DID,即使启用了SELinux,也可以解决此问题。以为您可能对此有更多了解。 (2认同)
  • 感谢您的回答!我在这个问题上敲了几个小时(字面意思)后到了这里。我正在共享一个基于熔断器的安装(例如到 S3,如 riofs、ObjectiveFS 等)并且 `chcon` 命令不起作用(“不支持操作”尝试使用 ObjectiveFS 安装)。您可以使用以下命令启用它:`$ setsebool httpd_use_fusefs 1`(我从 ObjectiveFS 支持人员那里得到了这个答案 - 谢谢!)。之后,我可以从保险丝安装中提供文件。显然,类似的解决方案应该适用于 nfs(`httpd_use_nfs`,没有尝试) (2认同)

小智 6

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

  • 据SELinux说: setsebool -P httpd_read_user_content 1

希望这可以帮助.


Ter*_*Lam 6

首先,您必须运行以下命令以允许Nginx访问文件系统

sudo setsebool -P httpd_read_user_content 1

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

ls -Z
Run Code Online (Sandbox Code Playgroud)

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

chcon -Rt httpd_sys_content_t /path/to/www
Run Code Online (Sandbox Code Playgroud)

但是,以上命令不适用于FUSE或NFS系统下的文件。

要启用来自FUSE挂载的服务文件,您可以使用:

setsebool httpd_use_fusefs 1
Run Code Online (Sandbox Code Playgroud)

要从NFS挂载启用服务文件,可以使用:

setsebool httpd_use_nfs 1
Run Code Online (Sandbox Code Playgroud)


Cyk*_*ker 5

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

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

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

    setenforce Permissive
    
    Run Code Online (Sandbox Code Playgroud)

    然后再次启动nginx,查看是否授予访问权限。

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

    setenforce Enforcing
    ls -Zd /usr/share/nginx/html /var/www/html
    
    Run Code Online (Sandbox Code Playgroud)

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

    chcon -R -t httpd_sys_content_t /var/www/html
    
    Run Code Online (Sandbox Code Playgroud)

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

    semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'
    restorecon -Rv /var/www/html
    
    Run Code Online (Sandbox Code Playgroud)

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