Assistance/Guides proxy
Guides proxy

Proxy Flowsery Analytics avec Nginx

Faites transiter Flowsery Analytics via Nginx afin d'eviter les interferences des bloqueurs de publicites et de capturer des donnees visiteurs precises. Ce guide s'applique aussi bien a Nginx autonome qu'a Nginx utilise comme reverse proxy devant un serveur applicatif.

La configuration repose sur deux elements essentiels : un proxy_pass qui rend les evenements first-party (resistant aux bloqueurs), et un proxy_set_header x-flowsery-real-ip qui transporte la vraie IP du visiteur a travers le saut proxy afin que Flowsery resolve la geo a partir du visiteur, et non de votre serveur.

1. Configuration Nginx de base

Ajoutez ces blocs location (generalement dans /etc/nginx/sites-available/your-site ou /etc/nginx/conf.d/your-site.conf) :

Nginx
# Proxy the analytics script
location /js/main.js {
    proxy_pass https://cdn.flowsery.com/main.js;
    proxy_set_header Host cdn.flowsery.com;
 
    # Cache the script for 1 year
    proxy_cache_valid 200 1y;
    add_header Cache-Control "public, max-age=31536000";
    expires 1y;
}
 
# Proxy the event collection endpoint + forward real visitor IP
location /api/track {
    proxy_pass https://analytics.flowsery.com/analytics/events;
    proxy_set_header Host analytics.flowsery.com;
 
    # CRITICAL: forwards the real visitor IP to the analytics backend.
    # Without this, every visitor resolves to your server's location.
    proxy_set_header x-flowsery-real-ip $remote_addr;
 
    # Standard forwarding (kept for compatibility with other consumers)
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
 
    # Allow POST requests
    proxy_pass_request_body on;
}

Si Nginx est derriere Cloudflare (ou un autre edge), $remote_addr est l'IP du CDN edge, pas celle du visiteur. Utilisez plutot l'en-tete d'IP reelle du CDN :

Nginx
# Behind Cloudflare — the visitor IP is in $http_cf_connecting_ip
proxy_set_header x-flowsery-real-ip $http_cf_connecting_ip;
 
# Behind Vercel / Fly.io / a generic L7 proxy
# proxy_set_header x-flowsery-real-ip $http_x_real_ip;

Remarque : si votre serveur utilise deja /api/track, choisissez un autre chemin et indiquez-le au tracker avec data-api="/flowsery-events".

2. Optionnel : activer le cache pour le script

Nginx
# At the top of your nginx.conf (http {} block)
proxy_cache_path /var/cache/nginx/flowsery_cache levels=1:2 keys_zone=flowsery_cache:10m max_size=10g inactive=60m use_temp_path=off;
 
# In your server {} block, augment the /js/main.js location
location /js/main.js {
    proxy_cache flowsery_cache;
    proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
    proxy_cache_valid 200 1y;
    proxy_cache_bypass $http_pragma;
    proxy_cache_revalidate on;
    # ...rest of the config from step 1
}

3. Modifier la balise script

Remplacez le snippet Flowsery Analytics par la version proxifiee :

HTML
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>
Terminal
sudo nginx -t           # validate config
sudo systemctl reload nginx

Verifier que cela fonctionne

  1. Ouvrez votre site dans un onglet de navigateur classique.
  2. Dans DevTools → Reseau, filtrez sur /api/track. Verifiez que les requetes partent vers votre propre domaine.
  3. Dans votre tableau de bord Flowsery, verifiez que les pays visiteurs correspondent a votre audience, et non a votre region d'hebergement.

Depannage

Tous les visiteurs apparaissent au meme endroit

Le proxy transfere bien les evenements, mais pas la vraie IP du visiteur. x-flowsery-real-ip est absent ou contient l'IP de votre serveur au lieu de celle du visiteur.

  • Verifiez que la ligne proxy_set_header x-flowsery-real-ip <value> est bien presente sur /api/track et que la valeur pointe vers la bonne variable selon votre edge setup ($remote_addr pour du trafic direct, $http_cf_connecting_ip pour Cloudflare, $http_x_real_ip pour un edge L7 generique).
  • Si Nginx est derriere un autre proxy, n'utilisez pas $remote_addr : ce sera l'IP du proxy amont, pas celle du visiteur. Utilisez l'en-tete injecte par le proxy amont.