为什么 Nginx 返回一个403,即使所有权限都设置正确?

我有 Nginx 设置和显示测试页面正确。如果尝试更改根路径,将得到一个403禁止错误,尽管所有权限都是相同的。另外,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/2312:45:08[ error ]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”

73650 次浏览

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

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

我用的是:

sudo service nginx start

如果我使用:

sudo nginx

一切正常,有人能解释一下这两者的区别吗?

我经历了同样的问题,这是由于 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 目录就足够了。

这是普罗维拉斯的补充回答,但我没有足够的声誉来评论: 如果/path/to/www 是用户的主目录,您应该尝试:

setsebool -P httpd_enable_homedirs=1

这解决了我的问题

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

我遇到了同样的问题:

  • 检查 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”的尝试失败了。

这解决了同样的问题:

重新启动 Nginx 并再试一次。如果失败,再次检查日志。这对我很有效

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

  • 根据 SELinux: setsebool -P httpd_read_user_content 1

希望这个能帮上忙。

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

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

修改文件 nginx.conf,将用户名更改为帐户名,然后重新启动 nginx.it!

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

  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 用户运行。

首先,您必须运行以下命令才能允许 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

在 nginx 上为我工作很好

semanage permissive -a httpd_t

另一个可能的原因(这次不行)是 index.html 文件指向另一个目录的符号链接。

Ls-lrt/usr/share/nginx/html/

enter image description here

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

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

http {
disable_symlinks off;
}

使用/home/{ user }目录为其网站提供服务的人员需要在他们的/home/{ user }目录上提供 chmod 755访问权限来实现此功能。

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

  1. 连接上
  2. Chcon-Rt httpd _ sys _ content _ t/path/to/www