nginx-nginx:[emerg] bind()到[::]:80失败(98:地址已在使用中)


248

突然我收到以下Nginx错误

 * Restarting nginx
 * Stopping nginx nginx
   ...done.
 * Starting nginx nginx
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
   ...done.
   ...done.

如果我跑步

lsof -i :80 or sudo fuser -k 80/tcp 

我什么都没有。80端口上没有任何内容

然后我运行以下命令:

sudo netstat -pan | grep ":80"
tcp        0      0 127.0.0.1:8070          0.0.0.0:*               LISTEN      15056/uwsgi     
tcp        0      0 10.170.35.97:39567      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39564      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39584      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39566      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39571      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39580      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39562      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39582      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39586      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39575      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39579      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39560      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39587      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39591      10.158.58.13:8080       TIME_WAIT   -               
tcp        0      0 10.170.35.97:39589      10.158.58.13:8080       TIME_WAIT   - 

我很沮丧 我该如何调试?

我正在将uwsgi与端口8070上的代理传递一起使用。uwsgi正在运行。Nginx不是。我正在使用Ubuntu 12.4

以下是我的Nginx conf文件的相关部分

upstream uwsgi_frontend {
          server 127.0.0.1:8070;
        }
server {
listen 80;
        server_name 127.0.0.1;
        location = /favicon.ico {
                  log_not_found off;
                }



                location / {
                       include uwsgi_params;
                       uwsgi_buffering off;

                       uwsgi_pass 127.0.0.1:8070;
                 }
        }

这是我在Ubuntu 12.04上安装Nginx的方法

nginx=stable;add-apt-repository ppa:nginx/$nginx;
apt-get update
apt get install nginx-full

19
我发现了从未有过的问题。我不得不删除/ etc / nginx / sites-available / default。然后它起作用了。我的conf位于/ etc / nginx / default中
坦帕

我正在运行Nginx + Varnish并出现此错误。解决方案是两者都停止,然后先启动nginx,然后上光油。
2014年

您可以尝试停止命名服务。
2014年

您是否从启用了网站的网站上删除了默认设置?
Wolfpack'08

我在这里尝试了所有解决方案。检查了所有正在使用的端口(NGINX本身正在使用该端口),因此我杀死了该端口并重新启动它。像魅力一样工作。
加文

Answers:


202

[::]:80 是ipv6地址。

如果您的nginx配置正在侦听端口80和port,则可能导致此错误[::]:80

我的默认网站可用文件中包含以下内容:

listen 80;
listen [::]:80 default_server;

您可以通过添加如下内容ipv6only=on来解决此[::]:80问题:

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

有关更多信息,请参见:

http://forum.linode.com/viewtopic.php?t=8580

http://wiki.nginx.org/HttpCoreModule#listen


11
您也可以通过删除监听80来解决它。因为listen [::]:80侦听IPv4和IPv6。但是要小心,因为某些系统(例如FreeBSD)将IPv4和IPv6套接字分开,然后将不起作用,但是对于Linux来说应该没问题。wiki.nginx.org/HttpCoreModule#listen
gitaarik 2013年

4
感谢您对此进行深入研究,并提供了有关删除原因为何/etc/nginx/sites-available/default导致上述错误的解释。
奥利弗(Oliver)

1
即使当我注释掉ipv6行时,尝试执行仍然会出现相同的错误sudo service nginx restart。当我这样做时netstat -tulpn |grep 80,我只会得到一次nginx进程(0.0.0.0:80)。有什么想法为什么它将无法重新启动?
2014年

我赞同@rednaw所说的,但是除了删除监听以外,您只需将其注释掉即可
d4nyll

设置ipv6only=on解决了这个问题,但是nginx应该真正检测到它试图绑定到相同的interface:port两次。
Dan Dascalescu 2015年

245

我通过运行解决了这个问题 sudo apachectl stop -事实是apache在后台运行,并阻止了nginx在所需端口上启动。

在ubuntu上运行 sudo /etc/init.d/apache2 stop


8
用于sudo /etc/init.d/apache2 stop在Ubuntu 14.04上停止apache
Footniko

3
原因是因为您不能有两个Web服务器侦听同一端口。选择一个,如果需要,选择代理。例如,使用nginx,但对于某些请求(例如,php文件),请代理到Apache端口。
d4nyll

同样在全新的debian 9安装上。
jirarium

谢谢。但是知道为什么突然开始吗?我有一个星期没有接触服务器,但它已于昨晚启动。
阿杰·辛格

1
感谢您的解决方案。它对我有用,我使用Google Cloud Platform
congle

91

我的情况不同,我必须终止运行Nginx才能重新启动它。

代替

sudo systemctl restart nginx

我不得不使用:

sudo pkill -f nginx & wait $!
sudo systemctl start nginx

1
我正在使用404 Not Found,并且使用了您的建议,现在我确实解决了问题。谢谢。

