アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング eap/wildfly 基盤技術

wildflyアップロードサイズ上限

投稿日:

多くのWebサーバやAPサーバでは、サーバリソースの過剰な消費やDoS攻撃に対する対処として、アップロードの最大サイズが決められている。(厳密には、ブラウザから入力値やファイル等のデータを送信するためのPOSTメソッドの最大サイズである。)
Wildfly13でのアップロードサイズの扱いについて調べた。

Wildflyでの設定箇所と既定値

POSTの上限サイズは、サブシステムundertowのhttp-listener要素のmax-post-size値で定義する。
デフォルトは10MB(10,485,760バイト)、最小値は0、最大値は無制限(-1)である。詳細な定義についてはWildflyのリファレンスを参照のこと。

...
        <subsystem xmlns="urn:jboss:domain:undertow:6.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
            <buffer-cache name="default"/>
            <server name="default-server">
                <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" max-post-size="10485760"/>
                <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
                <host name="default-host" alias="localhost">
                    <http-invoker security-realm="ApplicationRealm"/>
                </host>
            </server>
            <servlet-container name="default">
                <jsp-config/>
                <websockets/>
            </servlet-container>
        </subsystem>
...

アップロード上限を超えた場合の挙動

アップロード上下を超えたPOSTを実行した場合、サーバ側ではログファイルに次のように記録される。
Webアプリ側の例外ハンドラより前にWildfly(undertow)がRequestTooBigException例外をスローしている。

...
Caused by: io.undertow.server.RequestTooBigException: UT000020: Connection terminated as request was larger than 10485760
	at io.undertow.conduits.FixedLengthStreamSourceConduit.checkMaxSize(FixedLengthStreamSourceConduit.java:168)
	at io.undertow.conduits.FixedLengthStreamSourceConduit.read(FixedLengthStreamSourceConduit.java:229)
	at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
	at io.undertow.channels.DetachableStreamSourceChannel.read(DetachableStreamSourceChannel.java:209)
	at io.undertow.server.HttpServerExchange$ReadDispatchChannel.read(HttpServerExchange.java:2337)
	at org.xnio.channels.Channels.readBlocking(Channels.java:294)
	at io.undertow.servlet.spec.ServletInputStreamImpl.readIntoBuffer(ServletInputStreamImpl.java:192)
	at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:168)
	at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.parseBlocking(MultiPartParserDefinition.java:213)
	at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:833)
	... 54 more

ブラウザ側では、次のようにサーバ側からネットワーク接続が切断(リセット)された旨を示す、ERR_CONNECTION_RESETエラー画面(Chromeの例)が表示される。

アップロード上限エラーのハンドリング方法の検討

アップロード上限を超過した場合は、アップロード上限を超えている旨のエラー画面を、ユーザに表示したい。
HTTPではリクエストの送信中に送信を中断して、応答コードを返す仕組みは存在せず、送信の完了を待たざるを得ない。送信の完了を待つために送信されるデータを全て受信すると、サーバリソースの枯渇を招く可能性がある。そうなると、サーバを保護するためにHTTP(TCP)の接続を切断せざるを得ないので、このような結果になっても仕方ないかと考えられます。
Wildflyのフロントにロードバランサや配置される場合、転送先のWildflyから接続をリセットされたことを検知して、内部サーバエラー(500系)のエラー画面を出すことは可能かもしれませんが、リセットされた理由までは分からないので「アップロード上限を超えている」をピンポイントで指摘することは難しいと思います。



(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, eap/wildfly, 基盤技術

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

開発・検証用のFTPサーバ(IIS)を構築

FTPで外部連携するためのプログラムを開発する際に、接続先のFTPサーバの準備に困る場合があります。 ここでは、Widnwos10上に開発・検証用のFTPサーバを構築するための手順を説明します。 「I …

grid

Excelで月初日、第1週日、第2週日を算出する

プロジェクト管理で毎年、毎月のタスクを管理するために、この辺の操作を行うためのExcel関数を調べたので記載しておきます。 Excelの関数式 ここでは、基本的に5営業日単位で管理したいことと、最初の …

SLF4Jの仕組みと使用方法

何気に使用しているSLF4Jの仕様やその仕組みを整理したいと思います。 前提 元ネタは次のSLF4J Manualサイトです。 www.slf4j.org  1 share 1&n …

WebサイトのSSL化

次のようなGoogleウェブマスター向け公式ブログでの推奨や、リモートか管理の安全性向上の向上のためにSSL(TLS)を有効にする。 概要 Googleさんの考え 保護されたウェブの普及を目指して(2 …

JBoss EAP7でDEBUG/TRACEログを出力

JBoss EAP7でアプリのDEBUGやTRACEのログを出力する方法を記載します。 開発の序盤でアプリのDEBUGログがeclipseのコンソールやログファイルに出力されず、困る場合があるので、メ …

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る