V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
veezzz
V2EX  ›  NGINX

centos7 中关于 nginx 的权限问题

  •  
  •   veezzz · 2015-02-19 18:23:22 +08:00 · 12320 次点击
    这是一个创建于 3563 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在centos中有一个user名为worker,所以在nginx.conf的配置中配置

    user: worker
    server{
        location: /static/{
            root /home/worker;
        }
    }
    

    可是运行后,访问127.0.0.1/static/test.html,依然报错权限问题

    2015/02/19 01:45:42 [error] 3634#0: *open()"/home/worker/static/test.html" failed (13: Permission denied),
    

    nginx应该如何配置

    22 条回复    2015-02-22 15:09:32 +08:00
    Comphuse
        1
    Comphuse  
       2015-02-19 19:04:57 +08:00   ❤️ 3
    假设你的 Nginx 配置没有任何问题,并且运行 getenforce 的结果是 Enforcing。

    首先你要让 SELinux 允许 httpd[1] 访问用户目录。很简单,root 运行 setsebool -P httpd_enable_homedirs 。
    "-P" 的意思是 permanent,不带 -P 的话系统重启后恢复默认配置。

    然后你要修改 /home/user/static 的 SELinux context。告诉 SELinux,允许此目录被 httpd 访问:
    chcon -v -t httpd_user_content_t /home/user/static

    没有意外的话应该就可以访问了。

    简单易懂的关于 SELinux 的讲座:

    Red Hat 出的 SELinux 手册: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/index.html

    更多和 httpd 有关的 SELinux 开关:
    getsebool -a | grep httpd
    安装 selinux-policy-devel,然后 man httpd_selinux

    [1] 在 RHEL/CentOS/Fedora 下,
    httpd 包是 apache。但 apache 和 nginx 的 SELinux context 都是:system_u:system_r:httpd_t:s0。
    Comphuse
        2
    Comphuse  
       2015-02-19 19:07:50 +08:00   ❤️ 1
    Sorry,漏掉了 boolean,是 setsebool -P httpd_enable_homedirs on
    veezzz
        3
    veezzz  
    OP
       2015-02-19 19:13:06 +08:00
    @Comphuse 那nginx的user配置的目的是什么 为什么不能直接访问呢
    Comphuse
        4
    Comphuse  
       2015-02-19 19:15:36 +08:00   ❤️ 1
    @veezzz DAC 权限和 SELinux 必须同时满足才能运行。
    Comphuse
        5
    Comphuse  
       2015-02-19 19:41:25 +08:00
    刚才查了以下,Nginx 你好像配错了......
    http://wiki.nginx.org/UserDir
    veezzz
        6
    veezzz  
    OP
       2015-02-19 20:21:02 +08:00
    @Comphuse 路径配置我是参考nginx的doc的 我去试试配置selinux 万分感谢你耐心的回答 有问题再请教你
    kxmp
        7
    kxmp  
       2015-02-19 23:58:24 +08:00   ❤️ 1
    所有上层目录都要有读取权限
    WildCat
        8
    WildCat  
       2015-02-20 00:06:59 +08:00 via iPhone
    我晕,我今天也遇到这个情况了,无论怎么改权限都不行。明天试试吧
    ryd994
        9
    ryd994  
       2015-02-20 01:13:10 +08:00 via Android   ❤️ 1
    @WildCat
    @kxmp
    先用sudo确认权限,再看selinux,实在不行就先关掉,先定位问题再看办法
    WildCat
        10
    WildCat  
       2015-02-20 10:07:29 +08:00
    @ryd994 解决了,如 @kxmp 所说,确实是上层目录的问题。
    祝各位新春愉快!
    veezzz
        11
    veezzz  
    OP
       2015-02-20 10:09:36 +08:00
    @WildCat 需要把上层目录的权限都修改么,应该添加什么权限
    WildCat
        12
    WildCat  
       2015-02-20 10:16:23 +08:00
    @veezzz 😂我部署了个新版本,又不行了,233
    我再试试去把
    WildCat
        13
    WildCat  
       2015-02-20 10:28:40 +08:00
    @veezzz
    linux 新手,刚才是把 home 路径又记错了。
    重新试了下,假设 home 路径是 /root

    chomd -R a+r /root

    没用

    chomd -R a+x /root

    可以解决。

    楼上有说要读取权限,不知这里为何还得给执行权限。

    自己是小采集站,就随意了,楼主如果是生产环境要小心了。

    nginx version: nginx/1.6.2
    veezzz
        14
    veezzz  
    OP
       2015-02-20 11:03:01 +08:00   ❤️ 1
    @WildCat 我有个疑问 如果nginx的user设置为 username 那么 nginx的worker进程应该是以username用户执行的 按理说 username用户是有/home/username下的相关权限的 为什么不行呢
    ryd994
        15
    ryd994  
       2015-02-20 12:26:26 +08:00 via Android   ❤️ 1
    @WildCat +x对文件是执行,对目录是进入权限
    @veezzz Nginx要对文件做stat操作,所以对整个目录链要有x。抱歉之前没说清楚。用sudo就是sudo -u 用户 做
    ryd994
        16
    ryd994  
       2015-02-20 12:27:06 +08:00 via Android
    @veezzz (续上)做两件事,stat 和cat
    ryd994
        17
    ryd994  
       2015-02-20 12:29:22 +08:00 via Android   ❤️ 1
    @WildCat 别chmod +R用find
    find -type d | xargs chmod +x
    大约是这样
    veezzz
        18
    veezzz  
    OP
       2015-02-20 16:28:21 +08:00   ❤️ 1
    @WildCat 我测试了下 好像是因为selinux的问题引起的
    veezzz
        19
    veezzz  
    OP
       2015-02-22 12:04:11 +08:00
    @Comphuse 按照你的方法解决了,万分感谢,静态文件可以访问了但是当nginx做反向代理的时候,selinux禁止访问上游服务器,这个问题该怎么处理
    veezzz
        20
    veezzz  
    OP
       2015-02-22 13:38:51 +08:00
    @Comphuse 解决了, 不过还是想请问你, 有没有nginx与selinux的配置的最佳实践学习下
    Comphuse
        21
    Comphuse  
       2015-02-22 14:38:32 +08:00
    @veezzz nginx 配置文件和 aureport -a 的结果贴一下
    veezzz
        22
    veezzz  
    OP
       2015-02-22 15:09:32 +08:00
    @Comphuse 反向代理的问题解决了, 在http_port_t中添加了反向代理用的port,我是想问问有没有nginx与selinux配置的文章啊什么的可以学习
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5326 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:39 · PVG 15:39 · LAX 23:39 · JFK 02:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.