32

当我尝试在 Ubuntu 中启动 Apache 时出现此错误。

 (98)Address already in use: 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.

我的ports.conf中有这个

NameVirtualHost *:80
Listen 80

这是我的虚拟主机文件

<VirtualHost *:80>
          ServerAdmin example@example.com
          ServerName rails.server.com
          # ServerAlias
          DocumentRoot /var/www/sample_app/current/public
          ErrorLog /var/www/sample_app/error.log

          RailsEnv production
        <Directory "/var/www/sample_app/current/public">
          Options Indexes FollowSymLinks MultiViews
          Order allow,deny
          Allow from all
        </Directory>
</VirtualHost>

我错过了什么?

4

14 回答 14

69
netstat -ltnp | grep :80

这将返回以下内容:

tcp6 0 0 :::80 :::* 听 1047/apache2

然后运行以下命令:

sudo kill -9 1047

(1047 - PID 号)

(出现在您的特定实例上的 pid。)

重启阿帕奇。

sudo service apache2 restart

参考Ubuntu 论坛

于 2013-05-31T04:46:46.460 回答
12

看来80端口已经被占用了。使用另一个端口或尝试netstatgrep结果仅选择其中值为 80 的行),pskill查看哪个应用程序占用了该端口并将其关闭。

于 2012-05-24T22:00:43.953 回答
12

在所有情况下,终止进程可能不起作用,因为使用端口 80 的进程将重新启动并且不允许使用该端口。所以可以做的是改变apache的端口,如果这无关紧要的话。

为此需要改变两件事:

  1. 使用任何文本编辑器打开/etc/apache2/ports.conf并将条目的值更改为Listen 80所需的端口(例如Listen 8080)。

  2. 将条目更改为您在(例如)中的文件中<virtualhost 80>提供的相同端口号。/etc/apache2/ports.conf/etc/apache2/sites-enabled/000-default<virtualhost 8080>

于 2012-11-26T04:10:11.903 回答
9

确保您没有Listen 80在多个地方拥有该命令。

就我而言,我遇到了同样的错误,原因是该命令同时位于 ports.conf 和 sites-enabled/000-default 中。

于 2013-07-31T11:16:15.987 回答
6

就我而言,它是 nginx(因为我的服务器上有它)。

sudo service nginx stop
sudo service apache2 start
于 2016-08-23T19:57:41.523 回答
4
sudo netstat -tulpn| grep :80

pkill进程(nginx?)

禁用任何绑定到您不想绑定到端口 80 的虚拟主机(nginx?)。它在 /etc/nginx/sites-enabled 或 /etc/apache2/sites-enabled

于 2012-06-20T20:42:15.187 回答
1

sudo kill -9 -2321 (pid) Restart BT Done..... 无需更改 conf。文件。

于 2013-07-14T23:15:54.830 回答
0

当您通过终端重新启动或启动服务器时,您可能忘记在命令前添加sudo

使用sudo /etc/init.d/apache2 reload代替/etc/init.d/apache2 reload

于 2013-05-17T06:38:26.613 回答
0

我遇到了同样的问题,原因却截然不同。我在 CentOS 6.5 上运行 Apache 2.4.7 和 PHP 5.5.6。

我通过同时设置 output_handler=ob_gzhandler 和 zlib.output_compression=On 搞砸了 php.ini(可以设置其中一个,不能同时设置)。

所以在重新启动 Apache 时,它​​绑定到端口 80,但没有其他任何事情发生。看起来它正在运行,但是 php 的错误将它锁定在某个地方。

线索是检查“php -v”……当我看到它没有返回任何东西(它把错误写入error_log)时,我修复了php.ini,Apache又开心了。

也许这可以帮助某人...

于 2013-12-20T07:30:26.397 回答
0

启动 apache2 时,我在全新安装 Ubuntu 12.10 时遇到此错误。

这是apache2中的一个错误。它被挂在后台。这是我对软件中可能存在错误的位置的演练。

这是我得到的错误:

el@titan:~$ sudo service apache2 start
 * Starting web server apache2               
(98)Address already in use: 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]

地址已在使用中?它可以用来做什么?看看这个:

el@titan:~$ grep -ri listen /etc/apache2
/etc/apache2/apache2.conf:#   supposed to determine listening ports for incoming connections, and which
/etc/apache2/apache2.conf:# Include list of ports to listen on and which to use for name based vhosts
/etc/apache2/ports.conf:Listen 80
/etc/apache2/ports.conf:    Listen 443
/etc/apache2/ports.conf:    Listen 443

这意味着 apache2 正在阻止 apache2 启动。奇怪。这将确认:

el@titan:~$ ps -ef | grep apache2
root      1146   954  0 15:51 ?        00:00:00 /bin/sh /etc/rc2.d/S91apache2 start
root      1172  1146  0 15:51 ?        00:00:00 /bin/sh /usr/sbin/apache2ctl start
root      1181  1172  0 15:51 ?        00:00:00 /usr/sbin/apache2 -k start
root      1193  1181  0 15:51 ?        00:00:00 /bin/bash /usr/share/apache2/ask-for-passphrase 127.0.1.1:443 RSA
el        5439  5326  0 16:23 pts/2    00:00:00 grep --color=auto apache2

