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


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   - 

私は困惑しています。これをデバッグするにはどうすればよいですか?

私はポート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

19
今までにない問題を見つけました。/ etc / nginx / sites-available / defaultを削除する必要がありました。その後、うまくいきました。私の設定は/ etc / nginx / defaultにありました
タンパ

Nginx + Varnishを実行していて、このエラーが発生しました。解決策は両方ともトップストップであり、次にnginxを最初に開始し、次にニスを開始しました。
Ben

名前付きサービスを停止してみてください。
2017年

サイト対応からデフォルトを削除しましたか?
Wolfpack'08

ここですべての解決策を試しました。使用中のすべてのポート(NGINX自体で使用されていた)をチェックしたので、ポートを強制終了して再起動しました。魅力のように働いた。
gavin

回答:


202

[::]:80 ipv6アドレスです。

このエラーは、ポート80とポートでリッスンしているnginx構成がある場合に発生する可能性があります[::]: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
また、listen 80を削除するだけで修正できます。これは、listen [::]:80がIPv4とIPv6の両方をリッスンするためです。ただし、一部のシステム(FreeBSDなど)はIPv4ソケットとIPv6ソケットを分離しているため機能しませんが、Linuxの場合は問題ありません。wiki.nginx.org/HttpCoreModule#listen
gitaarik

4
これを掘り下げ、削除/etc/nginx/sites-available/defaultすると上記のエラーが解決する理由を説明していただきありがとうございます。
オリバー

1
ipv6行をコメントアウトしても、を実行しようとすると同じエラーが発生しますsudo service nginx restart。実行するとnetstat -tulpn |grep 80、nginxプロセス(0.0.0.0:80)が1回だけ取得されます。再起動しない理由はありますか?
ローマ、

@rednawが言ったことを2番目に言いますが、リッスンを削除する代わりに、コメントアウトすることができます
d4nyll

設定ipv6only=onによって問題は修正されましたが、nginxは実際に同じinterface:portに2回バインドしようとしていることを検出するはずです。
Dan Dascalescu、2015年

245

sudo apachectl stopは実行してこれを修正しました-apacheがバックグラウンドで実行されていて、nginxが目的のポートで起動しないことがわかりました

Ubuntuで実行 sudo /etc/init.d/apache2 stop


8
sudo /etc/init.d/apache2 stopUbuntu 14.04でApacheを停止するために使用
Footniko

3
その理由は、2つのWebサーバーが同じポートをリッスンできないためです。1つを選択し、必要に応じてプロキシを選択します。たとえば、nginxを使用しますが、特定のリクエスト(phpファイルなど)の場合は、Apacheポートにプロキシします。
d4nyll 2015年

新しいdebian 9インストールでも同じです。
ジラリウム

ありがとう。しかし、なぜそれが突然始まったのでしょうか?1週間サーバーに触れなかったが、昨夜から始まっていた。
Ajay Singh、

1
解決策をありがとう。それは私の作品、私はGoogleのクラウドプラットフォームを使用する
congle

92

私の場合は異なり、再起動するには実行中のNginxを強制終了する必要がありました。

の代わりに

sudo systemctl restart nginx

私は使用しなければなりませんでした:

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

1
私は404 Not Foundをとっていたので、あなたの提案を使用しましたが、今は問題を解決しました。ありがとう。
ベイ

3
これでうまくいきました。他には何もしませんでした。システムの再起動時にどのプロセスが開始するかはわかりませんが、これを再起動nginxルーチンに追加するだけです。ありがとう!
Khom Nazid

38

今までにない問題を見つけました。

削除しなければならなかった /etc/nginx/sites-available/default。その後、うまくいきました。

私の会議はにありました/etc/nginx/default


2
+1この解決策は私にとってはうまくいきましたが、デフォルトで実際に問題を引き起こしている何かがあるはずだと思ったので、少し深く掘り下げて、より多くの情報を含む回答を提供しました。
ネイサン

11
デフォルトのサイト構成テンプレートを削除することは最善の解決策ではないと私は主張します。listen 80;同じテンプレートに含まれている行にコメントを付けると、問題が解決され、正しく解決されます。あなたのトリックはうまくいきますが、あなたの質問の将来の読者が私がやろうとすることではありません。そのため、@ Nathanの回答を正解として選択することをお勧めします。
オリバー

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/default削除する必要はありません。単にそれへのシンボリックリンクを削除しますsudo rm /etc/nginx/sites-enabled/default
d4nyll

nginxポート8080とvarnishポート80で実行しようとしたときにこの問題が発生し、この回答と同様にnginxsites-availableすべての構成がポート8080でリッスンしていても、デフォルトの構成がポート80でリッスンする問題が見つかりました。これは/etc/nginx/conf.d/default
zigojackoにありました

24

同じエラーが発生しました。

nginx:[emerg] bind()to [::]:80 failed(98:アドレスはすでに使用中)

ブラウザでlocalhostと入力すると、

できます!

これは、このサーバーのデフォルトのWebページです。

Webサーバーソフトウェアは実行中ですが、コンテンツはまだ追加されていません。nginxウェルカムページの代わりに、apache2は同じポートで実行されています。

  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を正常に起動させることができました。これにより、システムを再起動する必要もなくなります。
Chris Westin

1
/ etc / nginx / sites-enabled / default symリンクを削除すると、2つのポートでリッスンできなくなることは間違いありません。私は実際にnginxのすべてのチュートリアルが「デフォルト」リンクを削除することを全員に提案することから始まるのは少し面倒ですが、それは私が推測する別のトピックです。
eschipul 2015年

@IgorGanapolsky Apacheを別のポートに切り替えますか?
Menasheh

10

このコマンドを実行してみてください

sudo fuser -k 443/tcp
service nginx restart

8

私の問題は、listenディレクティブが重複していることでした。実行することで、重複するディレクティブを理解することができました

grep -r listen /etc/nginx/*

2つのファイルが同じポートでリッスンしていました:

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

3
これは非常にきちんとした方法で確認できます。grep -r listen /etc/nginx/*共有してくれてありがとう!
Newskooler

6

私はletsencrypt(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-- 2018年

これもおそらく私の問題だと思います。でも、見るのを待つ必要があります
Oscar Zhou1989年

2

最初に/etc/apache2/ports.confのapache listen port 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

次に、apacheポートをリッスンするリバースプロキシサーバーとしてnginxを追加します

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サーバーによって処理されます。

キャッシュのような事前構成の場合:

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はフォアグラウンドに留まり、スーパーバイザーは別のインスタンスを実行しようとするのをやめました。


1

私の場合、Apache、Apache2、または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を終了し、vagrant halt、vagrant up。問題が解決しました。


0

上記の解決策を試しても問題が解決しない場合は、サーバーを1回再起動してください。それは私のために働いた:)


はい、そうです。しかし、nginxプロセスを終了してから、nginxだけを再起動することもできます。それが@datdinhquocの答えです。
Khom Nazid

0

私の場合、犯人は以下を含むサーバーブロックであることが判明しました。

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

Linuxでは、特定のIPでリッスンするソケット(など[::1]:80)は、同じポート以外のIPでリッスンするソケット(つまり[::]:80)と競合します。通常、nginxは、このシーンの背後で単一のソケットを使用することにより、この問題を透過的に処理します。ただし、ipv6onlylistenディレクティブで明示的に(または特定の他のオプション)を指定すると、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;

取り外したところ、うまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.