我需要帮助确定权限被拒绝错误的根本原因。Nginx需要哪些权限?为什么它如此复杂?
如您所述,将socket API的bind()绑定到小于1024的端口,例如80需要root权限。
这里是“在没有root访问权限的情况下绑定到小于1024的端口”
另一个更简单的方法是以root身份运行nginx。
sudo semanage port -l | grep http_port_t
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
nginx需要root权限。只需使用
sudo nginx
下一步是输入您的密码。
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
),并重新启动所有内容以进行验证。
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
sudo
运行应用程序似乎不是一个好主意。 - SomeGuyOnAComputer