突然、私は以下の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
[::]: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;
詳しくは、以下を参照してください。
私はこれをSudo apachectl stop
を実行することで修正しました - Apacheがバックグラウンドで実行されていて、nginxが目的のポートで起動できないことがわかりました。
UbuntuでSudo /etc/init.d/Apache2 stop
を実行してください。
私は今までにない問題を見つけました。
私は/etc/nginx/sites-available/default
を削除しなければなりませんでした。それからそれは働いた。
私のconfは/etc/nginx/default
にありました。
私の場合は違います、私はそれを再起動するために実行中のNginxを強制終了しなければなりませんでした。
の代わりに
Sudo systemctl restart nginx
私は使用しなければなりませんでした:
Sudo pkill -f nginx
Sudo systemctl start nginx
私も同じエラーを受けていました。
nginx:[emerg] bind()から[::]:80に失敗しました(98:アドレスはすでに使用されています)
そして、私がブラウザにlocalhostをタイプしたとき、それから私はなっていました
できます!
これは、このサーバーのデフォルトのWebページです。
Webサーバーソフトウェアは実行されていますが、まだコンテンツが追加されていません。 nginxのウェルカムページの代わりに、Apache2は同じポートで動作しています。
apache2ports.confファイルを見つける
Sudo /etc/Apache2/ports.conf
80
以外のポートを変更し、70
としてそれを作ります
ファイルを保存する
システムを再起動してください
ブラウザにローカルホストを入力すると、nginxのウェルカムページが表示されます。
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()
このコマンドを試してみてください
Sudo fuser -k 443/tcp
service nginx restart
私の問題は私が重複するlistenディレクティブを持っていたということでした。次のコマンドを実行して、重複しているディレクティブを見つけ出しました。
grep -r listen /etc/nginx/*
2つのファイルが同じポートでlistenしていました。
/etc/nginx/conf.d/default.conf: listen 80;
/etc/nginx/sites-enabled/default.conf: listen 80;
最初に/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サーバーによって処理されます。
キャッシュのような事前設定の場合
私の場合は、Apache、Apache2、Nginxのいずれかのサービスがすでに実行されていたため、もう一方のサービスを開始できませんでした。
私は同じような問題に出会った。ログは以下のようになります
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
を削除することです。
上記の解決方法を試しても問題が解決しない場合は、一度サーバーを再起動してください。それは私のために働きました:)
私のサイトには、NGINXの異なる設定ファイルから* .saveファイル(nanoからの緊急ダンプ)がいくつかありました。これらの.saveファイルを削除したら、NGINXは問題なく再起動しました。対応するシンボリックリンクがないので、これらは無害だと思いましたが、私は間違っていたと思います。
スーパーバイザーを使用して、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はフォアグラウンドにとどまり、スーパーバイザーは別のインスタンスを実行しようとするのを止めました。
私の場合、犯人は次のものを含むサーバーブロックであることが判明しました。
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
が私の構成の他の場所で使用されないようにすることでした。
@ lfender6445と@SAURABHの回答に従うには -
私の問題は、Vagrant 2.2.2にアップグレードした後、ゲストの起動時にApache 2がWebサーバーとして実行されていたことです。過去に私はWebサーバーとしてnginxしか持っていませんでした。
vagrant sshをボックスに入れ、次のコマンドを実行して、ゲストボックスが起動するたびにApache2が起動しないようにします。
Sudo update-rc.d -f Apache2 remove
Sshを終了し、vagrantを停止し、vagrantを起動します。問題が解決しました。