为什么我在启动 Apache2 时收到“权限被拒绝:make_sock:无法绑定到地址”?

Art*_*san 28 server permissions apache2

我可以停止使用

/etc/init.d/apache2 stop
Run Code Online (Sandbox Code Playgroud)

但是当我想使用以下方法再次启动它时:

/etc/init.d/apache2 start
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Starting web server apache2                                                  /usr/sbin/apache2ctl: 87: ulimit: error setting limit (Operation not permitted)
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
Action 'start' failed.
The Apache error log may have more information.
                                                                         [fail]
Run Code Online (Sandbox Code Playgroud)

Ste*_*f K 59

关于您遇到的错误的一些话,希望将来可以使您免于类似的情况。

在 Linux 中,从 0 到 1024 的端口保留供系统使用。这意味着为了使用一个,您必须有权更改 - 访问基本系统设置。root 用户拥有这样的权限,实际上可以使用 0 - 1024 范围内的端口。

如您所见,在您的问题中,系统通过 Apache2 响应指示了问题的根源([...] 无法绑定到地址 blah blah 80):

(13)Permission denied: make_sock: could not bind to address [::]:80
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
Run Code Online (Sandbox Code Playgroud)

当 Apache2 http 守护进程启动时,它会尝试绑定 80 端口,因为它是 HTTP see 中使用的默认端口,这是系统分配端口中的一个端口,因此它只能由 root 访问。

您以没有 root 权限的典型用户身份执行了 start 命令,但导致执行失败。

简单来说:

你:

嗨Apache2。我是 Kongthap,我告诉你开始 ( /etc/init.d/apache2 start)

阿帕奇2:

好的。我正在启动(启动 web 服务器 apache2)

系统,请给我80端口使用和监听连接。

系统:

好的。一分钟检查...

啊...对不起Apache2,但我不能让你在80端口运行,它是供个人使用的。

而且您没有正确的权限来绑定它。( Operation not permitted)

阿帕奇2:

哦,Kongthap 我启动失败,系统不让我启动 ( (13)Permission denied:[...])

结论

这个问题主要有两种解决方法:

  1. 使用 root 权限运行 Apache2 HTTP 守护进程sudo

    sudo service apache2 start
    
    Run Code Online (Sandbox Code Playgroud)

    或者:

    sudo /etc/init.d/apache2 start
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从更改默认端口80的东西大于1024,比如说200025009000,等。典型的端口运行时在这样的情况是8080

    sudo vi /etc/apache2/ports.conf
    
    Run Code Online (Sandbox Code Playgroud)

    寻找或如果没有添加:

    Listen 8080
    
    Run Code Online (Sandbox Code Playgroud)

    或您选择的任何其他端口(例如端口)> 1024并且所选端口未被其他进程使用。

  • 真的很好的解释!!! (5认同)

Sau*_*mar 7

以下是启动/停止/重启apache服务器的命令:


小智 5

通过发出命令检查 selinux 端口上下文

semanage port -l | grep http
Run Code Online (Sandbox Code Playgroud)

如果它存在于 http_port_t 列表中,那就没问题,否则添加你的端口

semanage port -a -t http_port_t -p tcp 80
Run Code Online (Sandbox Code Playgroud)

或者你想要分配的东西。