(Ubuntu) Nginx: [emerg] 绑定() 到 0.0.0.0:80 失败 (13: 权限被拒绝)

35

我需要帮助确定权限被拒绝错误的根本原因。Nginx需要哪些权限?为什么它如此复杂?


1
这是SELinux。请查看我的回答:http://stackoverflow.com/a/22746255/90442 - thisjustin
6个回答

30

21
如果您使用根权限的端口大于1024,但仍然遇到此问题,则可能是由于SELinux引起的:请在segange端口中检查此端口(例如8024)。
sudo semanage port -l | grep http_port_t

如果端口列表中不存在8024,则将其添加到segange端口中。
sudo semanage port -a -t http_port_t  -p tcp 8024

###2017.12.22更新

有时候您的SELinux是被禁用的,您需要先启用它。通过以下命令检查SELinux状态:

$ sestatus

更多步骤可以参考这篇优秀的文章:https://www.digitalocean.com/community/tutorials/an-introduction-to-selinux-on-centos-7-part-1-basic-concepts


3

nginx需要root权限。只需使用

sudo nginx

下一步是输入您的密码。


3
我真的很好奇是否安全可以使用sudo命令来操作nginx。 - Sal Alturaigi
1
我不知道这是否安全,但非root用户应该需要sudo权限才能启动nginx。您可以参考下面的链接了解如何保护nginx。https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-on-ubuntu-14-04 - Jakpren
不需要root访问权限来运行nginx。但是,任何想要使用0-1024端口之间的端口的事物都需要root访问权限,而他的nginx被配置为侦听80端口。任何试图侦听端口80的事物都需要root访问权限。重新配置nginx以侦听1025端口,就不需要root访问权限了。 - hanshenrik
这可能很危险。如果NginX受到安全问题的影响,攻击者可能会立即获得超级用户访问权限。 - X X

2
如果在运行“nginx -t”后看到此消息,则您没有以root身份运行“sudo nginx -t”的权限。

0

Ubuntu使用AppArmor而不是SELinux。指向SELinux的回复可能与OP无关。

对于那些通过谷歌搜索到这里的人:我在启用SELinux的CentOS 7机器上也遇到了这个问题。尽管已经运行了setcap 'CAP_NET_BIND_SERVICE=+ep' /usr/sbin/nginx以允许服务使用非root用户绑定端口,但nginx无法绑定端口80并给出错误13:权限被拒绝

将SELinux临时设置为宽容模式(sudo setenforce Permissive)允许nginx启动。然后我运行了audit2allow -a,得到了以下结果:

#============= httpd_t ==============

#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
allow httpd_t ntop_port_t:tcp_socket name_connect;

这意味着解决方案也是运行:

sudo setsebool -P httpd_can_network_connect on

之后您可以将SELinux设置回强制模式(sudo setenforce Enforcing),并重新启动所有内容以进行验证。


0
最好的解决方案是:
1)将用户添加到sudoers(我的用户名为prod)
usermod -aG sudo prod

2)在circus(进程管理器)中,在nginx可执行文件之前添加sudo,我的看起来像这样:

[watcher:nginx]
cmd = sudo /usr/sbin/nginx
args = -c /home/t/Projects/x_b_11/etc/nginx.conf -p /home/t/Projects/x_b_11

3) 最后将以下行添加到文件/etc/sudoers中(我的用户是prod)。这一行可以避免出现错误(sudo: no tty present and no askpass program specified)。可能需要重新启动会话(重启)。祝使用愉快。

prod ALL = NOPASSWD: /usr/sbin/nginx

4
使用sudo运行应用程序似乎不是一个好主意。 - SomeGuyOnAComputer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接