2
这对我有用。什么都没做。不确定系统重启时会启动什么进程,但是我将其添加到重启nginx例程中。谢谢!
Khom Nazid

38

我发现了从未有过的问题。

我只需要删除/etc/nginx/sites-available/default。然后它起作用了。

我的conf在/etc/nginx/default


2
+1该解决方案对我有用,但是后来我认为默认情况下一定有实际导致问题的原因,因此我进行了更深入的研究,并提供了更多信息的答案。
内森

11
我认为删除默认站点配置模板不是最佳解决方案-注释包含listen 80;在同一模板中的行已经解决了问题,因此可以正确解决。你的把戏行得通,但这不是我将来的读者希望做的事情。这就是为什么我建议您选择@Nathan的答案作为正确答案。
奥利弗·2013年

4
我跑了以后同样的问题apt-get dist-upgrade,该升级包nginx的,它创造了一个链接/etc/nginx/sites-enabled/etc/nginx/sites-available/default。nginx试图加载该默认配置,该配置通过IPv6侦听端口80,然后它也加载了我读取的真实配置。删除该符号链接可解决此问题。
Dan Dascalescu 2013年

15
/etc/nginx/sites-available/defaultsudo rm /etc/nginx/sites-enabled/default
不需要

尝试nginx在端口8080和varnish端口80上运行时遇到此问题,类似于此答案,nginx即使我的sites-available配置全部在端口8080上侦听,我也发现默认配置仍在端口80 上侦听的问题。这位于/etc/nginx/conf.d/default
zigojacko

24

我也遇到了同样的错误。

nginx:[emerg] bind()到[::]:80失败(98:地址已在使用中)

当我在浏览器中输入本地主机时,我正在

有用!

这是此服务器的默认网页。

Web服务器软件正在运行,但尚未添加任何内容。apache2不在同一端口上运行,而不是nginx欢迎页面,

  1. 找到apache2 ports.conf文件

    sudo /etc/apache2/ports.conf
    
  2. 然后更改其他端口80,我将其设置为70

  3. 保存文件

  4. 重新启动系统

它也将为您工作,如果您在浏览器中键入localhost,您将获得nginx欢迎页面


1
您可能根本不想同时运行Apache2和nginx。我发现Apache安装启动了该服务。因此,我发出了“ sudo /etc/init.d/apache2 stop”,然后能够正常启动nginx。这也使您不必重新引导系统。
克里斯·威斯汀

1
没错,删除/ etc / nginx / sites-enabled / default符号链接不会阻止它侦听两个端口。我发现实际上每个Nginx教程都从建议每个人都删除“默认”链接开始就有点烦人了,但是我想这是一个不同的话题。
eschipul 2015年

@IgorGanapolsky将Apache切换到其他端口?
Menasheh '17

10

尝试执行此命令

sudo fuser -k 443/tcp
service nginx restart

8

我的问题是我有重叠的监听指令。我已经设法通过运行找出重叠的指令

