![](/img/trans.png)
[英]nginx: [emerg] socket() 0.0.0.0:80 failed (13: Permission denied) on Docker
[英](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.