Apache Tomcat 11 + Axis2 HTTP/2 Integration Guide

🚀 Apache Tomcat 11 HTTP/2 - Excellent Support with Simplified Configuration

Tomcat 11 HTTP/2 Configuration (Production-Optimized)

1. Complete server.xml HTTP/2 Configuration

<!-- Apache Tomcat 11 - HTTP/2 Optimized Configuration -->
<!-- Aligned with Axis2 Enhanced Moshi H2 Processing -->

<Server port="8005" shutdown="SHUTDOWN">

  <!-- Global Naming Resources -->
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- Thread Pool for HTTP/2 Optimization -->
  <!-- Aligned with Axis2 Enhanced Moshi H2 async processing -->
  <Service name="Catalina">

    <!-- HTTP/2 Thread Pool Configuration -->
    <Executor name="tomcatThreadPool"
              namePrefix="catalina-exec-"
              maxThreads="200"                    <!-- Matches HTTP/2 concurrent streams -->
              minSpareThreads="20"
              maxIdleTime="600000"                <!-- 10 minutes -->
              prestartminSpareThreads="true" />

    <!-- HTTP Connector with HTTP/2 Upgrade -->
    <Connector executor="tomcatThreadPool"
               port="8080"
               protocol="HTTP/1.1"
               redirectPort="8443"
               maxPostSize="104857600"           <!-- 100MB for large JSON payloads -->
               connectionTimeout="300000"        <!-- 5 minutes for large payload processing -->
               keepAliveTimeout="300000"         <!-- Keep-alive for performance -->
               maxKeepAliveRequests="1000"       <!-- High keep-alive for HTTP/2 benefits -->
               compression="on"                  <!-- JSON compression -->
               compressionMinSize="2048"         <!-- Compress >2KB JSON -->
               noCompressionUserAgents="gozilla, traviata"
               compressableMimeType="application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css" />

    <!-- HTTPS Connector with Native HTTP/2 Support -->
    <!-- PRODUCTION-OPTIMIZED: Native HTTP/2 implementation -->
    <Connector executor="tomcatThreadPool"
               port="8443"
               protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxPostSize="104857600"           <!-- 100MB for large JSON -->
               SSLEnabled="true"
               scheme="https"
               secure="true"
               connectionTimeout="300000"        <!-- 5 minutes -->
               keepAliveTimeout="300000"         <!-- Persistent connections -->

               <!-- HTTP/2 Configuration Parameters -->
               <!-- ALIGNED: Buffer sizes match Enhanced Moshi H2 -->
               upgradeAsyncTimeout="300000"      <!-- HTTP/2 upgrade timeout -->
               http2MaxConcurrentStreams="200"   <!-- High concurrency -->
               http2InitialWindowSize="2097152"  <!-- 2MB: avoids flow-control round trips -->
               http2MaxFrameSize="32768"         <!-- 32KB - aligned with buffer management -->
               http2MaxHeaderTableSize="8192"    <!-- 8KB header table -->
               http2MaxHeaderListSize="32768"    <!-- 32KB header list -->
               http2EnablePush="false"           <!-- Disabled for web services -->

               <!-- SSL Configuration -->
               SSLCertificateFile="/path/to/your/certificate.crt"
               SSLCertificateKeyFile="/path/to/your/private.key"
               SSLCertificateChainFile="/path/to/your/chain.crt"
               SSLProtocol="TLSv1.2+TLSv1.3"    <!-- Modern TLS for HTTP/2 -->
               SSLCipherSuite="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384"
               SSLHonorCipherOrder="true"

               <!-- JSON Processing Optimization -->
               compression="on"
               compressionMinSize="2048"
               compressableMimeType="application/json,application/xml" />

    <!-- Engine Configuration -->
    <Engine name="Catalina" defaultHost="localhost">

      <!-- Host Configuration with HTTP/2 Access Logging -->
      <Host name="localhost"
            appBase="webapps"
            unpackWARs="true"
            autoDeploy="true">

        <!-- HTTP/2 + JSON Performance Access Log -->
        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="logs"
               prefix="axis2_http2_access_log"
               suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b %D Protocol:%{org.apache.coyote.request.protocol}r JSON-Size:%{Content-Length}o Time:%T"
               resolveHosts="false" />

        <!-- JSON Compression for Axis2 Responses -->
        <Context>
          <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
        </Context>

      </Host>
    </Engine>
  </Service>
</Server>

2. Key Configuration Highlights

