413 Request entity too large on 5.4MB JSON:如何增加设置?
413 Request entity too large on 5.4MB JSON: how can I increase the setting?
我们将二进制编码数据作为 JSON 请求的有效负载发送到我们的 Netty 后端。在较小的有效负载 (1-2MB) 上一切正常,但在较大的有效负载上它会失败并显示 HTTP 413 Request entity too large
.
我们发现了两个可能受到影响的地方:
- HttpObjectAggregator
的构造函数
- JsonObjectDecoder 主体解析器的构造函数。
我们已将第一个设置为高于 (10MB) 我们的问题阈值 (5MB) 的默认方式,而我们根本不使用后者,因此我们不确定如何深入研究它。
(顺便说一句,我们打算在未来不将 JSON 用于大型二进制有效负载,因此不需要 "helpful" 有关更改底层架构的技巧 ;-) )
管道设置
我们有两个阶段的管道初始化,其中第一阶段取决于 http 协议版本和 SSL 的组合,而后一阶段只关心应用程序级别的处理程序。 PipelineInitializer
只是一个内部接口。
/**
* This class is concerned with setting up the handlers for the protocol level of the pipeline
* Only use it for the cases where you know the passed in traffic will be HTTP 1.1
*/
public class Http1_1PipelineInitializer implements PipelineInitializer {
private final static int MAX_CONTENT_LENGTH = 10 * 1024 * 1024; // 10MB
@Override
public void addHandlersToPipeline(ChannelPipeline pipeline) {
pipeline.addLast(
new HttpServerCodec(),
new HttpObjectAggregator(MAX_CONTENT_LENGTH),
new HttpChunkContentCompressor(),
new ChunkedWriteHandler()
);
}
}
我们的 ApplicationPipelineInitializer 中的应用程序级管道设置。我不认为这些是相关的,但为了完整性而包括在内。这部分的所有处理程序都是用户定义的处理程序:
@Override
public void addHandlersToPipeline(final ChannelPipeline pipeline) {
pipeline.addLast(
new HttpLoggerHandler(),
userRoleProvisioningHandler,
authHandlerFactory.get(),
new AuthenticatedUserHandler(services),
createRoleHandlerFactory(configuration, services, externalAuthorizer).get(),
buildInfoHandler,
eventStreamEncoder,
eventStreamDecoder,
eventStreamHandler,
methodEncoder,
methodDecoder,
methodHandler,
fileServer,
notFoundHandler,
createInterruptOnErrorHandler());
// Prepend the error handler to every entry in the pipeline. The intention behind this is to have a catch-all
// outbound error handler and thereby avoiding the need to attach a listener to every ctx.write(...).
final OutboundErrorHandler outboundErrorHandler = new OutboundErrorHandler();
for (Map.Entry<String, ChannelHandler> entry : pipeline) {
pipeline.addBefore(entry.getKey(), entry.getKey() + "#OutboundErrorHandler", outboundErrorHandler);
}
}
Netty 版本 4.1.15
抱歉浪费大家的时间:这根本不是 Netty,因此是徒劳的。检查输出后发现是前面的Nginx反向代理返回了HTTP错误,而不是Netty。添加 client_max_body_size 10M;
达到了目的,使其限制与 Netty 的保持一致。
我们将二进制编码数据作为 JSON 请求的有效负载发送到我们的 Netty 后端。在较小的有效负载 (1-2MB) 上一切正常,但在较大的有效负载上它会失败并显示 HTTP 413 Request entity too large
.
我们发现了两个可能受到影响的地方:
- HttpObjectAggregator 的构造函数
- JsonObjectDecoder 主体解析器的构造函数。
我们已将第一个设置为高于 (10MB) 我们的问题阈值 (5MB) 的默认方式,而我们根本不使用后者,因此我们不确定如何深入研究它。
(顺便说一句,我们打算在未来不将 JSON 用于大型二进制有效负载,因此不需要 "helpful" 有关更改底层架构的技巧 ;-) )
管道设置
我们有两个阶段的管道初始化,其中第一阶段取决于 http 协议版本和 SSL 的组合,而后一阶段只关心应用程序级别的处理程序。 PipelineInitializer
只是一个内部接口。
/**
* This class is concerned with setting up the handlers for the protocol level of the pipeline
* Only use it for the cases where you know the passed in traffic will be HTTP 1.1
*/
public class Http1_1PipelineInitializer implements PipelineInitializer {
private final static int MAX_CONTENT_LENGTH = 10 * 1024 * 1024; // 10MB
@Override
public void addHandlersToPipeline(ChannelPipeline pipeline) {
pipeline.addLast(
new HttpServerCodec(),
new HttpObjectAggregator(MAX_CONTENT_LENGTH),
new HttpChunkContentCompressor(),
new ChunkedWriteHandler()
);
}
}
我们的 ApplicationPipelineInitializer 中的应用程序级管道设置。我不认为这些是相关的,但为了完整性而包括在内。这部分的所有处理程序都是用户定义的处理程序:
@Override
public void addHandlersToPipeline(final ChannelPipeline pipeline) {
pipeline.addLast(
new HttpLoggerHandler(),
userRoleProvisioningHandler,
authHandlerFactory.get(),
new AuthenticatedUserHandler(services),
createRoleHandlerFactory(configuration, services, externalAuthorizer).get(),
buildInfoHandler,
eventStreamEncoder,
eventStreamDecoder,
eventStreamHandler,
methodEncoder,
methodDecoder,
methodHandler,
fileServer,
notFoundHandler,
createInterruptOnErrorHandler());
// Prepend the error handler to every entry in the pipeline. The intention behind this is to have a catch-all
// outbound error handler and thereby avoiding the need to attach a listener to every ctx.write(...).
final OutboundErrorHandler outboundErrorHandler = new OutboundErrorHandler();
for (Map.Entry<String, ChannelHandler> entry : pipeline) {
pipeline.addBefore(entry.getKey(), entry.getKey() + "#OutboundErrorHandler", outboundErrorHandler);
}
}
Netty 版本 4.1.15
抱歉浪费大家的时间:这根本不是 Netty,因此是徒劳的。检查输出后发现是前面的Nginx反向代理返回了HTTP错误,而不是Netty。添加 client_max_body_size 10M;
达到了目的,使其限制与 Netty 的保持一致。