是的,在这种情况下 apache2 正在运行,我试图在同一个端口上第二次启动 apache2。

让我感到困惑的是,service报告 apache2 没有运行:

el@titan:~$ sudo service apache2 status
Apache2 is NOT running.

当您查询 apache2ctl 的状态时,它会挂起。

root@titan:~# /usr/sbin/apache2ctl status
**hangs until Ctrl-C is pressed.

所以 Ubuntu 在启动时似乎无法管理 apache2。是时候停止 apache2:

root@titan:~# /usr/sbin/apache2ctl stop
httpd (no pid file) not running

一个大线索!您尝试停止 apache2 并且它丢失了进程 ID!所以Ubuntu无法阻止apache2,因为它不知道它在哪里!

您会认为重新启动会修复它,但这不是因为 apache2 在启动时启动并挂起。apache2 的正常启动过程无法正常工作。

那么如何解决呢?

我能够通过分析ps命令输出来解决这个问题。请注意,该ps命令告诉我们该进程是由“/etc/rc2.d/S91apache2 start”启动的。

那是需要快速踢的违规程序。

/etc/rc2.d/S91apache2是用于在计算机启动时为您启动 apache2 的符号链接。由于某种原因,它似乎正在启动 apache2 然后挂起。所以我们必须告诉它不要那样做。

所以去看看那个/etc/rc2.d/S91apache2

el@titan:/etc/rc2.d$ ls -l
lrwxrwxrwx   1 root root    17 Nov  7 21:45 S91apache2 -> ../init.d/apache2*

这是一个我们不希望它存在的符号链接。这样做可以防止 apache2 在启动时启动:

root@titan:~# sudo update-rc.d -f apache2 remove
 Removing any system startup links for /etc/init.d/apache2 ...
   /etc/rc0.d/K09apache2
   /etc/rc1.d/K09apache2
   /etc/rc2.d/S91apache2
   /etc/rc3.d/S91apache2
   /etc/rc4.d/S91apache2
   /etc/rc5.d/S91apache2
   /etc/rc6.d/K09apache2

重新启动计算机以确保 apache2 不会启动并挂起。好的好的。现在您可以将 apache2 恢复原状,但这会使它再次失败。

root@titan:~$ sudo update-rc.d apache2 defaults     //(don't do this)
 Adding system startup for /etc/init.d/apache2 ...
   /etc/rc0.d/K20apache2 -> ../init.d/apache2
   /etc/rc1.d/K20apache2 -> ../init.d/apache2
   /etc/rc6.d/K20apache2 -> ../init.d/apache2
   /etc/rc2.d/S20apache2 -> ../init.d/apache2
   /etc/rc3.d/S20apache2 -> ../init.d/apache2
   /etc/rc4.d/S20apache2 -> ../init.d/apache2
   /etc/rc5.d/S20apache2 -> ../init.d/apache2

相反,像这样启动 apache2:

sudo service apache2 start

并且 apache2 已备份并再次提供页面。apache2/Ubuntu 12.10 似乎存在一些严重的错误,导致 apache2 启动并挂起。这是一种解决方法,我想解决方法是获取更新版本的 apache2 和 Ubuntu,并希望获得最好的结果。

于 2014-01-05T18:16:10.273 回答
0

就我而言,我删除了默认ssl.conf文件(重命名为ssl.conf.bak),并拥有自己的 ssl 配置文件。

然后我做了一个yum update并且它更新了 apache... 这也重新引入了文件ssl.conf,这意味着我有 2 个 conf 文件Listen 443

解决方案(通用 - CentOS):去/etc/httpd/conf.d,做一个grep -r 'Listen' .,看看你是否有重复的Listen XXX语句,根据需要删除它们。

于 2014-04-07T18:29:22.487 回答
0

当前运行的服务列表,

$ sudo netstat -tulpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8069            0.0.0.0:*               LISTEN      6399/python     
tcp        0      0 0.0.0.0:53670           0.0.0.0:*               LISTEN      6681/Brackets-node
....
....

仅查找特定服务,

$ sudo netstat -tulpn| grep python
jpa@jpa-dell:~/odoo/master-hr-holidays-newapi-jpa$ sudo netstat -tulpn| grep python
tcp        0      0 0.0.0.0:8069            0.0.0.0:*               LISTEN      6399/python     
tcp        0      0 127.0.0.1:41974         0.0.0.0:*               LISTEN      3123/python 

您是否注意到上面运行 python 的结果 PID (6399)。

使用以下命令终止该服务,

$ sudo kill -9 -6399

现在服务已完全停止,您可以正常重新启动。


用于查找正在运行的服务的额外命令,

$ ps -ef
$ ps -ef | grep python
于 2015-03-23T09:18:02.460 回答
0

除了解决方案找到在 :80 上运行的进程并杀死,然后重新启动,

如果您在 apache conf 文件或 apache conf 文件中包含的任何 .conf 文件中有多个“Listen”条目,则可能会出现此错误。希望这对某人有帮助..!!

于 2017-06-21T13:45:22.913 回答
0

这是由于端口 80 被其他服务转移使用。

sudo killall httpd

检查任何服务是否仍在使用 80

sudo netstat -tulpn| grep :80

并重新启动服务器

sudo service httpd start

在此处输入图像描述

于 2018-09-02T10:07:11.190 回答