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

Her*_*t89 50 nginx

我有一个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.
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗?

Far*_*ahi 72

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

sudo netstat -tulpn
Run Code Online (Sandbox Code Playgroud)

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

sudo kill -2 <PID>

sudo service nginx restart
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

sudo fuser -k 443/tcp
Run Code Online (Sandbox Code Playgroud)

确保您不使用旧语法:

server {
    listen :80;
    listen [::]:80;
}
Run Code Online (Sandbox Code Playgroud)

上面的语法会导致

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
Run Code Online (Sandbox Code Playgroud)

正确的语法:

server {
    listen 80;
    listen [::]:80 ipv6only=on;
}
Run Code Online (Sandbox Code Playgroud)

要么

server {
    listen [::]:80;
}
Run Code Online (Sandbox Code Playgroud)

以上两种语法都可以实现相同的功能,同时监听ipv4和ipv6.

  • 那很奇怪,执行“sudo pkill nginx”然后重试,只有 nginx 安装为 Web 服务器,对吗? (2认同)
  • 这对我帮助很大。如果您只是使用 sudo apt remove apache2 命令删除它,请确保您没有运行 apache2 =) =_ (2认同)

Adi*_*ana 6

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

sudo fuser -k 443/tcp 
Run Code Online (Sandbox Code Playgroud)

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

sudo fuser -k 80/tcp
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助遇到同样问题的人

替代使用lsof

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

sudo kill -9 $(lsof -t -i :443)
Run Code Online (Sandbox Code Playgroud)


小智 6

谢谢你的回答。运行后

sudo netstat -tulpn
Run Code Online (Sandbox Code Playgroud)

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

apt remove apache2
Run Code Online (Sandbox Code Playgroud)

这成功了!再次感谢你。


小智 6

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

sudo netstat -plant | grep 80
Run Code Online (Sandbox Code Playgroud)

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

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

如果您只想使用 Nginx,则需要先停止 Apache:

sudo systemctl stop apache2 && sudo systemctl start nginx
Run Code Online (Sandbox Code Playgroud)


gus*_*rom 5

由于在同一服务器块中意外地重复监听指令两次,我收到了上述错误,如下所示:

server {    
   listen [::]:443 ssl ipv6only=off; 
   listen 443 ssl; 
   ...
}
Run Code Online (Sandbox Code Playgroud)

将其更改为:

server {    
   listen 443 ssl; 
   ...
} 
Run Code Online (Sandbox Code Playgroud)

或者

server {    
   listen [::]:443 ssl ipv6only=off; 
   ...
} 
Run Code Online (Sandbox Code Playgroud)

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