oauth2-proxy journalisait AuthSuccess pendant que le navigateur recevait une erreur de passerelle : le cookie de session porte le jeton d'identite, decoupe en plusieurs Set-Cookie, et le tampon par defaut de nginx (4 Ko) ne peut pas les contenir. upstream sent too big header while reading response header from upstream server: icinga.chezlepro.internal, request: GET /oauth2/callback Pose sur TOUTES les expositions : c'est une propriete du proxy, pas de ce service-la, et le prochain service derriere un IdP rencontrerait le meme mur. Trouve grace au journal d'evenements active juste avant : LOGIN puis CODE_TO_TOKEN reussis pour icingaweb2 ont ecarte l'identite d'un coup. Laisse ouvert : trois upstream timed out vers Keycloak en 14 h, alors que Keycloak repond en millisecondes depuis l'edge. Cause non etablie — et ma sonde MTU ne valait rien, l'ICMP etant bloque par construction entre hotes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
72 lines
3.2 KiB
Django/Jinja
72 lines
3.2 KiB
Django/Jinja
# Vhosts derives des applications (champ 'expose' de instance/plan/applications.yml,
|
|
# edge depuis instance/plan/domaines.yml) — gere par Set-OPS (role serveur_nginx).
|
|
# Ne pas editer a la main.
|
|
#
|
|
# Un FQDN expose produit un vhost si l'hote de l'application est resolvable :
|
|
# amont = http://<IP interne de l'hote de l'application>:<port>. Une exposition
|
|
# non resolvable (application sans hote actif, ou sans port) est listee mais
|
|
# NON publiee (binding declare, pas encore cablable).
|
|
{% if serveur_nginx_expositions | default([]) | selectattr('websocket', 'defined') | selectattr('websocket') | list | length > 0 %}
|
|
# Une exposition au moins est WebSocket-aware (ex. Collabora) : map d'upgrade.
|
|
map $http_upgrade $connection_upgrade { default upgrade; "" close; }
|
|
{% endif %}
|
|
{% for expo in serveur_nginx_expositions | default([]) %}
|
|
{% set ns = namespace(amont='') %}
|
|
{% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %}
|
|
{% set ns.amont = 'http://' ~ hostvars[expo.hote].ansible_host ~ ':' ~ expo.port %}
|
|
{% endif %}
|
|
{% if ns.amont %}
|
|
|
|
# {{ expo.fqdn }} -> application {{ expo.application }} sur {{ expo.hote }} ({{ ns.amont }})
|
|
{% if serveur_nginx_redirection_http | bool %}
|
|
server {
|
|
listen 80;
|
|
listen [::]:80;
|
|
server_name {{ expo.fqdn }};
|
|
return 301 https://$host$request_uri;
|
|
}
|
|
{% endif %}
|
|
server {
|
|
listen 443 ssl;
|
|
listen [::]:443 ssl;
|
|
http2 on;
|
|
server_name {{ expo.fqdn }};
|
|
|
|
ssl_certificate {{ serveur_nginx_certificat }};
|
|
ssl_certificate_key {{ serveur_nginx_cle }};
|
|
|
|
location / {
|
|
proxy_pass {{ ns.amont }};
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
# Tampons d'en-tetes de reponse. Le defaut de nginx (4 Ko) ne suffit PAS
|
|
# derriere une authentification OIDC : le cookie de session porte le jeton
|
|
# d'identite, decoupe en plusieurs `Set-Cookie`, et nginx repond alors 502
|
|
# « upstream sent too big header » — juste apres une authentification
|
|
# REUSSIE, ce qui rend le symptome trompeur. Constate le 2026-08-08 sur
|
|
# icinga.chezlepro.internal, ou oauth2-proxy journalisait `AuthSuccess`
|
|
# pendant que le navigateur recevait une erreur de passerelle.
|
|
#
|
|
# Pose pour TOUTES les expositions : c'est une propriete du proxy, pas du
|
|
# service, et le prochain service place derriere un IdP rencontrerait le
|
|
# meme mur.
|
|
proxy_buffer_size {{ serveur_nginx_proxy_buffer_size }};
|
|
proxy_buffers {{ serveur_nginx_proxy_buffers }};
|
|
proxy_busy_buffers_size {{ serveur_nginx_proxy_busy_buffers_size }};
|
|
{% if expo.websocket | default(false) %}
|
|
# Collabora & co : editeur en direct via WebSocket (upgrade + longue tenue).
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection $connection_upgrade;
|
|
proxy_read_timeout 3600s;
|
|
{% endif %}
|
|
}
|
|
}
|
|
{% else %}
|
|
|
|
# (non publie) {{ expo.fqdn }} -> application {{ expo.application }} : amont non resolvable (hote sans IP active ou sans port).
|
|
{% endif %}
|
|
{% endfor %}
|