Nginx wirft ständig nginx: [emerg] bind() zu 0.0.0.0:80 fehlgeschlagen (98: Adresse wird bereits verwendet)

Nginx wirft ständig nginx: [emerg] bind() zu 0.0.0.0:80 fehlgeschlagen (98: Adresse wird bereits verwendet)

Ich habe zahlreiche Websites und viele Fragen/Antworten hier bei ServerFault zu diesem Problem überprüft. Ich scheine jedoch nicht die Ursache des Konfigurationsfehlers zu finden.

Ich habe 4 Domänen in meinem Nginx-Server:

  • example.com
  • www.example.com
  • api.example.com
  • blog.example.com

Sie sind alle aktiv und laufen sowohl auf den Ports 80 als auch 443. Dies ist die Vorlage, die nginx.confich für alle verwendet habe, wobei ich nur die Anweisungen server_name, root, error_logund geändert habe access_log. Es gibt noch einige andere Änderungen, die aber im Prinzip keine Auswirkungen haben sollten. Wie verschiedene fastcgi_param.

Dies ist die Vorlage für example.comund www.example.com:

server {
listen 80;

server_name example.com www.example.com;
root /var/www/example.com/public_html/web;

if ($http_host = example.com) {
    return 301 https://www.example.com$request_uri;
}

location / {
    # try to serve file directly, fallback to front controller
    try_files $uri /index.php$is_args$args;
}

location ~ ^/index\.php(/|$) {
    fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;

    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS off;
    fastcgi_param   DATABASE_NAME           some_database;
    fastcgi_param   DATABASE_USER           some_user;
    fastcgi_param   DATABASE_PASSWORD       some_pwd;
}

#return 404 for all php files as we do have a front controller
location ~ \.php$ {
    return 404;
}

error_log /var/log/nginx/www.example.com_error.log;
access_log /var/log/nginx/www.example.com_access.log;

# Redirect non-https traffic to https
if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot


listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

Und das ist genau die Fehlermeldung, die ich bekomme, wenn ich den Server neu starte:

root@vps_server:/etc/nginx# journalctl -xe
Mar 09 09:17:16 vps_server systemd[1]: Starting A high performance web server and a reverse proxy server...
-- Subject: Unit nginx.service has begun start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit nginx.service has begun starting up.
Mar 09 09:17:16 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 09 09:17:16 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Mar 09 09:17:16 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 09 09:17:16 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Mar 09 09:17:17 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 09 09:17:17 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Mar 09 09:17:17 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 09 09:17:17 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Mar 09 09:17:18 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Mar 09 09:17:18 vps_server nginx[30764]: nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)
Mar 09 09:17:18 vps_server nginx[30764]: nginx: [emerg] still could not bind()
Mar 09 09:17:18 vps_server systemd[1]: nginx.service: Control process exited, code=exited status=1
Mar 09 09:17:18 vps_server systemd[1]: Failed to start A high performance web server and a reverse proxy server.
-- Subject: Unit nginx.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit nginx.service has failed.
-- 
-- The result is failed.
Mar 09 09:17:18 vps_server systemd[1]: nginx.service: Unit entered failed state.
Mar 09 09:17:18 vps_server systemd[1]: nginx.service: Failed with result 'exit-code'.

Wenn ich versuche, die Zertifikate zu erneuern, sudo certbot renew --dry-runerhalte ich einen ähnlichen Fehler, wenn auch nicht genau denselben.

Wenn ich die Nginx-Threads beende, kann ich den Server neu starten. Aber beim nächsten Neustartversuch wird derselbe Fehler ausgegeben. Und das Schlimmste ist, dass ich meine SSL-Zertifikate nicht erneuern kann (obwohl das auch einen anderen Grund haben könnte und ich hier nicht darauf eingehen möchte, da dies der Grund sein könnte).

BEARBEITEN

Ich habe mit Vagrant eine lokale Maschine mit genau derselben Konfiguration eingerichtet, außer dass ich die Daten der SSL-Zertifikate kommentiert habe. Ich kann den Server ohne Probleme neu starten. Vielleicht hat es also doch etwas mit der Certbot/SSL-Konfiguration zu tun.

Um beim Debuggen dieses Problems zu helfen, ist hier die Ausgabe von netstat -tulpn(nur nginx verwendet die Ports 80 und 443, was meines Wissens die erwartete Ausgabe ist):

