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
Apache Axis2
