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

为什么Nginx返回403,即使所有权限都设置正确?,nginx,installation,http-status-code-403,Nginx,Installation,Http Status Code 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.h

我已经安装了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
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
namei-om/var/www/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
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开放() “/var/www/html/index.html”失败(13:权限被拒绝),客户端: 三十、 XXX.XXX,服务器:localhost,请求:“GET/index.html HTTP/1.1”,主机:“ec2 XXX XXX XXX XXX.compute-1.amazonaws.com”


看起来很合理,所有文件都是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

如果您仍然存在问题,请查看
getsebool-a
中的布尔标志,尤其是您可能需要打开
httpd\u can\u network\u connect
进行网络访问

# setsebool -P httpd_can_network_connect on

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

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

setsebool -P httpd_enable_homedirs=1
这解决了我的问题


来源:

我遇到了同样的问题:

  • 已选中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\u read\u user\u content 1

希望这能有所帮助。

我在添加一个新用户时遇到了这个问题,该用户的文件夹为
/home/new\u user
。确保这些文件夹(
/home
/home/new\u user
/home/new\u user/xxx
…)是
755
,以便解决我的问题。最后,根据
/var/log/nginx/error.log
文件,我发现我的问题是正确的。

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

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

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

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

  • 访问被拒绝。使用最广泛的是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\u read\u user\u content 1

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

    ls -Z
    
    chcon -Rt httpd_sys_content_t /path/to/www
    
    如果仍然无法访问,可以尝试使用以下命令更改文件和文件夹的SELinux属性:

    ls -Z
    
    chcon -Rt httpd_sys_content_t /path/to/www
    
    但是,上述命令不能应用于FUSE或NFS系统下的文件

    要启用从保险丝安装服务文件,可以使用:

    setsebool httpd_use_fusefs 1
    
    setsebool httpd_use_nfs 1
    
    要启用从NFS装载服务文件,可以使用:

    setsebool httpd_use_fusefs 1
    
    setsebool httpd_use_nfs 1
    

    在nginx上为我工作很好

    semanage permissive -a httpd_t
    
    另一个可能的原因(本例中不是)是index.html文件的符号链接指向另一个目录

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

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

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

    http {
        disable_symlinks off;
    }
    

    使用/home/{user}目录为其网站提供服务的用户需要在其/home/{user}目录上提供chmod 755访问权限,以实现此功能

    此外,如果服务器上启用了SELinux,请使用以下命令:-

  • sudo setsebool-P httpd_可以_网络_连接上
  • chcon-Rt httpd\u sys\u content\u t/path/to/www

  • tail
    日志文件
    /var/log/nginx/error.log
    并告诉我您看到了什么错误?添加了错误日志-抱歉,原来忘记添加错误-这是每个请求的唯一条目。(我用Xs重新调整了IP的速度。似乎是预期的错误,不是吗?@Adam-
    restorecon-r/var/www/
    将在
    /var/www/
    和下面还原SELinux上下文。如果您从外部
    /var/www
    到内部
    /var/www
    执行
    mv
    cp
    ,请尝试执行
    restorecon
    。我相信这是因为原始的SELinux上下文将遵循文档。库尔特或特里的回答像