簡體   English   中英

(ubuntu) nginx: [emerg] bind() to 0.0.0.0:80 failed (13: permission denied)

[英](ubuntu) nginx: [emerg] bind() to 0.0.0.0:80 failed (13: permission denied)

我需要幫助找出此權限被拒絕錯誤的根本原因。 nginx需要什么權限? 為什么這么復雜?

套接字 API bind() 到小於 1024 的端口,例如標題中提到的 80,需要 root 訪問權限。

這是“ 綁定到小於 1024 的端口而無需 root 訪問

另一種更簡單的方法是以 root 身份運行 nginx。

如果你以root權限使用大於1024的端口,但仍然出現這個問題,這可能是由SELinux引起的:

檢查這個端口,比如 8024,在 segange 端口

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 被disabled ,您需要先enforcing它。 通過以下方式檢查 SELinux 的狀態

$ sestatus

更多步驟可以閱讀這篇精彩文章: https : //www.digitalocean.com/community/tutorials/an-introduction-to-selinux-on-centos-7-part-1-basic-concepts

如果在運行“nginx -t”后看到此消息,則您沒有以root身份運行的權限“sudo nginx -t”

nginx 需要 root 訪問權限。 只需使用

須藤nginx

下一步以及您的密碼

最好的解決辦法是:

1)將用戶添加到sudoers(我的用戶是prod)

usermod -aG sudo prod

2)在馬戲團(進程管理器)內在 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:不存在 tty 且未指定 askpass 程序)。 可能需要重新啟動會話(重新啟動)。 享受。

prod ALL = NOPASSWD: /usr/sbin/nginx

Ubuntu 使用 AppArmor 而不是 SELinux。 指向 SELinux 的響應可能與 OP 無關。

對於 Google 搜索過的其他人:我也在啟用 SELinux 的 CentOS 7 機器上遇到了這個問題。 nginx 不會綁定端口 80 並給我錯誤13:盡管已經運行setcap 'CAP_NET_BIND_SERVICE=+ep' /usr/sbin/nginx以允許服務將端口與非 root 用戶綁定,但權限被拒絕

暫時將 SELinux 設置為 Permissive ( 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 設置回 Enforcing ( sudo setenforce Enforcing ) 並重新啟動一切以進行驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM