413请求实体在5.4MB JSON上太大:如何增加设置?

时间:2018-09-04 08:56:23

标签: nginx netty nginx-reverse-proxy content-length http-content-length

我们正在将二进制编码的数据作为JSON请求的有效负载发送到我们的Netty后端。在较小的有效负载(1-2MB)上,一切都很好,但是在较大的有效负载上,它失败并显示HTTP 413 Request entity too large

我们发现了两个可能会受到影响的地方:

  1. HttpObjectAggregator的构造函数
  2. JsonObjectDecoder正文解析器的构造函数。

我们已将第一个设置为高于问题阈值(5MB)的默认方式(10MB),而我们完全不使用后者,因此我们不确定如何深入研究。

(顺便说一句,我们打算将来不对大型二进制有效负载使用JSON,因此不需要有关更改基础体系结构的“有用”技巧;-))

管道设置 我们有两个阶段的管道初始化,其中第一阶段取决于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);
    }
}

网络版本4.1.15

1 个答案:

答案 0 :(得分:3)

很抱歉浪费大家的时间:这根本不是Netty,因此不是野鹅。检查输出后,我发现返回HTTP错误而不是Netty是前面的Nginx反向代理。添加client_max_body_size 10M;可以解决问题,将其限制与Netty的限制保持一致。