Parameter Tomcat 11 Value Optimization Purpose WildFly Equivalent
http2MaxConcurrentStreams 200 High multiplexing for large JSON APIs http2-max-concurrent-streams="200"
http2InitialWindowSize 2097152 (2MB) Avoids flow-control round trips on large responses http2-initial-window-size="2097152"
http2MaxFrameSize 32768 (32KB) Optimal for JSON streaming http2-max-frame-size="32768"
maxPostSize 104857600 (100MB) Large JSON payload support max-post-size="104857600"
connectionTimeout 300000 (5min) Large payload processing time no-request-timeout="300000"
http2EnablePush false Disabled for web services http2-enable-push="false"

Axis2 Integration Configuration

1. Enhanced axis2.xml for Tomcat HTTP/2

<!-- axis2.xml - Tomcat 11 + HTTP/2 + Enhanced Moshi H2 Configuration -->
<axisconfig name="AxisJava2.0-Tomcat11-HTTP2-EnhancedMoshiH2">

    <!-- JSON processing mode and Tomcat HTTP/2 tuning are configured in
         Tomcat's server.xml (compression, keep-alive, buffer sizes, etc.),
         not in axis2.xml.  Use the standard JSON message builder below. -->

    <!-- Enhanced JSON Message Builder -->
    <messageBuilder contentType="application/json"
                    class="org.apache.axis2.json.moshih2.EnhancedMoshiJsonBuilder"/>

    <!-- Enhanced JSON Message Formatter -->
    <messageFormatter contentType="application/json"
                      class="org.apache.axis2.json.moshih2.EnhancedMoshiJsonFormatter"/>

    <!-- HTTP/1.1 Transport (Fallback) -->
    <transportSender name="http"
                     class="org.apache.axis2.transport.http.impl.httpclient5.HTTPClient5TransportSender">
        <parameter name="PROTOCOL">HTTP/1.1</parameter>
    </transportSender>

    <!-- HTTP/2 Transport (Coordinated with Tomcat 11) -->
    <transportSender name="h2"
                     class="org.apache.axis2.transport.h2.impl.httpclient5.H2TransportSender">
        <parameter name="PROTOCOL">HTTP/2.0</parameter>

        <!-- Coordination with Tomcat 11 HTTP/2 -->
        <parameter name="maxConcurrentStreams">200</parameter>              <!-- Matches Tomcat -->
        <parameter name="initialWindowSize">2097152</parameter>             <!-- 2MB: avoids flow-control round trips -->
        <parameter name="maxFrameSize">32768</parameter>                    <!-- 32KB - matches Tomcat -->
        <parameter name="maxConnectionsTotal">50</parameter>
        <parameter name="maxConnectionsPerRoute">10</parameter>
        <parameter name="connectionTimeout">60000</parameter>               <!-- 1 minute connection -->
        <parameter name="responseTimeout">300000</parameter>                <!-- 5min response timeout -->

        <!-- JSON streaming and compression are handled by the message formatter
             and Tomcat's server.xml respectively — no additional transport
             sender parameters are needed for Moshi or Tomcat integration. -->
    </transportSender>

</axisconfig>

Advanced Configuration Options

1. SSL/TLS Certificate Setup

Tomcat 11 simplifies SSL setup compared to WildFly:

Option A: APR/Native SSL (Recommended for Production)

# Install Tomcat Native Library (Ubuntu/Debian)
sudo apt-get install libtcnative-1 openssl-dev

# Certificate configuration in server.xml
SSLCertificateFile="/etc/ssl/certs/your-domain.crt"
SSLCertificateKeyFile="/etc/ssl/private/your-domain.key"
SSLCertificateChainFile="/etc/ssl/certs/chain.crt"

Option B: Java KeyStore SSL

# Generate keystore
keytool -genkeypair -keyalg RSA -keysize 2048 -keystore tomcat-keystore.jks \
        -alias tomcat -dname "CN=your-domain.com,OU=IT,O=YourOrg,C=US"

# Server.xml configuration
<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           maxPostSize="104857600"
           SSLEnabled="true"
           keystoreFile="/path/to/tomcat-keystore.jks"
           keystorePass="your-password"
           keyAlias="tomcat" />

2. Memory Optimization for HTTP/2 + JSON Processing

JVM Memory Settings (catalina.sh)

