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


突然间我得到了以下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

163
2018-02-20 05:19


起源


我发现了以前从未有过的问题。我不得不删除/ etc / nginx / sites-available / default。然后它奏效了。我的conf在/ etc / nginx / default中 - Tampa
谢谢,这很有效。发布它作为答案并接受它。 - pt2ph8
对于那些封闭的问题....嗯...我觉得发现这篇文章有用的人可能不同意...... - Tampa
我正在运行Nginx + Varnish并出现此错误。解决方案是两个顶部停止,然后首先启动nginx然后启动清漆。 - Ben
我没有看到关闭流行的很好回答的话题,很明显是许多人使用的实用程序可能对SO有益。没有理由说明为什么它是非正式的既不需要重新调整也需要重新调整。没关系 ... - gorn


答案:


[::]:80 是一个ipv6地址。

如果您的nginx配置正在侦听端口80以及端口上,则可能导致此错误 [::]: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


166
2018-02-26 23:52



您也可以通过删除listen 80来修复它;因为listen [::]:80可以同时监听IPv4和IPv6。请注意,因为某些系统(如FreeBSD)将IPv4和IPv6套接字分开然后它将无法正常工作,但对于Linux来说应该没问题。 wiki.nginx.org/HttpCoreModule#listen - rednaw
感谢您深入研究并提供删除原因的解释 /etc/nginx/sites-available/default 有助于解决上述错误。 - Oliver
即使我注释掉ipv6行,我尝试时仍会遇到同样的错误 sudo service nginx restart。当我做 netstat -tulpn |grep 80,我只得到一次nginx进程(0.0.0.0:80)。任何想法为什么它不会重新启动? - Roman
我是第二个@rednaw所说的,但你可以简单地将它评论出来,而不是取消听 - d4nyll
设置 ipv6only=on 修复了这个问题,但是nginx应该确实检测到它正在尝试绑定到同一个接口:端口两次。 - Dan Dascalescu


我通过跑步来解决这个问题 sudo apachectl stop  - 结果是apache在后台运行并阻止nginx在所需的端口上启动。

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


148
2018-05-28 17:27



使用 sudo /etc/init.d/apache2 stop 在Ubuntu 14.04上停止apache - Footniko
原因是因为您不能让两个Web服务器监听同一个端口。选择一个,如果需要,选择代理。例如。使用nginx,但对于某些请求(例如for php 文件),代理到Apache端口。 - d4nyll
同样在这里!即使我以为我没有安装apache。奇... - Giel Berkers
这在CentOS7上对我有用。非常感谢!原来只是Apache正在侦听80端口。能够在执行此操作后立即重启Nginx。 - Sweely
你救了我的命.... - Namal


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

我只是要删除 /etc/nginx/sites-available/default。然后它奏效了。

我的conf是在 /etc/nginx/default


26
2018-02-24 12:47



+1这个解决方案对我有用,但后来我认为默认情况下肯定会出现问题,所以我挖得更深一些,并提供了更多信息的答案。 - Nathan
我认为删除默认站点配置模板不是最好的解决方案 - 注释包含的行 listen 80; 在同一个模板中已经解决了问题并正确解决了问题。你的诀窍有效,但这不是我未来读者的问题。这就是为什么我建议你选择@ Nathan的答案作为正确的答案。 - Oliver
跑完后我遇到了同样的问题 apt-get dist-upgrade,它升级了nginx包,它创建了一个链接 /etc/nginx/sites-enabled 至 /etc/nginx/sites-available/default。 nginx试图加载这个默认配置,它通过IPv6监听端口80,然后它也加载了我读取的真实配置。删除该符号链接修复了该问题。 - Dan Dascalescu
你不需要删除  /etc/nginx/sites-available/default,只需删除它的符号链接 - sudo rm /etc/nginx/sites-enabled/default - d4nyll
我试图运行时遇到了这个问题 nginx 在8080和80号港口 varnish 在端口80和类似于这个答案,我发现了问题 nginx 默认配置仍然在端口80上监听,即使我的 sites-available 所有人都在端口8080上听过。这个位于 /etc/nginx/conf.d/default - zigojacko


我也得到了同样的错误。         nginx:[emerg] bind()到[::]:80失败(98:地址已经在使用中) 当我在浏览器中输入localhost时,我就得到了

有用!

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

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

  1. 找到apache2 ports.conf文件

    sudo /etc/apache2/ports.conf

  2. 更改80以外的端口,我将其设为70

  3. 保存文件

  4. 重启你的系统

它也适用于您,如果您在浏览器中键入localhost,您将获得nginx欢迎页面


15
2018-05-29 05:37



您可能根本不想同时运行Apache2和nginx。我发现Apache安装启动了该服务。所以,我发布了“sudo /etc/init.d/apache2 stop”,然后能够正常启动nginx。这也可以避免重启系统。 - Chris Westin
Stoppig apache如果不使用也可以工作。 - Miloš
你是正确的,删除​​/ etc / nginx / sites-enabled / default sym链接确实阻止它在两个端口上侦听。我觉得nginx上的每个教程都建议每个人删除“默认”链接,但我认为这是一个不同的主题,实际上有点烦人。 - eschipul
如果我的Apache正在使用该怎么办 本地主机:80 已经? - Igor Ganapolsky
@IgorGanapolsky将Apache切换到另一个端口? - Menasheh


尝试执行此命令

sudo fuser -k 443/tcp
service nginx restart

1
2018-03-29 04:49



没有为我工作 - Kamal Kumar


我有几个* .save文件(来自nano的紧急转储)来自我的网站中不同的NGINX配置文件 - 可用的目录。一旦我删除了这些.save文件,NGINX就重启了。我认为这些是无害的,因为没有相应的符号链接,但我想我错了。


0
2018-01-14 21:21





首先改变apache监听端口80到8080 /etc/apache2/ports.conf中的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,静态conten由nginx服务器提供。

对于缓存等高级配置:

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


0
2018-06-01 12:15





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

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

此错误还没有解决方案

所以,更换了一个更新的cron(更新后重新加载)

-- 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 && nginx -s reload

日志(短):

-- 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()

0
2018-06-11 15:12