一、知其然:
jung@jungsagacity:~$ sudo /software/apache2/bin/apachectl start
[sudo]password for jung:
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
nolistening sockets available, shutting down
AH00015:Unable to open logs
我自己手动安装的apache2目录为:/software/apache2,执行 /software/apache2/bin/apachectl start 之后出现了上述的问题。大意是:地址已经被占用了,不能绑定到地址:0.0.0.0:80。网上很多说法比较表面,没有去谈讨为什么会出现这种情况,怎么彻底去解决。下面我就我的实践,作出一些总结。
二、知其所以然:
1、根据问题来找解决办法:0.0.0.0:80 地址已经被占用,那究竟是被谁占用的呢?这个时候可以调用一个非常实用的命令,netstat-anp > port.txt 查看进行详细信息。
jung@jungsagacity:~$ netstat-anp > port.txt
将所有进程的信息对重定向输出到至指定的一个文本中。打开port.txt,可以发现apach2 已经占用了80端口。tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2143/apache2
看到这,终于想到了,原来我的系统之前已经装过一个apache2,安装文件夹默认在/etc/apache2 。可以看到目录下面有
apache2.conf envvars magic mods-enabled sites-available
conf.d httpd.conf mods-available ports.conf sites-enabled
而httpd.conf是一个空文件。那配置文件去哪儿了呢?原来对于ubuntu 原生的apache2而言,主配置文件是apache2.conf,而httpd.conf只是一个用户配置文件。实际侦听的端口是放在port.conf文件中。打开port.conf文件,可以找到“Listen 80”。这就是问题所在了:原来我的系统启动之后,apache2自动启动了,而且占用了80端口。
我自己安装的是普通的apache2发行版本,主配置文件是httpd.conf,也用习惯了这个版本,所以果断卸载掉原生版本的apache2了。
jung@jungsagacity:~$ sudo apt-get autoremove apache2
卸载之后,再查看
jung@jungsagacity:~$ netstat-anp > port.txt
重新打开port.txt 文件,确实已经没有如下的信息:tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2143/apache2
这些可以放心地启动我普通版本的apache2:
jung@jungsagacity:/software/apache2/bin$ sudo ./apachectl start
jung@jungsagacity:/software/apache2/bin$ sudo netstat -anp >/software/port.txt
打开port.txt,可以发现80端口现在被我们的httpd占用了,:-),基本解决了。
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12428/httpd
三、总结:
PS:其实也可以不用卸载原生态的apache2。只需要将http.conf中的Listen 修改为其他没有被占用的端口即可。