# Memory-optimized JVM settings for HTTP/2 + Enhanced Moshi H2
export CATALINA_OPTS="$CATALINA_OPTS -Xms2048m -Xmx4096m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseG1GC"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxGCPauseMillis=200"
export CATALINA_OPTS="$CATALINA_OPTS -XX:G1HeapRegionSize=16m"

# HTTP/2 Connection Pool Optimization
export CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv6Addresses=false"
export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.coyote.http2.Http2Protocol.maxConcurrentStreams=200"

# Enhanced Moshi H2 Optimization
export CATALINA_OPTS="$CATALINA_OPTS -Daxis2.json.moshi.h2.enabled=true"
export CATALINA_OPTS="$CATALINA_OPTS -Daxis2.json.moshi.h2.async.threshold=1048576"

3. Production Monitoring Configuration

Enhanced Access Logging

<!-- HTTP/2 + JSON Performance Monitoring -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
       directory="logs"
       prefix="http2_performance"
       suffix=".log"
       pattern="%h %u %t "%r" %s %b %D Protocol:%{org.apache.coyote.request.protocol}r
                Streams:%{http2.concurrent.streams}r
                JSON-Size:%{Content-Length}o
                Moshi-Processing:%{X-Moshi-H2-Processing-Time}o
                Compression:%{Accept-Encoding}i" />

Production Deployment Guide

1. Step-by-Step Deployment

Step 1: Install Tomcat 11

# Download and extract Tomcat 11
cd /opt
sudo wget https://downloads.apache.org/tomcat/tomcat-11/v11.0.x/bin/apache-tomcat-11.0.x.tar.gz
sudo tar -xzf apache-tomcat-11.0.x.tar.gz
sudo mv apache-tomcat-11.0.x tomcat11
sudo chown -R tomcat:tomcat /opt/tomcat11

Step 2: Configure HTTP/2 (Replace server.xml)

# Backup original configuration
sudo cp /opt/tomcat11/conf/server.xml /opt/tomcat11/conf/server.xml.backup

# Apply HTTP/2 optimized configuration (use the server.xml above)
sudo nano /opt/tomcat11/conf/server.xml

Step 3: Deploy Axis2 with Enhanced Moshi H2

# Deploy your Axis2 WAR with Enhanced Moshi H2
sudo cp your-axis2-app.war /opt/tomcat11/webapps/

# Configure axis2.xml with HTTP/2 settings (use configuration above)
# Update WEB-INF/conf/axis2.xml in your deployed WAR

Step 4: Configure SSL Certificates

# Place certificates in secure location
sudo mkdir -p /etc/tomcat11/ssl
sudo cp your-domain.crt /etc/tomcat11/ssl/
sudo cp your-domain.key /etc/tomcat11/ssl/
sudo chown -R tomcat:tomcat /etc/tomcat11/ssl
sudo chmod 600 /etc/tomcat11/ssl/*

Step 5: Start and Validate

# Start Tomcat
sudo systemctl start tomcat11

# Validate HTTP/2 is working
curl -k --http2 --location 'https://localhost:8443/your-app/services/YourService' \
     --header 'Content-Type: application/json' \
     --data '{"test": "HTTP/2 validation"}' \
     --trace-ascii trace.log

# Check for HTTP/2 in trace.log
grep "HTTP/2" trace.log

2. Performance Validation

Validate HTTP/2 Protocol Negotiation

# Test HTTP/2 negotiation
openssl s_client -connect localhost:8443 -alpn h2

# Expected output should show:
# ALPN protocol: h2
# Protocol: TLSv1.3

Test Large JSON Payload Processing

# Test large payload with Enhanced Moshi H2
curl -k --http2 -X POST 'https://localhost:8443/your-app/services/JsonService' \
     --header 'Content-Type: application/json' \
     --data @large-test-payload.json \
     --output response.json \
     --write-out "Time: %{time_total}s, Size: %{size_download} bytes, HTTP: %{http_version}\n"

# Should show HTTP/2.0 and fast processing times

3. Monitoring and Troubleshooting

HTTP/2 Metrics Monitoring

# Monitor access logs for HTTP/2 performance
tail -f /opt/tomcat11/logs/http2_performance.log

# Key metrics to watch:
# - Protocol: HTTP/2.0
# - Concurrent streams usage
# - JSON processing times
# - Compression ratios

JVM Performance Monitoring

# Monitor JVM metrics
jstat -gc -t $(pgrep -f tomcat) 5s

# Monitor HTTP/2 connections
netstat -an | grep :8443 | grep ESTABLISHED | wc -l