Nginx öffnet den angegebenen Abhörport nicht

Nginx öffnet den angegebenen Abhörport nicht

Ich versuche, SSH-Verkehr von nginx (lauscht auf Port 7999) per Proxy an einen Bitbucket-Server (lauscht auf Port 7998) im Backend zu leiten. Sowohl nginx als auch Bitbucket laufen in Docker-Containern. Wenn ich mich beim nginx-Container anmelde und telnet bitbucket.domain-name.com 7998dies tue, wird eine Verbindung hergestellt. Auf dem Hostcomputer netstat -pnlterhalte ich in diesem Fall:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::2377                 :::*                    LISTEN      24477/dockerd       
tcp6       0      0 :::7946                 :::*                    LISTEN      24477/dockerd       
tcp6       0      0 :::80                   :::*                    LISTEN      24477/dockerd       
tcp6       0      0 :::443                  :::*                    LISTEN      24477/dockerd       
tcp6       0      0 :::7999                 :::*                    LISTEN      24477/dockerd   

Aber wenn ich das auf meinem Computer mache, bekomme ichgit clone ssh://[email protected]:7999/project_key/repo_name.git

Cloning into 'repo_name'...
ssh: connect to host domain-name.com port 7999: Connection refused
fatal: Could not read from remote repository.

Und wenn ich das tue, telnet domain-name.com 7999bekomme ich telnet: Unable to connect to remote host: Connection refused.

Das Problem scheint zu sein, dass nginx im Docker-Container nicht auf Port 7999 lauscht. Aber auf dem Host, den ich sehe, dockerdlauscht es auf Port 7999. Ich vermute, dass meine nginx-Konfiguration nicht korrekt ist, bin mir aber nicht sicher. Hier sind die relevanten Teile aus den Konfigurationsdateien.

docker-compose.yaml (nginx)

services:
    nginx:
        ports:
            - "80:8080"
            - "443:8443"
            - "7999:7997"

nginx.conf (innerhalb des Nginx-Containers)

stream {
    server {
        listen 7997;
        proxy_pass bitbucket1.cybertron.ninja:7998;
    }
}

Und hier ist eine Ausgabe, die im Nginx-Container ausgeführt wurde:

root@6d123f454eef:/# netstat -pnlt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name                                                                        
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      10/nginx: master pr                                                                     
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      10/nginx: master pr                                                                     
tcp        0      0 127.0.0.11:44703        0.0.0.0:*               LISTEN      -            

Irgendwelche Ideen, wie man dieses Problem beheben kann? Ich bin ratlos.

Antwort1

Ich habe gerade mit den wenigen Informationen, die Sie bereitgestellt haben, eine Testumgebung für Ihren Fall eingerichtet. Vorausgesetzt, das, was Sie bereitgestellt haben, ist alles, was Sie geändert haben, kann das nicht funktionieren.

Die Standard-nginx.conf im offiziellen Nginx-Container enthält die includeAnweisung innerhalb eines httpBlocks:

http {
    # ...
    include /etc/nginx/conf.d/*.conf;
}

Wenn Sie Ihre .conf-Datei einfach in das Verzeichnis conf.d legen, schlägt nginx mit der folgenden Fehlermeldung fehl:

2021/09/23 05:58:30 [emerg] 1#1: „stream“-Direktive ist hier in /etc/nginx/conf.d/blah.conf:1 nicht zulässig

Da Ihr Nginx läuft, kann ich nur davon ausgehen, dass Sie die Konfiguration nach dem Start in das Verzeichnis gelegt und Nginx nicht neu gestartet oder neu geladen haben.

DerstreamDie Direktive muss sich im Stammverzeichnis der Konfiguration befinden. Sie müssen auch eine geänderte nginx.conf bereitstellen.

Kopieren Sie die Datei nginx.conf aus Ihrem Container:

docker cp test_nginx_1:/etc/nginx/nginx.conf .

Fügen Sie Ihre Konfiguration dort hinzu, oder fügen Sie eine zweite Include-Direktive mit einem separaten Verzeichnis hinzu und mounten Sie es ebenfalls als Volume:

Fügen Sie beispielsweise außerhalb des http {}Blocks hinzu:

include /etc/nginx/conf.stream.d/*.conf;

Fügen Sie dies zu Ihrer docker-compose.yml hinzu

services:
nginx:
    image: nginx
    volumes:
        - ./config/nginx.conf:/etc/nginx/nginx.conf:ro
        - ./config/nginx:/etc/nginx/conf.d:ro
        - ./config/nginx_stream:/etc/nginx/conf.stream.d:ro

Führen Sie es aus docker-compose up -d, und es funktioniert.

verwandte Informationen