1. ホーム
  2. nginx

Nginx+tomcatでhttps化した後に400 Bad Requestが発生する問題

2022-02-21 07:36:35

会社のソフトウェア製品は二次元コードに基づいているため、あなたはWeChatを使用してコードをスキャンしてOPENIDフォームを取得し、ビジネスを開始する必要があり、その後パパTXは12月末前にすべてのhttpプロトコルページにアクセスできなくなります通知を発行したので、ワイルドカードSSL証明書の非情な購入、ここで簡単に説明しますnginx + tomcat構成httpsプロセスとは、問題が発生しました。

システム環境 セントス6.8

ソフトウェアバージョン:nginx (1.12.1) tomcat (7.0.78)

nginxとtomcatのインストールはここでは割愛させていただきますので、さっそく本題に入りましょう。

三流運用保守と言われる私にとっては、httpsの設定も初めてなので、いろいろと落とし穴があり、数日かけて自分で情報を確認し、プロジェクトの本番環境を整えました


この会社のプロジェクトは一般的にバックエンドとWAPサイドで構成されており、通常は2つのtomcatを使って別々にデプロイしますが、ユーザー数が少ないプロジェクトでは1つのtomcat内にデプロイすることもあります。

nginxのSSL設定は以下の通りです。

## メインプロジェクトの設定

サーバー <未定義
    は443をリッスンします。
    sslをオンにします。
    サーバー名 test-2.****.com;
    ルート /www/html;
    index index.html index.htm;
    ssl_certificate /etc/nginx/cert/214334620590810.pem;
    ssl_certificate_key /etc/nginx/cert/214334620590810.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4.AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2。
    ssl_prefer_server_ciphers をオンにします。
    は、/etc/nginx/default.d/*.confをインクルードします。
    場所 / { <未定義
    proxy_pass http://127.0.0.1:8083;
            proxy_redirectをオフにする。
            proxy_set_header ホスト $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}.
}
##http 強制的にhttpsへジャンプ
サーバ { <未定義
      は80を聴く。
      サーバー名 test-2.****.com;
      return 301 https://$server_name$request_uri;
}


この部分の設定は基本的にこれで、sslの部分はアリユンの設定ドキュメントを直接参照し(証明書はアリユンで直接購入しているので、サーバーも何もかもアリユンのもの)、強制ジャンプはその後に行います。

tomcatの設定は非常に間抜けです!

tomcat6 のデプロイメントを使用している古いプロジェクトがたくさんありますが、以前の開発者のほとんどが退職してしまったため、tomcat7 以上のデプロイメントに切り替えるとエラーが報告されます。  

もちろんhttpsの設定もうまくいかなかったので、tomcat7の設定について本題を説明します。

(注意!この設定はtomcat 6には適用されません!)

tomcatの設定ファイルserver.confの変更についてWebで情報を調べ、開発者のアドバイスを聞きながら変更した結果 修正後 以下のように読み取れます。

......

    <Connector port="8095" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443"
               proxyPort="443"
               URIEncoding="UTF-8" />

......

            <Valve className="org.apache.catalina.valves.RemoteIpValve"  
                   remoteIpHeader="x-forwarded-for"  
                   remoteIpProxiesHeader="x-forwarded-by"  
                   protocolHeader="x-forwarded-proto" />

......

修正後の tomcat と nginx の再起動は問題なく、プロジェクトを分けて展開した tomcat も元のドメインにアクセスすると正常に https に飛びますが、問題は tomcat が 2 つのプロジェクトを展開した場合、アクセスすると 400 Bad Request というエラーが発生することです!    

例えば、元のアクセス test.***.com/manage は正常にアクセスできますが、https の設定後、ブラウザが直接 test.***.com/manage ドメイン名を入力すると自動的に http://test.haha.com:443/manage/ になり、400 Bad Request と表示されます。もっとすごいのは test.***.com/manage/ (最後にスラッシュがある!)と入力しても正常に https にジャンプできる場合ですが、私は不可解です〜。


私は初心者なので、nginxの設定の問題が疑われているので、回り道の多くは、研究nginxの設定の一日後にうっかりtomcat server.conf元の設定とないproxyPort = "443" この行、tomcatを再起動後にこの行を削除しようとする心理を持って、問題は解決されます〜。


なぜだか、よくわからないけど。