
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 7998
dies tue, wird eine Verbindung hergestellt. Auf dem Hostcomputer netstat -pnlt
erhalte 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 7999
bekomme 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, dockerd
lauscht 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 include
Anweisung innerhalb eines http
Blocks:
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.
Derstream
Die 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.