
Ich habe eine GitLab-Instanz im Docker laufen. GitLab funktioniert einwandfrei, aber ich kann nicht darauf zugreifenGitLab-Seiten.
Die Einrichtung
Überblick
+------------+
Request+-->+ Cloudflare |
+-----+------+
|
v +---------+
Nginx+--->+Docker |
| +------+
| |GitLab|
+---------+
Das Problem besteht darin, dass Nginx die Anforderung nicht an den GitLab Pages-Server weiterleiten kann (beachten Sie, dass GitLab selbst funktioniert).
Nginx-Fehlerprotokolleintrag
[error] 14932#14932: *30505 connect() failed (111: Connection refused) while connecting to upstream, [...]
Docker
image: gitlab/gitlab-ce
version: 13.7.1 (latest)
ip: 172.17.0.7 (dynamic)
published ports:
172.17.0.1:8080 -> 80
172.17.0.1:8090 -> 8090
Nginx
Servereintrag für Seiten
server {
listen 80 default_server;
listen 443 default_server;
server_name _;
location / {
proxy_pass http://172.17.0.1:8090;
}
}
GitLab
grep -v '^#|^$' gitlab.rb1
nginx['listen_port'] = 80
nginx['listen_https'] = false
pages_external_url "http://pages.example.com/"
gitlab_pages['enable'] = true
gitlab_pages['external_http'] = []
gitlab_pages['listen_proxy'] = "localhost:8090"
gitlab_pages['inplace_chroot'] = true
gitlab_pages['metrics_address'] = ":9235"
pages_nginx['enable'] = true
pages_nginx['listen_https'] = false
pages_nginx['redirect_http_to_https'] = false
Auch mit der absoluten Minimalkonfiguration versucht, nur definieren pages_external_url
und gitlab_pages['enable']
.
Dem Problem auf der Spur
- Die Anfrage an pages.example.com ist mit 502 (Bad Gateway) von CF fehlgeschlagen
- Nginx-Protokoll geprüft, oben erwähnten Protokolleintrag gefunden
- Mehrere Anfragen vom Host an den Container gestellt
# curl 172.17.0.1:8090 -> curl: (7) Failed to connect to 172.17.0.1 port 8090: Connection refused
# curl 172.17.0.7:8090 -> curl: (7) Failed to connect to 172.17.0.7 port 8090: Connection refused
- Habe eine Anfrage aus dem Container gestellt
# curl localhost:8090 -> 404 error page
Daraus schließe ich, dass etwas den eingehenden Verkehr für 8090 blockiert(GitLab-Seiten), aber Anfragen an 80(GitLab)wurden erfolgreich abgeschlossen. Ich habe ein paar Tage damit verbracht, dieses Problem zu googeln, konnte aber nichts finden.
1 Abgeschnitten; SMTP-, LDAP- und Omniauth-Einstellungen entfernt
Antwort1
Habe gerade die Ursache meines Problems gefunden, nachdem ich stundenlang nach dem Falschen gesucht habe (aber dazu später mehr).
Kurz zusammengefasst
Ich musste den gitlab_pages['listen_proxy']
Wert ändern, um auf jeder Schnittstelle zu lauschen, daher sieht es folgendermaßen aus:
gitlab_pages['listen_proxy'] = "0.0.0.0:8090"
Detaillierte
Ich habe dieses Problem mit Schlüsselwörtern im Zusammenhang mit GitLab-Seiten gesucht und gerade jetzt dachte ich, vielleicht muss ich über den Tellerrand hinausschauen, was ist, wenn es ein allgemeineres Problem ist und nicht einmal mit GitLab-Seiten zusammenhängt. Nach der ersten Google-Suche fand ich eineschöner Artikeldarüber.
Ich habe die Meldung „Verbindung abgelehnt“ erhalten, weil auf Port 8090 nichts lauschte, da localhost
sich dies auf die Loopback-Adresse bezieht, d. h. 127.0.0.1
, aber freigegebene Ports werden für die IP des Containers weitergeleitet, in meinem Fall an eine dynamische IP, die beim Schreiben der Frage war 172.17.0.7
. Die Lösung besteht also darin, auf jeder Schnittstelle zu lauschen, die mit der IP-Adresse möglich ist 0.0.0.0
.
Zwei Abbildungen, die das Problem und die Lösung visualisieren
(Zahlen aus dem erwähnten Artikel, jedoch leicht verändert, um besser zur Frage zu passen, und als reiner Text, um die Lesbarkeit bei Verwendung des Forced-Darkmode zu verbessern)
Beim Benutzen localhost:8090
:
Request +--------------------------------------+
+ | Default network namespace |
| | |
| | +-------+ |
v | +----->+ Nginx +------+ |
+-----+------+ | | +-------+ | |
| Cloudflare | | | | |
+-----+------+ | | v |
| +--------+-----------+-+-------+-------+
| | Physical interface | | Docker bridge |
+-------->+ 10.0.0.1 | | 172.17.0.1 |
+--------------------+ +-------+-------+
|
|
v
+-------+-------+
| Docker bridge |
| 172.17.0.7 |
+-------+-----------+-+---------------+
| | Loopback | |
| | 127.0.0.1 | |
| +-----+-----+ |
| | |
| | +--------------+ |
| +----->+ Pages server | |
| +--------------+ |
|GitLab's Network namespace |
+-------------------------------------+
Abhören auf jeder Schnittstelle mit 0.0.0.0:8090
:
Request +--------------------------------------+
+ | Default network namespace |
| | |
| | +-------+ |
v | +----->+ Nginx +------+ |
+-----+------+ | | +-------+ | |
| Cloudflare | | | | |
+-----+------+ | | v |
| +--------+-----------+-+-------+-------+
| | Physical interface | | Docker bridge |
+-------->+ 10.0.0.1 | | 172.17.0.1 |
+--------------------+ +-------+-------+
|
|
v
+-------+-------+
| Docker bridge |
| 172.17.0.7 |
+-------+-----------+-+-------+-------+
| | Loopback | | |
| | 127.0.0.1 | | |
| +-----+-----+ | |
| | v |
| | +--------+-----+ |
| +----->+ Pages server | |
| +--------------+ |
|GitLab's Network namespace |
+-------------------------------------+
Antwort2
Meine neueste Konfiguration für Gitlab 16.xx
GITLAB_OMNIBUS_CONFIG: |
### Web interace settings
external_url "https://gitlab.domain.org"
nginx['listen_port'] = 80
nginx['listen_https'] = false
### Pages
gitlab_pages['enable'] = true
pages_external_url "https://pages.domain.org"
pages_nginx['ssl'] = false
pages_nginx['listen_https'] = false
gitlab_pages['listen_proxy'] = '0.0.0.0:8090'
gitlab_pages['internal_gitlab_server'] = 'http://localhost:8080'
Dies ist die Konfiguration für 1 Docker-Container, der hinter einem Reverse-Proxy (nginx/traefik/was auch immer) bleibt. Wenn Sie https (TLS) auf dem Load Balancer beenden, wird der Datenverkehr an die HTTP-Ports weitergeleitet: 80 – Gitlab, 8090 – Seiten.