
Tengo una instancia de GitLab ejecutándose en la ventana acoplable. GitLab funciona bien pero no puedo accederPáginas de GitLab.
La puesta en marcha
Descripción general
+------------+
Request+-->+ Cloudflare |
+-----+------+
|
v +---------+
Nginx+--->+Docker |
| +------+
| |GitLab|
+---------+
El problema es que Nginx no puede pasar la solicitud al servidor de GitLab Pages (tenga en cuenta que GitLab funciona solo).
Entrada del registro de errores de Nginx
[error] 14932#14932: *30505 connect() failed (111: Connection refused) while connecting to upstream, [...]
Estibador
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
Entrada de servidor para páginas
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
También probé con la configuración mínima absoluta, definiendo solo pages_external_url
y gitlab_pages['enable']
.
Rastreando el problema
- La solicitud a páginas.example.com falló con 502 (Puerta de enlace incorrecta) de CF
- Comprobé el registro de Nginx y encontré la entrada de registro mencionada anteriormente.
- Realizó múltiples solicitudes desde el host al contenedor.
# 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
- Hizo una solicitud desde el contenedor.
# curl localhost:8090 -> 404 error page
De esto supongo que algo está bloqueando el tráfico entrante para 8090(Páginas de GitLab), pero solicita 80(GitLab)se completan con éxito. Pasé un par de días buscando en Google este problema pero no pude encontrar nada.
1 truncado; Se eliminaron las configuraciones de SMTP, LDAP y omniauth
Respuesta1
Acabo de encontrar la causa de mi problema después de muchas horas de buscar algo incorrecto (pero hablaremos de eso más adelante).
TL;DR
Tuve que cambiar el gitlab_pages['listen_proxy']
valor para escuchar en cada interfaz, por lo que se ve así:
gitlab_pages['listen_proxy'] = "0.0.0.0:8090"
Detallado
Estaba buscando este problema con palabras clave relacionadas con las páginas de GitLab y justo ahora pensé que tal vez debería pensar de manera innovadora, ¿qué pasa si es un problema más general y ni siquiera está relacionado con las páginas de GitLab? Después de la primera búsqueda en Google encontré unBuen articulosobre esto.
Recibí el mensaje "conexión rechazada" porque no había nada escuchando en el puerto 8090, porque localhost
se refiere a la dirección de loopback, es decir 127.0.0.1
, pero los puertos expuestos se reenvían para la IP del contenedor, en mi caso a una IP dinámica que mientras escribía la pregunta era 172.17.0.7
. Entonces, la solución es escuchar en todas las interfaces que sean posibles utilizando 0.0.0.0
como direcciones IP.
Dos figuras que visualizan el problema y la solución.
(Cifras del artículo mencionado, pero ligeramente modificadas para que coincidan mejor con la pregunta y solo texto para mejorar la legibilidad cuando se usa el modo oscuro forzado)
Cuando usas 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 |
+-------------------------------------+
Escuchando en cada interfaz, usando 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 |
+-------------------------------------+
Respuesta2
Mi última configuración para 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'
Esta es la configuración para 1 contenedor acoplable, que permanece detrás de un proxy inverso (nginx/traefik/lo que sea). Si termina https(TLS) en el balanceador de carga y envía el tráfico a los puertos HTTP: 80 - gitlab, 8090 - páginas.