grep -r listen /etc/nginx/*

两个文件在同一端口上监听:

/etc/nginx/conf.d/default.conf:           listen 80;  
/etc/nginx/sites-enabled/default.conf:    listen 80;

3
这是检查事情的一种非常简洁的方法:grep -r listen /etc/nginx/*谢谢分享!
Newskooler19年

6

我在letencrypt(certbot)和nginx中遇到了同样的问题,

参考:https : //github.com/certbot/certbot/issues/5486

此错误尚无解决方法

因此,更改了cron以进行续订(在续订后重新加载)(使用certbot的建议)

-- in /etc/cron.d/certbot
from
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew 
to
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --pre-hook "service nginx stop" --post-hook "service nginx start"

日志(简短):

-- in /var/log/syslog
Jun 10 00:14:25 localhost systemd[1]: Starting Certbot...
Jun 10 00:14:38 localhost certbot[22222]: nginx: [error] open() "/run/nginx.pid$
Jun 10 00:14:41 localhost certbot[22222]: Hook command "nginx" returned error c$
Jun 10 00:14:41 localhost certbot[22222]: Error output from nginx:
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:443 $
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] bind() to 0.0.0.0:80 f$
Jun 10 00:14:41 localhost certbot[22222]: nginx: [emerg] still could not bind()
Jun 10 00:14:41 localhost systemd[1]: Started Certbot.


-- in /var/log/nginx/error.log
2018/06/10 00:14:27 [notice] 22233#22233: signal process started
2018/06/10 00:14:31 [notice] 22237#22237: signal process started
2018/06/10 00:14:33 [notice] 22240#22240: signal process started
2018/06/10 00:14:34 [notice] 22245#22245: signal process started
2018/06/10 00:14:38 [notice] 22255#22255: signal process started
2018/06/10 00:14:38 [error] 22255#22255: open() "/run/nginx.pid" failed (2: No $
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:443 failed (98: Addr$
2018/06/10 00:14:39 [emerg] 22261#22261: bind() to 0.0.0.0:80 failed (98: Addre$
2018/06/10 00:14:39 [emerg] 22261#22261: still could not bind()

1
超级随机,但这就是我所相信的问题。感谢您发布此信息。我的错误似乎是由于过时的域名输入而导致的,它试图续订,但由于我不再控制该域名而无法显示。
w–

我想这也可能是我的问题。但我需要拭目以待
Oscar Zhou1989 '18

2

首先将/etc/apache2/ports.conf中的apache监听端口80更改为8080 apache

Listen 1.2.3.4:80 to 1.2.3.4:8080
sudo service apache2 restart 

要么

sudo service httpd restart    // in case of centos

然后将nginx添加为将监听apache端口的反向代理服务器

server {
 listen   1.2.3.4:80;
 server_name  some.com;

 access_log  /var/log/nginx/something-access.log;

 location / {
  proxy_pass http://localhost:8080;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }


location ~* ^.+\.(jpg|js|jpeg|png)$ {
   root /usr/share/nginx/html/;
}

location /404.html {
  root /usr/share/nginx/html/40x.html;
}

error_page 404 /404.html;
    location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
}

# put code for static content like js/css/images/fonts
}

更改后重新启动Nginx服务器

sudo service nginx restart

现在,所有流量将由nginx服务器处理,并将所有动态请求发送到apache,而静态内容则由nginx服务器提供服务。

对于像cache这样的高级配置:

https://www.linode.com/docs/web-servers/nginx/slightly-more-advanced-configurations-for-nginx/#basic-nginx-caching


1

我遇到了类似的问题。日志如下

2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to 0.0.0.0:443 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: bind() to [::]:80 failed (98: Address already in use)
2018/10/31 12:54:20 [emerg] 128005#128005: still could not bind()
2018/10/31 12:54:23 [alert] 127997#127997: unlink() "/run/nginx.pid" failed (2: No such file or directory)
2018/10/31 22:40:48 [info] 36948#36948: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68
2018/10/31 22:50:40 [emerg] 37638#37638: duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/default:18
2018/10/31 22:51:33 [info] 37787#37787: Using 32768KiB of shared memory for push module in /etc/nginx/nginx.conf:68

最后一个[emerg]表明,duplicate listen options for [::]:80这意味着有多个Nginx块文件包含[::]:80

我的解决方案是删除 [::]:80设置

PS您可能具有默认的阻止文件。我的建议是将此文件保留为端口80的默认服务器。并[::]:80从其他阻止文件中删除


1

我使用超级用户在Docker容器上并排运行Nginx和Gunicorn。

这是用于主管的配置:

[supervisord]
nodaemon=true

[program:gunicorn]
command = /project/start.sh
user = www-data


[program:nginx]
command=/usr/sbin/nginx

问题是我如何启动Ngnix:默认情况下,它在前台运行。这使得监督重试以运行另一个Nginx实例。

通过添加-g 'daemon off;'到命令行,Nginx停留在前台,主管停止尝试运行另一个实例。



0

我的站点目录中有来自不同NGINX配置文件的多个* .save文件(来自nano的紧急转储)。删除这些.save文件后,NGINX重新启动正常。由于没有相应的符号链接,我认为这些代码是无害的,但我想我错了。


0

要继续@ lfender6445和@SAURABH的答案-

我的问题还在于,在升级到Vagrant 2.2.2之后,来宾引导时Apache2作为Web服务器运行。过去,我只有nginx作为Web服务器。

将vagrant ssh放入框中,并在访客箱启动时运行以下命令以禁止Apache2启动:

sudo update-rc.d -f apache2 remove

退出ssh,无所适从,无所适从。问题解决了。


0

如果尝试上述任何一种方法后问题仍然存在,请重新启动服务器一次。它为我工作:)


是的,会的。但是杀死nginx进程,然后仅重新启动nginx也可以。这就是@datdinhquoc的答案。
康纳兹

0

在我看来,罪魁祸首是一个包含以下内容的服务器块:

        listen  127.0.0.1:80;
        listen  [::1]:80 ipv6only=on;
        server_name  localhost;

在Linux上,侦听特定IP(例如[::1]:80)的套接字与侦听同一端口但侦听任何IP(即[::]:80)的套接字冲突。通常,nginx将通过在幕后使用单个套接字来透明地处理此问题。但是,ipv6only在listen指令上显式指定(或某些其他选项)会迫使nginx(尝试)为其创建单独的套接字,从而导致Address already in use错误。

由于ipv6only=on无论如何都是默认设置(自1.3.4起),解决方法是从该指令中删除该选项,并确保ipv6only未在我的配置中使用该选项。


0

我有同样的问题,但是我看到Nginx监听了端口80:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      9730/nginx 

但是,当我尝试重新启动它时,出现错误:

    service nginx restart
Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
nginx: [emerg] still could not bind()

我的问题是在配置文件中,我设置了PID文件,似乎系统无法正确捕获它:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

当我删除它时,它起作用了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.