Fix Oracle WebCenter Sites LCP Issues | OpsBlu Docs

Fix Oracle WebCenter Sites LCP Issues

Reduce Oracle WCS LCP by enabling Satellite Server caching, optimizing BlobServer image delivery, and reducing JSP rendering time.

General Guide: See Global LCP Guide for universal concepts and fixes.

What is LCP?

Largest Contentful Paint measures when the largest content element becomes visible. Google recommends LCP under 2.5 seconds. Oracle WebCenter Sites (formerly FatWire) uses JSP-based templates, Satellite Server for page assembly, and BlobServer for asset delivery. LCP depends heavily on Satellite Server cache configuration, BlobServer image serving, and the complexity of asset template rendering chains.

Oracle WebCenter Sites-Specific LCP Causes

  • Satellite Server cache misses -- uncached pages execute full asset rendering chains through Content Server, which can take seconds per request
  • BlobServer image delivery -- images served via BlobServer URLs (/cs/BlobServer?blobkey=...) are dynamically resolved and lack CDN-level caching by default
  • Deep asset template nesting -- WCS renders pages by assembling nested asset templates (Layout, Slot, Detail), each requiring a Content Server call
  • Uncached CSElement and SiteEntry assets -- every uncached template fragment triggers a database query and JSP compilation
  • No image processing pipeline -- uploaded images serve at original resolution without server-side resizing or format conversion

Fixes

1. Configure Satellite Server Caching

Ensure all page and fragment assets have proper cache headers:

<!-- In your Template asset's CSElement -->
<ics:setvar name="cachecontrol" value="max-age=3600"/>
<ics:setvar name="pagecriteria" value="c,cid,p"/>

<!-- For SiteEntry assets, set cache rules in the WCS admin -->
<!-- Admin > Sites > Cache Rules > Add Rule -->
<!-- Pattern: /cs/Satellite/site/* -->
<!-- Cache Time: 3600 seconds -->
<!-- Vary: c,cid,rendermode -->

Verify caching is active:

# Check Satellite Server cache status
curl -I "https://yoursite.com/cs/Satellite/site/page" | grep -i "x-cache"
# Should return: X-Cache: HIT from Satellite

2. Optimize BlobServer Image Delivery

Move hero images from BlobServer to a CDN, or add caching headers:

<%-- In your Detail template JSP --%>
<%-- Instead of raw BlobServer URL: --%>
<img
  src="/cs/BlobServer?blobkey=id&blobnocache=true&blobwhere=<%= imageId %>&blobcol=urldata"
  width="1200" height="630"
  alt="<%= assetName %>"
  loading="eager"
  fetchpriority="high"
  style="aspect-ratio: 1200/630; width: 100%; height: auto; object-fit: cover;"
>

<%-- Better: Use a static URL via Satellite Server with caching --%>
<satellite:link pagename="ImageRender" c="Image" cid="<%= imageId %>"
  assembler="query" fragment="true"/>

Pre-optimize images before uploading to the DAM:

# Resize and compress before uploading to WCS
mogrify -strip -quality 80 -resize "1920>" *.jpg
cwebp -q 80 hero.jpg -o hero.webp

3. Reduce Template Nesting Depth

Flatten your asset template chain where possible:

<%-- SLOW: 4 levels deep --%>
<%-- Layout -> Wrapper -> Slot -> Detail -> Fragment --%>

<%-- FASTER: Inline fragments into Detail templates --%>
<%-- Layout -> Slot -> Detail (with inlined fragments) --%>

<%-- Use ics:callelement with caching instead of deep nesting --%>
<ics:callelement element="ContentRender/HeroImage"
  cscachecontrol="max-age=1800"
  cscriteria="c,cid">
  <ics:argument name="c" value="Page"/>
  <ics:argument name="cid" value='<%= ics.GetVar("cid") %>'/>
</ics:callelement>

4. Preload Critical Assets in Layout Templates

<%-- In your Layout template's <head> section --%>
<head>
  <%-- Inline critical CSS --%>
  <style>
    body { font-family: system-ui, sans-serif; margin: 0; }
    .header { display: flex; height: 64px; align-items: center; }
    .hero { width: 100%; aspect-ratio: 16/9; }
    .content { max-width: 1200px; margin: 0 auto; padding: 1rem; }
  </style>

  <%-- Preload hero image if available --%>
  <% if (heroImageUrl != null) { %>
    <link rel="preload" as="image" href="<%= heroImageUrl %>">
  <% } %>

  <%-- Defer non-critical CSS --%>
  <link rel="preload" href="/cs/Satellite/theme/main.css" as="style"
</head>

5. Enable Composition Caching

# In wcs_properties.json or Satellite Server config
# Enable page composition caching
satellite.cachemanager.enabled=true
satellite.cachemanager.maxentries=10000
satellite.cachemanager.defaultexpiry=3600

# Enable blob caching
cs.blobcachefolder=/opt/wcs/blobcache
cs.blobcacheexpiry=86400

Measuring LCP on Oracle WCS

  1. WCS Activity Logging -- enable futuretense.ini debug logging to see asset render times: cs.debug=true, cs.debug.logfile=/opt/wcs/debug.log
  2. Satellite Server cache stats -- check hit/miss ratios in the Satellite Server admin console
  3. PageSpeed Insights -- test public-facing pages to identify the LCP element
  4. TTFB baseline -- curl -w "TTFB: %{time_starttransfer}\n" -o /dev/null -s https://yoursite.com -- if over 800ms, focus on Satellite Server caching
  5. Template profiling -- use WCS's built-in render time logging to identify the slowest asset templates in the chain

Analytics Script Impact

  • Place analytics scripts at the bottom of the Layout template before </body>
  • Use async or defer on all tracking scripts
  • Oracle WCS Visitor Tracking (if enabled) adds minimal overhead since it runs server-side
  • Avoid synchronous calls to Oracle Maxymiser (personalization) in the critical rendering path