| 27 mars 2026

Exposer une plateforme IBM ELM (Engineering Lifecycle Management) derrière un reverse proxy est une étape incontournable pour tout déploiement en production. Cela permet de centraliser les accès, gérer les certificats SSL en un seul endroit et rendre l’URL publique indépendante de l’infrastructure interne.

Ce guide couvre deux implémentations : Nginx (solution open-source répandue) et IBM HTTP Server (IHS) (le serveur Apache fourni par IBM, recommandé pour ELM). Les configurations présentées ont été validées en production sur des environnements Jazz multi-serveurs.


Architecture Cible

Internet
    │
    ▼
[Reverse Proxy : 443]          ← URL publique unique
    │
    ├──→ jazz1:9443  (JTS, RM)
    ├──→ jazz2:9443  (CCM, QM)
    └──→ jazz3:9443  (GC, RS)

Le reverse proxy est le seul point exposé sur Internet. Les serveurs Jazz internes communiquent entre eux via leurs URLs internes (port 9443), et le proxy se charge de tout adapter.


Les 5 Défis Techniques à Résoudre

1. Réécriture des URLs dans les réponses Jazz

Jazz intègre ses propres URLs dans les réponses HTTP (headers Location, contenu HTML, JSON, JavaScript). Si ces URLs pointent vers jazz1:9443 et que l’utilisateur accède depuis jazz.mondomaine.net, tout se casse.

Solution Nginx — directive sub_filter :

sub_filter "https://jazz1.syncheo.tech:9443" "https://jazz1.syncheo.tech";
sub_filter ':9443/' '/';
sub_filter_once off;

⚠️ Piège Nginx : sub_filter n’interpole pas les variables $host. Il faut utiliser une map{} pour créer des variables statiques par hostname.

Solution IHS — directive ProxyHTMLURLMap :

ProxyHTMLURLMap https://jazz1\.kse\.ksegroup\.net:9443  https://jazz.syncheo.tech  Riex
ProxyHTMLURLMap https://jazz2\.kse\.ksegroup\.net:9443  https://jazz.syncheo.tech  Riex
ProxyHTMLURLMap https://jazz3\.kse\.ksegroup\.net:9443  https://jazz.syncheo.tech  Riex

ProxyHTMLURLMap est plus puissant que sub_filter : il parse réellement le HTML et comprend la structure des attributs (href, src, action…).


2. Décompression des réponses avant réécriture

Jazz compresse ses réponses en gzip. Un proxy ne peut pas réécrire du texte compressé.

Solution Nginx :

proxy_set_header Accept-Encoding "";

On demande à Jazz de ne pas compresser en supprimant le header Accept-Encoding.

Solution IHS :

RequestHeader unset Accept-Encoding
SetOutputFilter INFLATE;PROXY-HTML

IHS offre une option plus élégante : INFLATE décompresse la réponse à la volée avant que PROXY-HTML ne la réécrive, puis la recomprime pour le client.


3. Réécriture des headers de redirection

Quand Jazz émet une redirection HTTP (Location: https://jazz1:9443/jts/...), le navigateur suivrait l’URL interne. Il faut intercepter ces headers.

Nginx :

proxy_redirect https://127.0.0.1:9443/  /;
proxy_redirect ~*^https://jazz[1-3]\.kse\.ksegroup\.net:9443(/.*)$  $1;

IHS :

ProxyPassReverse / https://127.0.0.1:9443/
ProxyPassReverse / https://jazz1.syncheo.tech:9443/
ProxyPassReverse / https://jazz2.syncheo.tech:9443/
ProxyPassReverse / https://jazz3.syncheo.tech:9443/

4. CORS pour les applications Jazz

Jazz utilise des requêtes cross-origin (OSLC, widgets EWM, API REST). Le header Access-Control-Allow-Origin ne supporte pas le wildcard * quand credentials: true est requis — il faut une valeur dynamique.

Piège Nginx — les blocs if() n’héritent pas des add_header du parent. Il faut redéclarer tous les headers CORS dans le bloc OPTIONS :

if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin'      '$cors_origin' always;
    add_header 'Access-Control-Allow-Methods'     'GET, POST, OPTIONS, PUT, DELETE, PATCH' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Access-Control-Allow-Headers'     '...' always;
    add_header 'Access-Control-Max-Age'           1728000;
    return 204;
}

IHS gère cela proprement avec <If> qui hérite bien du contexte parent :

<If "%{REQUEST_METHOD} == 'OPTIONS'">
    Header always set Access-Control-Max-Age "1728000"
    Return 204
</If>

5. SSL vers le backend Jazz

Les serveurs Jazz utilisent souvent des certificats auto-signés en interne.

Nginx — désactivation implicite via proxy_pass https:// (accepte tout par défaut).

IHS — désactivation explicite requise :

SSLProxyEngine          on
SSLProxyVerify          none
SSLProxyCheckPeerCN     off
SSLProxyCheckPeerName   off
SSLProxyCheckPeerExpire off

