centos7 中关于 nginx 的权限问题

2015-02-19 18:23:22 +08:00
 veezzz

在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应该如何配置

12189 次点击
所在节点    NGINX
22 条回复
Comphuse
2015-02-19 19:04:57 +08:00
假设你的 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 的讲座: http://v.youku.com/v_show/id_XNDc3NzU4OTYw.html
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
2015-02-19 19:07:50 +08:00
Sorry,漏掉了 boolean,是 setsebool -P httpd_enable_homedirs on
veezzz
2015-02-19 19:13:06 +08:00
@Comphuse 那nginx的user配置的目的是什么 为什么不能直接访问呢
Comphuse
2015-02-19 19:15:36 +08:00
@veezzz DAC 权限和 SELinux 必须同时满足才能运行。
Comphuse
2015-02-19 19:41:25 +08:00
刚才查了以下,Nginx 你好像配错了......
http://wiki.nginx.org/UserDir
veezzz
2015-02-19 20:21:02 +08:00
@Comphuse 路径配置我是参考nginx的doc的 我去试试配置selinux 万分感谢你耐心的回答 有问题再请教你
kxmp
2015-02-19 23:58:24 +08:00
所有上层目录都要有读取权限
WildCat
2015-02-20 00:06:59 +08:00
我晕,我今天也遇到这个情况了,无论怎么改权限都不行。明天试试吧
ryd994
2015-02-20 01:13:10 +08:00
@WildCat
@kxmp
先用sudo确认权限,再看selinux,实在不行就先关掉,先定位问题再看办法
WildCat
2015-02-20 10:07:29 +08:00
@ryd994 解决了,如 @kxmp 所说,确实是上层目录的问题。
祝各位新春愉快!
veezzz
2015-02-20 10:09:36 +08:00
@WildCat 需要把上层目录的权限都修改么,应该添加什么权限
WildCat
2015-02-20 10:16:23 +08:00
@veezzz 😂我部署了个新版本,又不行了,233
我再试试去把
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
2015-02-20 11:03:01 +08:00
@WildCat 我有个疑问 如果nginx的user设置为 username 那么 nginx的worker进程应该是以username用户执行的 按理说 username用户是有/home/username下的相关权限的 为什么不行呢
ryd994
2015-02-20 12:26:26 +08:00
@WildCat +x对文件是执行,对目录是进入权限
@veezzz Nginx要对文件做stat操作,所以对整个目录链要有x。抱歉之前没说清楚。用sudo就是sudo -u 用户 做
ryd994
2015-02-20 12:27:06 +08:00
@veezzz (续上)做两件事,stat 和cat
ryd994
2015-02-20 12:29:22 +08:00
@WildCat 别chmod +R用find
find -type d | xargs chmod +x
大约是这样
veezzz
2015-02-20 16:28:21 +08:00
@WildCat 我测试了下 好像是因为selinux的问题引起的
veezzz
2015-02-22 12:04:11 +08:00
@Comphuse 按照你的方法解决了,万分感谢,静态文件可以访问了但是当nginx做反向代理的时候,selinux禁止访问上游服务器,这个问题该怎么处理
veezzz
2015-02-22 13:38:51 +08:00
@Comphuse 解决了, 不过还是想请问你, 有没有nginx与selinux的配置的最佳实践学习下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/171804

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX