【问题标题】:Ubuntu error with apache: (98)Address already in useApache 的 Ubuntu 错误:(98)地址已在使用中
【发布时间】:2012-05-31 12:46:26
【问题描述】:

当我尝试在 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>

我错过了什么?

【问题讨论】:

  • 某事已绑定到端口 80。您是否正在运行另一个 Web 服务器?
  • 我不知道。有没有办法查看端口在使用什么?

标签: apache ubuntu-11.10


【解决方案1】:

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

为此需要改变两点:

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

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

【讨论】:

    【解决方案2】:

    这是因为 80 端口被其他服务转移使用了。

    sudo killall httpd
    

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

    sudo netstat -tulpn| grep :80
    

    然后重启服务器

    sudo service httpd start
    

    【讨论】:

      【解决方案3】:
      netstat -ltnp | grep :80
      

      这将返回以下内容:

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

      然后运行以下命令:

      sudo kill -9 1047
      

      (1047 - PID 号)

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

      重启 Apache。

      sudo service apache2 restart
      

      参考Ubuntu Forums

      【讨论】:

      • 最佳答案在这里。谢谢!
      • 对我来说“sudo netstat -ltnp | grep :80”有效。
      • 哦,你救了我的命
      【解决方案4】:

      除了解决方法find process running on :80 并杀死,然后重新启动,

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

      【讨论】:

        【解决方案5】:

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

        sudo service nginx stop
        sudo service apache2 start
        

        【讨论】:

          【解决方案6】:

          似乎 80 端口已被占用。使用其他端口或尝试netstatgrep 结果仅选择其中值为 80 的行)、pskill 以查看哪个应用程序占用了该端口并将其关闭。

          【讨论】:

            【解决方案7】:

            当前运行的服务列表,

            $ 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
            

            【讨论】:

              【解决方案8】:

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

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

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

              【讨论】:

                【解决方案9】:

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

                这是 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,并希望获得最好的结果。

                【讨论】:

                  【解决方案10】:

                  我遇到了同样的问题,但原因却截然不同。我在 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又开心了。

                  也许这对某人有帮助...

                  【讨论】:

                    【解决方案11】:

                    确保您没有在多个位置使用命令 Listen 80

                    在我的例子中,我遇到了同样的错误,原因是这个命令同时在 ports.conf 和 sites-enabled/000-default 中。

                    【讨论】:

                    • 现在似乎很明显,我找到了答案,但我遇到了这个确切的问题。很好的电话也发布了这个答案。
                    • 我在 ports.conf 和我的反向代理配置中遇到了同样的问题。非常感谢!
                    【解决方案12】:

                    sudo kill -9 -2321 (pid) 重启BT 完毕..... 无需更改 conf.文件。

                    【讨论】:

                      【解决方案13】:

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

                      使用sudo /etc/init.d/apache2 reload 而不是/etc/init.d/apache2 reload

                      【讨论】:

                        【解决方案14】:
                        sudo netstat -tulpn| grep :80
                        

                        pkill进程(nginx?)

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

                        【讨论】:

                          猜你喜欢
                          • 2015-06-04
                          • 2020-04-15
                          • 1970-01-01
                          • 2019-09-17
                          • 2019-04-17
                          • 2020-10-13
                          • 2023-01-25
                          • 2011-05-26
                          • 1970-01-01
                          相关资源
                          最近更新 更多