1. ホーム
  2. ジャワ

org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header" から一定期間、tomcat が起動しない ...

2022-02-24 22:14:12

いろいろと試してみましたが、解決には至らないようですが、勉強になったので記録しておきます。

例外の詳細

1. まず、最も目につくのは、最初に追加した maxHttpHeaderSize="8192" というように設定する必要があります。

<Connector port="8080" protocol="HTTP/1.1" maxHttpHeaderSize="8192" connectionTimeout="20000& quot; maxThreads="150" maxSpareThreads="75" redirectPort="8443" />  

しかし、tomcatの設定記述を確認したところ https://tomcat.apache.org/tomcat-8.5-doc/config/http.html  maxHttpHeaderSize="81920" に設定しただけですが、問題はまだ解決していないようで、同じ例外がまだ発生します。

しかし、この2つの設定: maxSpareThreads="75" は、tomcat を起動するときに次のような警告を表示します。

10-Sep-2019 11:38:15.659 warning [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/ Connector} Setting property 'maxSpareThreads' to '75' did not find a matching property.

このmaxHttpHeaderSizeの設定については、もっと強力な神がいて、ソースコードを修正し、理解度を読み取ることができるので、試すことができますが、とにかく、私は小さな新人なので、力はありませんと言いました。

2は、また、不正な文字の理由に設計を言う方法があります、翻訳されたHTTPリクエストヘッダを解析するエラーは、よくリクエストヘッダーエラーです

以下の参考文献をご覧ください。 https://www.jianshu.com/p/83735dc80603?spm=a2c6h.13066369.0.0.44c05da9lfSEG7

まず最初に: tomcatのバージョンを下げることは推奨されません。耳を塞ぐことに等しく、間違いなく損失はありません。
  Tomcatはバージョン7.0.73, 8.0.39, 8.5.7以降、httpの解析に大きな制限を受けています。
  RFC3986の文書では、要求されたUrlは英字(a-zA-Z)、数字(0-9)、-_. ~4の特殊文字、およびすべての予約文字です。

解決方法 conf/catalina.propertiesの末尾に2行追加してください。

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

<イグ

 残念ながら  requestTargetAllow  は|{}しか設定できず、それ以外(例えば " < > [ \ ] ^ ` { } ...)はリクエストが遮断されたままなので、|{}以外の文字が使われた場合はどうすればいいのか?となると、やはり以下のような設定が必要です。

relaxedPathChars="[\]^`{|}" relaxedQueryChars="[\]^`{|}"

<イグ

 ただ、このメモを追加した後、起動時に以下のような警告が出るのですが、今のところ理由はわかりませんし、私のURLにはこれらの特殊記号は入っていないので、削除しただけですので、もし入っていたら試してみてください。

10-Sep-2019 11:38:15.663 warning [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/ Connector} Setting property 'relaxedPathChars' to '[\]^`{|}' did not find a matching property.
10-Sep-2019 11:38:15.663 Warning [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/ Connector} Setting property 'relaxedQueryChars' to '[\]^`{|}' did not find a matching property.

3. httpsの問題だからhttpに変えれば大丈夫という魔法のような解決策がある。

4. 接続プロトコルを変更する

4.1 HTTP1.1 を org.apache.coyote.http11.Http11NioProtocol に変更すると、tomcat 起動時に "address used" というエラーが大量に発生して、わかりにくいが頭が痛くなる

   Linuxのビューイングポートについては、こちらで少しご紹介しています。 Linuxでポートの占有を見るには  lsof  と  ネットスタット  コマンド .

  (1) lsofの使用法。

  lsof -i:port number

<イグ

   (2) netstatの使用状況。

netstat -tunlp | grep port number

netstatコマンドの個々のパラメータについて、以下に説明します。

-a: ソケットプログラムを含む、すべてのネットワーク状態を一覧表示します。
-c seconds: ネットワークの状態を数秒ごとに更新するように指定します。
-n:ドメイン名やサービス名ではなく、IPアドレスとポート番号で表示します。
-p: PID とプログラム名を表示します。
-t:TCPプロトコルポートを使用した接続の状態を表示します。
-u: UDP プロトコルポートを使用した接続のステータスを表示します。
-I: リスニング状態の接続のみを表示します。
-r: ルーティングテーブルを表示します。
これは、現在のサーバー上のすべてのポートとプロセスサービスを表示し、特定のポートおよびサービスの状態を見るためにgrepと組み合わせることができます - 。

(3) プロセスの停止

kill -9 PID 

4.2 HTTP1.1 を protocol="org.apache.coyote.http11.Http11Protocol" に変更し、起動時にこの書き込みは古いので、以前のプロトコルを使用するようにとのプロンプトが表示されるようにしました。

10-Sep-2019 14:55:12.963 warning [main] org.apache.coyote.http11.Http11Protocol.<init> The HTTP BIO connector has been removed in Tomcat 8.5.x The HTTP BIO connector configuration has been automatically switched to use the HTTP NIO connector instead.

 5. tomcat の server.xml で、リスナーを削除してください。

 赤で示したものをコメントアウトして、プロジェクトを再起動します(実験していません)

<スパン 6. tomcatのバージョンを下げる。バージョン7.0.73, 8.0.39, 8.5.7以降、httpヘッダーの検証を追加したためです。

tomcat 7.0.69のダウンロードリンク

2019年9月16日追記:この例外を除いてバージョン変更から1週間近く経っています。

2019年9月24日追記:すべて順調です、この方法はうまくいきます