突然我得到下面的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   - 

我被难住了。我如何调试这个?

我在端口8070上使用带有代理通道的uwsgi。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

当前回答

[::]: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

其他回答

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

我只需要删除/etc/nginx/sites-available/default。然后就成功了。

此删除将只删除符号链接,作为备份,您可以在默认文件中找到 /etc/nginx/sites-enabled /违约

我的conf在/etc/nginx/default

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

这是用于supervisor的配置:

[supervisord]
nodaemon=true

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

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

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

你可以通过在命令行中添加-g 'daemon off;'或daemon off;在配置文件的顶部,Nginx停留在前台,supervisor停止尝试运行另一个实例。

我用nginx运行Varnish服务器。我的varnish服务器运行在端口80上,因此,我的nginx服务器没有启动。我在所有nginx配置文件中将端口更改为8088,但我的default.conf文件在/etc/nginx/conf中。d目录下的Ubuntu服务器。

由于我的conf.d目录包含在主/etc/nginx.conf文件中,nginx没有启动。

将“/etc/nginx/conf.d/default.conf”重命名为“/etc/nginx/conf.d/default.conf”。/etc/nginx/conf.d/*.conf;从我的nginx.conf文件。

多个服务可以在同一个端口上侦听。 这个问题通常来自于在同一台机器上混合使用Apache和NGINX。

检查:

Sudo netstat -plant | grep 80

停止Apache并重启NGINX:

Sudo systemctl stop apache2 && Sudo systemctl restart nginx && Sudo systemctl status nginx

在我的例子中,罪魁祸首是一个服务器块,它包含:

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

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

由于ipv6only=on是默认的(自1.3.4以来),修复只是简单地从这个指令中删除该选项,并确保ipv6only不在我的配置中的其他任何地方使用。