💡 Mettre SSLProxyVerify require si les backends ont des certificats valides — meilleure pratique de sécurité.


Guide de Renommage des Serveurs

Voici les endroits précis à modifier quand vous renommez vos serveurs Jazz.

Cas 1 — Changement du nom de domaine public

Exemple : jazz.syncheo.techjazz.monentreprise.com

FichierDirectiveAncienne valeurNouvelle valeur
nginx.confserver_namejazz[1-3].kse...jazz[1-3].monentreprise.com
nginx.confmap $host $internal_urlclés jazz[1-3]...jazz[1-3]...
nginx.confmap $host $external_urlvaleurs jazz[1-3]...jazz[1-3]...
nginx.confif ($http_origin ~*regex jazz[1-3]...regex jazz[1-3]...
ihs.confServerNamejazz.kse...jazz.monentreprise.com
ihs.confProxyHTMLURLMap (×3)jazz[1-3]...jazz[1-3]...
ihs.confSetEnvIf Originregex jazz...regex jazz...
ihs.confSSLCertificateFilejazz...crtjazz...crt

⚠️ Ne pas oublier : les Public URIs Jazz sont configurées à l’installation dans l’interface d’administration JTS (https://votre-jts/jts/admin). Si vous changez le nom public, il faut aussi les mettre à jour dans Jazz — c’est une opération sensible qui nécessite un redémarrage des services.


Cas 2 — Renommage d’un serveur backend interne

Exemple : jazz1jazz-prod-jts

Dans nginx.conf, modifier les blocs map{} :

map $host $internal_url {
    jazz-prod-jts.syncheo.tech  "https://jazz-prod-jts.syncheo.tech:9443";
    # ...
}

Dans ihs.conf, modifier les ProxyHTMLURLMap et ProxyPassReverse :

ProxyPassReverse / https://jazz-prod-jts.syncheo.tech:9443/
ProxyHTMLURLMap https://jazz-prod-jts\.kse\.ksegroup\.net:9443  https://jazz.syncheo.tech  Riex

Cas 3 — Migration vers des serveurs séparés (scale-out)

Quand JTS/RM, CCM/QM et GC/RS migrent chacun sur leur propre machine :

Nginx :

location ~ ^/(jts|rm) {
    proxy_pass https://10.0.0.1:9443;
    # ... mêmes directives sub_filter, CORS, etc.
}

location ~ ^/(ccm|qm) {
    proxy_pass https://10.0.0.2:9443;
}

location ~ ^/(gc|rs) {
    proxy_pass https://10.0.0.3:9443;
}

IHS :

<Location ~ "^/(jts|rm)">
    ProxyPass        https://10.0.0.1:9443
    ProxyPassReverse https://10.0.0.1:9443/
    # ... mêmes directives ProxyHTMLURLMap, CORS, etc.
</Location>

Checklist de Validation Post-Configuration

Après toute modification, vérifiez ces points dans l’ordre :

1. Test SSL :

openssl s_client -connect jazz.syncheo.tech:443 -servername jazz.syncheo.tech

2. Test de redirection HTTP→HTTPS :

curl -I http://jazz.syncheo.tech
# Attendu : HTTP/1.1 301 Moved Permanently + Location: https://...

3. Test d’accès JTS :

curl -k https://jazz.syncheo.tech/jts/auth/authrequired
# Attendu : 200 ou 401 (pas d'erreur proxy)

4. Test CORS preflight :

curl -I -X OPTIONS https://jazz.syncheo.tech/jts/ \
  -H "Origin: https://jazz.syncheo.tech" \
  -H "Access-Control-Request-Method: POST"
# Attendu : 204 + Access-Control-Allow-Origin présent

5. Vérification des SANs du certificat :

openssl x509 -in /etc/nginx/ssl/jazz.crt -text -noout | grep -A5 "Subject Alternative"

Nginx vs IHS : Que Choisir ?

CritèreNginxIBM HTTP Server
Recommandation IBMNon officielle✅ Officielle
Réécriture HTMLsub_filter (textuel)mod_proxy_html (parsing HTML)
Gestion CORS if()⚠️ Headers non hérités✅ Héritage correct
Gzip transparentDésactivation upstreamDécompression à la volée
Performance✅ ExcellenteBonne
CommunautéLargeIBM Support

Pour un environnement IBM ELM en production, IHS est recommandé — la gestion native de mod_proxy_html évite les pièges de sub_filter, et le support IBM couvre l’ensemble de la stack.


Conclusion

La configuration d’un reverse proxy devant IBM Jazz est complexe principalement à cause de trois points : la réécriture des URLs internes dans les réponses, la gestion du CORS avec credentials, et le déchiffrement SSL vers les backends. Les configurations présentées ici ont été éprouvées en production et couvrent ces trois aspects.

En cas de doute sur une migration ou un renommage, n’hésitez pas à contacter l’équipe Syncheo — c’est exactement le type d’intervention que nous réalisons au quotidien pour nos clients IBM ELM.