| <?xml version="1.0"?> |
| <!-- |
| ~ Licensed to the Apache Software Foundation (ASF) under one |
| ~ or more contributor license agreements. See the NOTICE file |
| ~ distributed with this work for additional information |
| ~ regarding copyright ownership. The ASF licenses this file |
| ~ to you under the Apache License, Version 2.0 (the |
| ~ "License"); you may not use this file except in compliance |
| ~ with the License. You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, |
| ~ software distributed under the License is distributed on an |
| ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~ KIND, either express or implied. See the License for the |
| ~ specific language governing permissions and limitations |
| ~ under the License. |
| --> |
| <document xmlns="http://maven.apache.org/XDOC/2.0" |
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
| xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd"> |
| <properties> |
| <title>Apache Tomcat 11 + Axis2 HTTP/2 Integration Guide - Production-Ready Configuration</title> |
| </properties> |
| |
| <body> |
| |
| <h1>Apache Tomcat 11 + Axis2 HTTP/2 Integration Guide</h1> |
| |
| <div style="background-color: #e8f5e8; border: 1px solid #4CAF50; padding: 15px; margin: 10px 0;"> |
| <h4>🚀 Apache Tomcat 11 HTTP/2 - Excellent Support with Simplified Configuration</h4> |
| |
| <h2>Tomcat 11 HTTP/2 Configuration (Production-Optimized)</h2> |
| |
| <h3>1. Complete server.xml HTTP/2 Configuration</h3> |
| |
| <pre> |
| <!-- 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> |
| </pre> |
| |
| <h3>2. Key Configuration Highlights</h3> |
| |
| <table border="1"> |
| <tr><th>Parameter</th><th>Tomcat 11 Value</th><th>Optimization Purpose</th><th>WildFly Equivalent</th></tr> |
| <tr><td><strong>http2MaxConcurrentStreams</strong></td><td>200</td><td>High multiplexing for large JSON APIs</td><td>http2-max-concurrent-streams="200"</td></tr> |
| <tr><td><strong>http2InitialWindowSize</strong></td><td>2097152 (2MB)</td><td>Avoids flow-control round trips on large responses</td><td>http2-initial-window-size="2097152"</td></tr> |
| <tr><td><strong>http2MaxFrameSize</strong></td><td>32768 (32KB)</td><td>Optimal for JSON streaming</td><td>http2-max-frame-size="32768"</td></tr> |
| <tr><td><strong>maxPostSize</strong></td><td>104857600 (100MB)</td><td>Large JSON payload support</td><td>max-post-size="104857600"</td></tr> |
| <tr><td><strong>connectionTimeout</strong></td><td>300000 (5min)</td><td>Large payload processing time</td><td>no-request-timeout="300000"</td></tr> |
| <tr><td><strong>http2EnablePush</strong></td><td>false</td><td>Disabled for web services</td><td>http2-enable-push="false"</td></tr> |
| </table> |
| |
| <h2>Axis2 Integration Configuration</h2> |
| |
| <h3>1. Enhanced axis2.xml for Tomcat HTTP/2</h3> |
| |
| <pre> |
| <!-- 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> |
| </pre> |
| |
| <h2>Advanced Configuration Options</h2> |
| |
| <h3>1. SSL/TLS Certificate Setup</h3> |
| |
| <p><strong>Tomcat 11 simplifies SSL setup compared to WildFly</strong>:</p> |
| |
| <h4>Option A: APR/Native SSL (Recommended for Production)</h4> |
| <pre> |
| # 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" |
| </pre> |
| |
| <h4>Option B: Java KeyStore SSL</h4> |
| <pre> |
| # 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" /> |
| </pre> |
| |
| <h3>2. Memory Optimization for HTTP/2 + JSON Processing</h3> |
| |
| <h4>JVM Memory Settings (catalina.sh)</h4> |
| <pre> |
| # 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" |
| </pre> |
| |
| <h3>3. Production Monitoring Configuration</h3> |
| |
| <h4>Enhanced Access Logging</h4> |
| <pre> |
| <!-- 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" /> |
| </pre> |
| |
| <h2>Production Deployment Guide</h2> |
| |
| <h3>1. Step-by-Step Deployment</h3> |
| |
| <h4>Step 1: Install Tomcat 11</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h4>Step 2: Configure HTTP/2 (Replace server.xml)</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h4>Step 3: Deploy Axis2 with Enhanced Moshi H2</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h4>Step 4: Configure SSL Certificates</h4> |
| <pre> |
| # 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/* |
| </pre> |
| |
| <h4>Step 5: Start and Validate</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h3>2. Performance Validation</h3> |
| |
| <h4>Validate HTTP/2 Protocol Negotiation</h4> |
| <pre> |
| # Test HTTP/2 negotiation |
| openssl s_client -connect localhost:8443 -alpn h2 |
| |
| # Expected output should show: |
| # ALPN protocol: h2 |
| # Protocol: TLSv1.3 |
| </pre> |
| |
| <h4>Test Large JSON Payload Processing</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h3>3. Monitoring and Troubleshooting</h3> |
| |
| <h4>HTTP/2 Metrics Monitoring</h4> |
| <pre> |
| # 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 |
| </pre> |
| |
| <h4>JVM Performance Monitoring</h4> |
| <pre> |
| # Monitor JVM metrics |
| jstat -gc -t $(pgrep -f tomcat) 5s |
| |
| # Monitor HTTP/2 connections |
| netstat -an | grep :8443 | grep ESTABLISHED | wc -l |
| </pre> |
| |
| </div> |
| |
| </body> |
| </document> |