From d15b67bd97cfe8386df0c61198d9f1ca2060089b Mon Sep 17 00:00:00 2001 From: Sergi Castro Date: Tue, 6 Jul 2021 09:10:15 +0200 Subject: [PATCH] Allow configuring max request header size (#7249) * Allow configuring max request header size This allows configuring the HTTP max request header size from the jetty server. By default it uses 8192, the same jetty default. --- CHANGES.md | 1 + docs/en/setup/backend/configuration-vocabulary.md | 2 ++ .../server-bootstrap/src/main/resources/application.yml | 2 ++ .../skywalking/oap/server/core/CoreModuleConfig.java | 6 ++++++ .../skywalking/oap/server/core/CoreModuleProvider.java | 2 ++ .../oap/server/library/server/jetty/JettyServer.java | 7 ++++++- .../oap/server/library/server/jetty/JettyServerConfig.java | 2 ++ .../receiver/sharing/server/SharingServerConfig.java | 6 ++++++ .../sharing/server/SharingServerModuleProvider.java | 3 ++- 9 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b9b6abcf4..f8d8c7092 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -73,6 +73,7 @@ Release Notes. * Fix InfluxDB storage-plugin Metrics#multiGet issue. * Replace zuul proxy with spring cloud gateway 2.x. in webapp module. * Upgrade etcd cluster coordinator and dynamic configuration to v3.x. +* Configuration: Allow to configure server maximum request header size. #### UI diff --git a/docs/en/setup/backend/configuration-vocabulary.md b/docs/en/setup/backend/configuration-vocabulary.md index 843f95eb5..cf8e0c402 100644 --- a/docs/en/setup/backend/configuration-vocabulary.md +++ b/docs/en/setup/backend/configuration-vocabulary.md @@ -12,6 +12,7 @@ core|default|role|Option values, `Mixed/Receiver/Aggregator`. **Receiver** mode | - | - | restIdleTimeOut| Connector idle timeout in milliseconds of restful service| SW_CORE_REST_JETTY_IDLE_TIMEOUT|30000| | - | - | restAcceptorPriorityDelta| Thread priority delta to give to acceptor threads of restful service| SW_CORE_REST_JETTY_DELTA|0| | - | - | restAcceptQueueSize| ServerSocketChannel backlog of restful service| SW_CORE_REST_JETTY_QUEUE_SIZE|0| +| - | - | httpMaxRequestHeaderSize| Maximum request header size accepted| SW_CORE_HTTP_MAX_REQUEST_HEADER_SIZE|8192| | - | - | gRPCHost|Binding IP of gRPC service. Services include gRPC data report and internal communication among OAP nodes|SW_CORE_GRPC_HOST|0.0.0.0| | - | - | gRPCPort| Binding port of gRPC service | SW_CORE_GRPC_PORT|11800| | - | - | gRPCSslEnabled| Activate SSL for gRPC service | SW_CORE_GRPC_SSL_ENABLED|false| @@ -175,6 +176,7 @@ core|default|role|Option values, `Mixed/Receiver/Aggregator`. **Receiver** mode | - | - | restIdleTimeOut| Connector idle timeout in milliseconds of restful service| SW_RECEIVER_SHARING_JETTY_IDLE_TIMEOUT|30000| | - | - | restAcceptorPriorityDelta| Thread priority delta to give to acceptor threads of restful service| SW_RECEIVER_SHARING_JETTY_DELTA|0| | - | - | restAcceptQueueSize| ServerSocketChannel backlog of restful service| SW_RECEIVER_SHARING_JETTY_QUEUE_SIZE|0| +| - | - | httpMaxRequestHeaderSize| Maximum request header size accepted| SW_RECEIVER_SHARING_HTTP_MAX_REQUEST_HEADER_SIZE|8192| | - | - | gRPCHost|Binding IP of gRPC service. Services include gRPC data report and internal communication among OAP nodes| SW_RECEIVER_GRPC_HOST | 0.0.0.0. Not Activated | | - | - | gRPCPort| Binding port of gRPC service | SW_RECEIVER_GRPC_PORT | Not Activated | | - | - | gRPCThreadPoolSize|Pool size of gRPC server| SW_RECEIVER_GRPC_THREAD_POOL_SIZE | CPU core * 4| diff --git a/oap-server/server-bootstrap/src/main/resources/application.yml b/oap-server/server-bootstrap/src/main/resources/application.yml index 7866d4c50..bf5f33f05 100755 --- a/oap-server/server-bootstrap/src/main/resources/application.yml +++ b/oap-server/server-bootstrap/src/main/resources/application.yml @@ -71,6 +71,7 @@ core: restIdleTimeOut: ${SW_CORE_REST_JETTY_IDLE_TIMEOUT:30000} restAcceptorPriorityDelta: ${SW_CORE_REST_JETTY_DELTA:0} restAcceptQueueSize: ${SW_CORE_REST_JETTY_QUEUE_SIZE:0} + httpMaxRequestHeaderSize: ${SW_CORE_HTTP_MAX_REQUEST_HEADER_SIZE:8192} gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0} gRPCPort: ${SW_CORE_GRPC_PORT:11800} maxConcurrentCallsPerConnection: ${SW_CORE_GRPC_MAX_CONCURRENT_CALL:0} @@ -296,6 +297,7 @@ receiver-sharing-server: restIdleTimeOut: ${SW_RECEIVER_SHARING_JETTY_IDLE_TIMEOUT:30000} restAcceptorPriorityDelta: ${SW_RECEIVER_SHARING_JETTY_DELTA:0} restAcceptQueueSize: ${SW_RECEIVER_SHARING_JETTY_QUEUE_SIZE:0} + httpMaxRequestHeaderSize: ${SW_RECEIVER_SHARING_HTTP_MAX_REQUEST_HEADER_SIZE:8192} # For gRPC server gRPCHost: ${SW_RECEIVER_GRPC_HOST:0.0.0.0} gRPCPort: ${SW_RECEIVER_GRPC_PORT:0} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java index 5d3a02204..6fe780bfd 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java @@ -182,6 +182,12 @@ public class CoreModuleConfig extends ModuleConfig { @Setter private boolean enableEndpointNameGroupingByOpenapi = true; + /** + * The maximum size in bytes allowed for request headers. + * Use -1 to disable it. + */ + private int httpMaxRequestHeaderSize = 8192; + public CoreModuleConfig() { this.downsampling = new ArrayList<>(); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java index af6c2ecb3..31f511290 100755 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java @@ -221,6 +221,8 @@ public class CoreModuleProvider extends ModuleProvider { .jettyMaxThreads(moduleConfig.getRestMaxThreads()) .jettyAcceptQueueSize( moduleConfig.getRestAcceptQueueSize()) + .jettyHttpMaxRequestHeaderSize( + moduleConfig.getHttpMaxRequestHeaderSize()) .build(); jettyServer = new JettyServer(jettyServerConfig); jettyServer.initialize(); diff --git a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServer.java b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServer.java index 388fbc28e..fb8c95f81 100644 --- a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServer.java +++ b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServer.java @@ -23,6 +23,8 @@ import org.apache.skywalking.oap.server.library.server.Server; import org.apache.skywalking.oap.server.library.server.ServerException; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletMapping; @@ -60,7 +62,10 @@ public class JettyServer implements Server { server = new org.eclipse.jetty.server.Server(threadPool); - ServerConnector connector = new ServerConnector(server); + HttpConfiguration httpConfiguration = new HttpConfiguration(); + httpConfiguration.setRequestHeaderSize(jettyServerConfig.getJettyHttpMaxRequestHeaderSize()); + + ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration)); connector.setHost(jettyServerConfig.getHost()); connector.setPort(jettyServerConfig.getPort()); connector.setIdleTimeout(jettyServerConfig.getJettyIdleTimeOut()); diff --git a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServerConfig.java b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServerConfig.java index c6ca056b9..64fb5fc2d 100644 --- a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServerConfig.java +++ b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/jetty/JettyServerConfig.java @@ -41,4 +41,6 @@ public class JettyServerConfig { private int jettyAcceptorPriorityDelta = 0; @Builder.Default private int jettyAcceptQueueSize = 0; + @Builder.Default + private int jettyHttpMaxRequestHeaderSize = 8192; } diff --git a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerConfig.java b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerConfig.java index c3866dfb5..afea38de1 100644 --- a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerConfig.java +++ b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerConfig.java @@ -50,4 +50,10 @@ public class SharingServerConfig extends ModuleConfig { private boolean gRPCSslEnabled = false; private String gRPCSslKeyPath; private String gRPCSslCertChainPath; + + /** + * The maximum size in bytes allowed for request headers. + * Use -1 to disable it. + */ + private int httpMaxRequestHeaderSize = 8192; } diff --git a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerModuleProvider.java index 9984d4284..53613abf8 100644 --- a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/SharingServerModuleProvider.java @@ -78,7 +78,8 @@ public class SharingServerModuleProvider extends ModuleProvider { .jettyAcceptQueueSize(config.getRestAcceptQueueSize()) .jettyAcceptorPriorityDelta( config.getRestAcceptorPriorityDelta()) - .jettyIdleTimeOut(config.getRestIdleTimeOut()).build(); + .jettyIdleTimeOut(config.getRestIdleTimeOut()) + .jettyHttpMaxRequestHeaderSize(config.getHttpMaxRequestHeaderSize()).build(); jettyServerConfig.setHost(Strings.isBlank(config.getRestHost()) ? "0.0.0.0" : config.getRestHost()); jettyServerConfig.setPort(config.getRestPort()); jettyServerConfig.setContextPath(config.getRestContextPath());