Nginx 将无法启动(地址已在使用中)

Posted

技术标签:

【中文标题】Nginx 将无法启动(地址已在使用中)【英文标题】:Nginx will not start (Address already in use) 【发布时间】:2017-07-07 07:15:53 【问题描述】:

我的 nginx 有问题。我尝试了不同的解决方案,但对我来说没有任何效果。 那是我的错误:

4 root@BANANAS ~ # sudo service nginx restart                                :(
Restarting nginx: nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()
nginx.

你能帮帮我吗?

【问题讨论】:

试试这里发布的一些答案nginx - nginx: [emerg] bind() to [::]:80 failed (98: Address already in use) 看起来 https 已经在使用中了。使用“netstat -tulpn”找出正在使用它的内容。 in 'netstat -tulpn' 在 443 端口上没有听到任何声音。我在评论中尝试了所有这些方法。 寻找正在运行的有问题的软件。对我来说,它原来是 aria2 客户端。 @Deadooshka 我没有 Aria2。 【参考方案1】:

可能其他进程正在使用指定端口:

sudo netstat -tulpn

获取已经使用 443 的进程的 PID。并使用 kill 命令发送信号。

sudo kill -2 <PID>

sudo service nginx restart

您也可以这样做:

sudo fuser -k 443/tcp

确保不要使用旧语法:

server 
    listen :80;
    listen [::]:80;

上面的语法会导致

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

正确的语法:

server 
    listen 80;
    listen [::]:80 ipv6only=on;

server 
    listen [::]:80;

上述两种语法将实现相同的功能,同时监听 ipv4 和 ipv6。

【讨论】:

我没有找到使用端口 443 的程序。这是我的问题。 sudo netstat -tulpn 的输出是什么? 请使用 sudo 并重试 那很奇怪,做一个sudo pkill nginx然后重试,只有nginx被安装为web服务器对吗? 这对我帮助很大。如果您只是使用 sudo apt remove apache2 命令删除它,请确保您没有运行 apache2 =) =_【参考方案2】:

另一种方法(根据我的经验)只是强制退出在该端口 443 上运行的进程

sudo fuser -k 443/tcp 

或者如果您在端口 80 上运行,只需将端口更改为

sudo fuser -k 80/tcp

希望对遇到同样问题的人有所帮助

替代使用lsof:

找到PID并杀死在端口443上运行的进程

sudo kill -9 $(lsof -t -i :443)

【讨论】:

fuser默认没有安装在centos中。 @KhomNazid 然后先安装它【参考方案3】:

感谢您的回答。 运行后

sudo netstat -tulpn

我意识到我在 80 端口上运行了 apache2。这可能是在我使用 Certbot 在服务器上安装 SSL 之后完成的。 我删除了 Apache2,服务器已启动并运行。

apt remove apache2

这成功了!再次感谢。

【讨论】:

为我工作。我使用的 vagrant box 默认安装了apache2,我没有注意到。【参考方案4】:

由于在同一个服务器块内不小心重复了两次listen指令,我收到了上述错误,如下所示:

server     
   listen [::]:443 ssl ipv6only=off; 
   listen 443 ssl; 
   ...

改成:

server     
   listen 443 ssl; 
   ...
 

server     
   listen [::]:443 ssl ipv6only=off; 
   ...
 

解决了重启服务器时的问题:sudo service nginx start

【讨论】:

【参考方案5】:

首先,我们必须检查有多少服务在端口 80 上运行。要检查它,您可以运行以下命令:

sudo netstat -plant | grep 80

这将向您显示哪个服务正在侦听端口 80,然后您可以决定是要使用该服务还是使用 Nginx。

如果是 Apache,你需要决定是使用 Apache 还是 Nginx。

如果你只想拥有Nginx,你需要先停止Apache:

sudo systemctl stop apache2 && sudo systemctl start nginx

【讨论】:

【参考方案6】:

当我终止绑定到 80 和 443 端口的 nginx 进程时,该进程总是以新的 PID 重新出现。

它帮助我在/etc/nginx/nginx.conf中暂时注释了这一行,重启nginx然后取消注释该行:

worker_processes auto;

【讨论】:

在这样做之后必须杀死 -9 pid 并且我可以开始【参考方案7】:

在我的例子中,运行 Ubuntu 20.04,我启动了服务器,Apache2 被设置为自动启动。

$ sudo lsof -i -P -n | grep LISTEN

这表明 Apache2 在端口 80 上运行,并导致了冲突。我用

关闭它
$ sudo systemctl stop Apache2

然后用 nginx 启动

$ sudo systemctl start nginx

【讨论】:

【参考方案8】:

如果使用虚拟机,您可能只需要重新启动虚拟机。我昨天遇到了同样的问题,我无法让 Nginx 开始使用这篇文章中的任何方法。所以今天早上启动虚拟机,查看运行进程,看到Nginx在80端口运行。昨天我什至用systemctl查看了Nginx的状态,它说失败,但今天它是活动的。不确定这里发生了什么,但值得一试。

【讨论】:

以上是关于Nginx 将无法启动(地址已在使用中)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Eclipse 启动 Tomcat:“地址已在使用中”

无法启动 HSQLDB(java.net.BindException:地址已在使用中)

Grails 项目运行错误 - 服务器无法为端口 8080 启动:地址已在使用中:JVM_Bind

无法启动GlassFish 4.0(Windows) - 端口1527 - 已在使用的地址

无法绑定到“127.0.0.1:6600”:地址已在使用中

48)地址已在使用:AH00072:make_sock:无法绑定到地址[::]:80