web-dev-qa-db-ja.com

nginx - nginx:[::]:80への[emerg] bind()が失敗しました(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
197
Tampa

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

このエラーは、ポート80とポート[::]:80でlistenしているnginx構成がある場合に発生する可能性があります。

デフォルトのsites-availableファイルに次のものがありました。

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

191
Nathan

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

UbuntuでSudo /etc/init.d/Apache2 stopを実行してください。

191
lfender6445

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

私は/etc/nginx/sites-available/defaultを削除しなければなりませんでした。それからそれは働いた。

私のconfは/etc/nginx/defaultにありました。

32
Tampa

私の場合は違います、私はそれを再起動するために実行中のNginxを強制終了しなければなりませんでした。

の代わりに

Sudo systemctl restart nginx

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

Sudo pkill -f nginx
Sudo systemctl start nginx
28
datdinhquoc

私も同じエラーを受けていました。

nginx:[emerg] bind()から[::]:80に失敗しました(98:アドレスはすでに使用されています)

そして、私がブラウザにlocalhostをタイプしたとき、それから私はなっていました

できます!

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

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

  1. apache2ports.confファイルを見つける

    Sudo /etc/Apache2/ports.conf
    
  2. 80以外のポートを変更し、70としてそれを作ります

  3. ファイルを保存する

  4. システムを再起動してください

ブラウザにローカルホストを入力すると、nginxのウェルカムページが表示されます。

21
SAURABH

Letsencrypt(certbot)とnginxでも同じ問題がありました。

ref: https://github.com/certbot/certbot/issues/5486

このエラーにはまだ解決策がありません

そう、更新のクーロンを変更しました (更新後にリロードをする) (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()
4
Wagner Pereira

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

Sudo fuser -k 443/tcp
service nginx restart
4
jack

私の問題は私が重複するlistenディレクティブを持っていたということでした。次のコマンドを実行して、重複しているディレクティブを見つけ出しました。

grep -r listen /etc/nginx/*

2つのファイルが同じポートでlistenしていました。

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

最初に/etc/Apache2/ports.confでApacheのリスンポート80を8080に変更します。

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
Kamal Kumar

私の場合は、Apache、Apache2、Nginxのいずれかのサービスがすでに実行されていたため、もう一方のサービスを開始できませんでした。

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を示しています。これは、[::]:80を含むnginxブロックファイルが複数あることを意味します。

私の解決策は[::]:80設定の一つを削除することです

P.Sおそらくデフォルトのブロックファイルがあります。私のアドバイスは、このファイルをポート80のデフォルトサーバーとして保存し、他のブロックファイルから[::]:80を削除することです。

1
Oscar Zhou1989

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

0
Deejay

私のサイトには、NGINXの異なる設定ファイルから* .saveファイル(nanoからの緊急ダンプ)がいくつかありました。これらの.saveファイルを削除したら、NGINXは問題なく再起動しました。対応するシンボリックリンクがないので、これらは無害だと思いましたが、私は間違っていたと思います。

0
Allen

スーパーバイザーを使用して、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

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

        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が私の構成の他の場所で使用されないようにすることでした。

0
Matthijs

@ lfender6445と@SAURABHの回答に従うには -

私の問題は、Vagrant 2.2.2にアップグレードした後、ゲストの起動時にApache 2がWebサーバーとして実行されていたことです。過去に私はWebサーバーとしてnginxしか持っていませんでした。

vagrant sshをボックスに入れ、次のコマンドを実行して、ゲストボックスが起動するたびにApache2が起動しないようにします。

Sudo update-rc.d -f Apache2 remove

Sshを終了し、vagrantを停止し、vagrantを起動します。問題が解決しました。

0
Lance Cleveland