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

时间:2014-03-23 02:01:56

标签: nginx installation 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
    }
}

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"

15 个答案:

答案 0 :(得分:158)

我遇到了同样的问题,这是由于 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目录。

答案 1 :(得分:6)

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

  • 根据SELinux:setsebool -P httpd_read_user_content 1

希望这有帮助。

答案 2 :(得分:6)

First of all you have to run following command to allow nginx to access filesystem

sudo setsebool -P httpd_read_user_content 1

You can check if the files or directory with following command:

ls -Z

If it is still not accessible, you can try changing the SELinux property of the files and folder with following command:

chcon -Rt httpd_sys_content_t /path/to/www

However, above command cannot apply to files under FUSE or NFS system.

To enable serving files from FUSE mounts, you can use:

setsebool httpd_use_fusefs 1

To enable serving files from NFS mounts, you can use:

setsebool httpd_use_nfs 1

答案 3 :(得分:3)

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

setsebool -P httpd_enable_homedirs=1

这解决了我的问题

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

答案 4 :(得分:2)

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

sudo chown -R nginx:nginx /var/www/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 :(得分:1)

我正在使用:

sudo service nginx start

如果我使用:

sudo nginx 

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

答案 7 :(得分: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”失败。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

使用/ home / {user}目录服务其网站的人们需要在/ home / {user}目录中提供chmod 755访问权限,以使此工作有效。

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

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

答案 11 :(得分:0)

在nginx上对我来说工作正常

semanage permissive -a httpd_t

答案 12 :(得分:0)

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

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

enter image description here

rsync文件到该特定目录将轻松解决问题。

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

http {
    disable_symlinks off;
}

答案 13 :(得分:-1)

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

答案 14 :(得分:-7)

这解决了同样的问题:

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