/var/log/nginx# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      16700/mysqld        
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      1578/systemd-resolv 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      30608/nginx: master 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1675/sshd           
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      10001/master        
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      30608/nginx: master 
tcp6       0      0 :::5355                 :::*                    LISTEN      1578/systemd-resolv 
tcp6       0      0 :::22                   :::*                    LISTEN      1675/sshd           
tcp6       0      0 :::25                   :::*                    LISTEN      10001/master        
udp        0      0 127.0.0.53:53           0.0.0.0:*                           1578/systemd-resolv 
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1343/dhclient       
udp        0      0 0.0.0.0:5355            0.0.0.0:*                           1578/systemd-resolv 
udp6       0      0 :::5355                 :::*                                1578/systemd-resolv

Antwort1

Wie sieht es bei Ihnen nginx.confaus? Ich gehe davon aus, dass Sie die Konfiguration nicht geändert haben, sondern vielleicht nur das Gzip und einen neuen Include-Ordner hinzugefügt haben, um einen separaten Speicherort für die Websites zu haben. Für jede Ihrer Domänen/Subdomänen gibt es eine separate Konfigurationsdatei. Wie:

  • example.comundwww.example.com
  • api.example.com
  • blog.example.com

Dies liegt daran, dass ich davon ausgehe, dass es sich um separate Websites unter derselben Domain handelt. Wenn sie sich auf derselben Website befinden und nur eine sogenannte Unterseite sind, sollten Sie besser nur Unterseiten mit den Standortoptionen erstellen.

Um Ihre Konfiguration neu zu organisieren, würde ich eine Datei mit 3 separaten Serverabschnitten nginxerstellen . Zunächst werden die Nicht-WWW-Benutzer auf die WWW-Website umgeleitet:com.example.conf

server {
    listen       80;
    server_name  example.com;
    return       301 https://www.example.com$request_uri;
}

server {
    listen       443 ssl;
    server_name  example.com;
    return       301 https://www.example.com$request_uri;
}

Der dritte Abschnitt würde die Hauptseite enthalten:

server {
    listen 443 ssl;

    server_name example.com www.example.com;

    root /var/www/example.com/public_html/web;

    index    index.php;

    error_log /var/log/nginx/www.example.com_error.log;
    access_log /var/log/nginx/www.example.com_access.log;

    location / {
        # try to serve file directly, fallback to front controller
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
        fastcgi_param   DATABASE_NAME           some;
        fastcgi_param   DATABASE_USER           some_user;
        fastcgi_param   DATABASE_PASSWORD       some_pwd;
    }

    location ~ \.php$ {
        return 404;
    }
}

(Ich muss sagen, Ihr Fastcgi-Teil an Ihrem Index.php-Speicherort sieht für mich seltsam aus, aber das überlasse ich Ihnen)

Erstellen Sie dann separate Konfigurationsdateien als com.example.api.confund com.example.blog.conf. Fügen Sie die ersten beiden Abschnitte der vorherigen Konfiguration auf die gleiche Weise wie zuvor hinzu. Anschließend können Sie einfach jeder Subdomäne eine andere Konfiguration für die Standorte hinzufügen.

Beispielsweise habe ich dies für meine Laravel-Websites:

rewrite ^/index\.php?(.*)$ /$1 permanent;

location / {
        try_files $uri @rewrite;
}

location        @rewrite {
        rewrite ^(.*)$ /index.php/$1 last;
}
location ~ ^/index.php(/|$) {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS on;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 299;
}

Ich hoffe, das hilft Ihnen. Wenn nicht, kommentieren Sie Ihre Fragen.

Antwort2

Das Korrigieren von bind() auf 0.0.0.0:80 oder 443 ist fehlgeschlagen (98: Adresse wird bereits verwendet)

Führen Sie die folgenden Befehle aus:

sudo pkill -f nginx & wait $!

sudo systemctl start nginx

Antwort3

Ich habe das Problem endlich gelöst. Es schien, dass IPV6 auf dem Server aktiviert ist und die Nginx-Konfiguration etwas anders sein musste.

Verwenden Sie stattdessen Folgendes:

listen 80;
listen 443 ssl;

Ich musste folgendes verwenden:

listen [::]:80;
listen [::]:443 ssl;

Auf dieser Website habe ich eine genauere und detailliertere Erklärung erhalten:https://chrisjean.com/fix-nginx-emerg-bind-to-80-failed-98-address-already-in-use/

Das Merkwürdige ist, dass mein Fehler war:

nginx: [emerg] bind() to 0.0.0.0:443 failed (98: Address already in use)

anstelle des Beschriebenen (in der von mir angegebenen URL):

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

Dadurch wurde das Problem jedoch behoben und ich konnte den Nginx-Server problemlos neu starten.

Auf dem von mir eingerichteten Vagrant-Server war IPV6 nicht aktiviert. Das könnte damit zu tun haben, dass er sich anders verhielt.

verwandte Informationen