プロダクション環境でのJHipsterの使用 パーマリンク to " プロダクション環境でのJHipsterの使用"

JHipsterは、完全にプロダクション環境に対応し、最適化され、セキュリティで保護されたアプリケーションを生成します。このセクションでは、より重要なオプションについて説明します。急いでいる場合は、通常のプロダクションビルドを実行しますが、セキュリティのセクションを読むことを忘れないでください!

  1. プロダクションパッケージのビルド
  2. プロダクション環境で実行
  3. パフォーマンスの最適化
  4. セキュリティ
  5. モニタリング

プロダクションパッケージのビルド パーマリンク to "プロダクションパッケージのビルド"

プロダクションビルドのテスト パーマリンク to "プロダクションビルドのテスト"

これにより、実際のパッケージを構築することなく、Mavenからのプロダクションビルドをテストできます。

JHipsterを「プロダクション」モードで使用するには、事前に設定されたprodプロファイルを使用します。Mavenでは、次を実行してください。

./mvnw -Pprod

Gradleを使用する場合は、次のコマンドを実行してください。

./gradlew -Pprod

このプロファイルは、すべてのプロダクション設定でアプリケーションをコンパイル、テスト、およびパッケージ化します。

使用可能なプロファイルの詳細については、「開発/プロダクションプロファイル」というタイトルのセクションを参照してください。

実行可能なJAR/WARファイルの構築 パーマリンク to "実行可能なJAR/WARファイルの構築"

Mavenを使用 パーマリンク to "Mavenを使用"

  • アプリケーションを「プロダクション」JARとしてパッケージ化するには、次のように入力してください。

    ./mvnw -Pprod clean verify

    これにより、ファイルtarget/jhipster-0.0.1-SNAPSHOT.jarが生成されます(アプリケーションが”jhipster”という名前の場合)。

  • アプリケーションを「プロダクション」WARとしてパッケージ化するには、次の手順を実行します。

    • 次のようにpom.xmlを変更して、アプリケーションのパッケージをwarに変更します。
      -    <packaging>jar</packaging>
      +    <packaging>war</packaging>
    
    • pom.xmlを変更して、spring-boot-starter-undertow依存関係のスコープをprovidedに変更します。
          <id>prod</id>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-undertow</artifactId>
      +           <scope>provided</scope>
              </dependency>
          </dependencies>
    
    • 元のwarに沿って実行可能ファイルwarを生成するには、次のコマンドを入力します。
      ./mvnw -Pprod clean verify
    
    • これにより、次のファイルが生成されます(アプリケーションが”jhipster”と言う名前の場合)。

      • target/jhipster-0.0.1-SNAPSHOT.war
      • target/jhipster-0.0.1-SNAPSHOT.war.original

注意prodプロファイルでJARまたはWARファイルを構築する場合、生成されるアーカイブにはdevアセットは含まれません。

Gradleを使用 パーマリンク to "Gradleを使用"

アプリケーションを「プロダクション」JARとしてパッケージ化するには、次のように入力します。

./gradlew -Pprod clean bootJar

これにより、ファイルbuild/libs/jhipster-0.0.1-SNAPSHOT.jarが生成されます(アプリケーションが”jhipster”という名前の場合)。

アプリケーションを「プロダクション」WARとしてパッケージ化するには、次のように入力します。

./gradlew -Pprod -Pwar clean bootWar

プロダクション環境での実行 パーマリンク to "プロダクション環境での実行"

アプリケーションサーバーを使用しないJARファイルの実行 パーマリンク to "アプリケーションサーバーを使用しないJARファイルの実行"

多くの人は、アプリケーション・サーバーにデプロイする代わりに、単一の実行可能なJARファイルを持つ方が簡単だと考えています。

前の手順で生成したJARファイルを「プロダクション」モードで実行するには、次のように入力します(Mac OS XまたはLinuxの場合)。

./jhipster-0.0.1-SNAPSHOT.jar

Windowsの場合は、次のコマンドを使用します。

java -jar jhipster-0.0.1-SNAPSHOT.jar

注意このJARファイルは、ビルド時に選択したプロファイルを使用します。前のセクションでprodファイルを使用してビルドされたため、prodプロファイルで実行されます。

Dockerコンテナでのアプリケーションの実行 パーマリンク to "Dockerコンテナでのアプリケーションの実行"

JHipsterは、Dockerに対する第一級のサポートを提供しています。実行可能なJARファイルをDockerイメージにバンドルして、Docker内で実行します。

Dockerを使ってアプリケーションをパッケージ化する方法については、Docker Composeドキュメントを参照してください。

サービスとして実行 パーマリンク to "サービスとして実行"

JarをLinuxサービスとして実行もできます。パッケージ化する前にpom.xmlファイルで強制できます。そのためには、spring-boot-maven-pluginプラグインの<configuration>内に次のプロパティを追加します。

<embeddedLaunchScriptProperties>
    <mode>service</mode>
</embeddedLaunchScriptProperties>

次に、init.dを以下のように設定します。

ln -s jhipster-0.0.1-SNAPSHOT.jar /etc/init.d/jhipster

次の方法でアプリケーションを保護します。

chown jhuser:jhuser jhipster-0.0.1-SNAPSHOT.jar sudo chattr +i your-app.jar

jhuserがアプリケーションを実行するrootではないOSアカウントであるとすると、アプリケーションは次のように実行できます。

service jhipster start|stop|restart

Spring Bootドキュメントには他にも多くのオプションがあり、より多くのセキュリティ手順やWindowsサービスが含まれています。

パフォーマンスの最適化 パーマリンク to "パフォーマンスの最適化"

キャッシュのチューニング パーマリンク to "キャッシュのチューニング"

アプリケーションの生成時にキャッシュプロバイダを選択した場合は、JHipsterによって自動的に設定されています。

ただし、デフォルトのキャッシュ値は、スペックが低めのハードウェアでもアプリケーションが実行できるように、かなり低い値になっています。これらの値は、アプリケーション固有のビジネス要件に応じて調整する必要があります。

以下をお読みください。

HTTP/2のサポート パーマリンク to "HTTP/2のサポート"

JHipsterは、application-prod.ymlファイルで設定されているjhipster.http.versionプロパティを使用してHTTP/2をサポートします。

HTTP/2を有効にするには、次の手順を実行する必要があります。

  • jhipster.http.version: V_2_0を設定します。
  • ブラウザがHTTP/2でHTTPSを使用するように強制するため、HTTPSを設定します(このドキュメントのセキュリティセクションを参照)。

GZip圧縮 パーマリンク to "GZip圧縮"

prodプロファイルを使用する実行可能なJARファイル内で、JHipsterはWebリソースにGZip圧縮を設定します。

デフォルトでは、圧縮はすべての静的リソース(HTML、CSS、JavaScript)およびすべてのRESTリクエストに対して機能します。この設定の詳細については、application-prod.ymlファイルで設定されているSpring Bootアプリケーションプロパティのserver.compression.*キーを参照してください。

注意 GZip圧縮はアプリケーション・サーバーによって行われるため、このセクションは前述の「実行可能JAR」オプションを使用する場合にのみ適用されます。外部アプリケーション・サーバーでアプリケーションを実行する場合は、アプリケーションを個別に構成する必要があります。

キャッシュ・ヘッダー パーマリンク to "キャッシュ・ヘッダー"

prodプロファイルを使用して、JHipsterは、静的リソース(JavaScript、CSS、フォントなど)に特定のHTTPキャッシュヘッダーを配置するサーブレットフィルタを設定し、それらがブラウザとプロキシによってキャッシュされるようにします。

Webpackを使用した最適化されたJavaScriptアプリケーションの生成 パーマリンク to "Webpackを使用した最適化されたJavaScriptアプリケーションの生成"

このステップは、prodプロファイルを使用してプロジェクトを構築するときに自動的にトリガーされます。Mavenビルドを起動せずに実行する場合は、次のコマンドを実行してください。

npm run build

これは、Webpackを使用してすべての静的リソース(CSS, TypeScript, HTML, JavaScript, 画像など)を処理し、最適化されたクライアント側アプリケーションを生成します。

このプロセスの間、WebpackはTypeScriptコードをJavaScriptコードにコンパイルし、ソースマップも生成するため、クライアントサイドアプリケーションをデバッグできます。

これらの最適化されたアセットは、Mavenの場合はtarget/classes/staticで、Gradleの場合はbuild/resources/main/staticで生成され、最終的なプロダクションJARに含まれます。

このコードは、prodプロファイルでアプリケーションを実行するときに提供されます。

セキュリティ パーマリンク to "セキュリティ"

デフォルトのユーザーおよび管理者アカウントの保護 パーマリンク to "デフォルトのユーザーおよび管理者アカウントの保護"

JHipsterには、いくつかのデフォルト・ユーザーが生成されています。本番環境では、これらのデフォルト・パスワードを変更する必要があります。

これらのパスワードを変更し、アプリケーションをセキュリティで保護する方法については、セキュリティドキュメントに従ってください。

HTTPSサポート パーマリンク to "HTTPSサポート"

HTTPSは、JHipsterアプリケーションで直接設定することも、特定のフロントエンドプロキシを使用して設定することもできます。

JHipsterでのHTTPS設定 パーマリンク to "JHipsterでのHTTPS設定"

HTTPSは、application-prod.ymlファイル内のSpring Securityの標準のserver.ssl設定キーを使用して設定されます。

SSLを有効にするには、次のコマンドを使用して証明書を生成します。

keytool -genkey -alias <your-application> -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650

また、このチュートリアルによるLet’s Encryptの使用もできます。

次に、application-prod.ymlの設定が次のようになるように、server.sslプロパティを変更します。

server:
    port: 443
    ssl:
        key-store: keystore.p12
        key-store-password: <your-password>
        keyStoreType: PKCS12
        keyAlias: <your-application>
        ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
        enabled-protocols: TLSv1.2

暗号スイートは、いくつかの古くて非推奨のSSL暗号を無効にすることによってセキュリティを強化します。このリストは、SSL Labsにあります。

server.ssl.ciphersプロパティが有効になると、JHipsterはこのプロパティjhipster.http.useUndertowUserCipherSuitesOrder(デフォルトではtrue)を使用してUndertowでの順序を強制します。

enabled-protocolsは、古いSSLプロトコルを無効にします。

次に、前方秘匿性を実現するための最後の仕上げを行います。JVM起動時に次のフラグを追加します。

-Djdk.tls.ephemeralDHKeySize=2048

設定をテストするには、SSL Labsにアクセスしてください。

全てOKならA+が取得できます。

フロントエンドプロキシを使用したHTTPS設定 パーマリンク to "フロントエンドプロキシを使用したHTTPS設定"

JHipsterアプリケーションの前にフロントエンドHTTPSプロキシを設定するためのソリューションは数多くあります。

最も一般的な解決策の1つは、Apache HTTPサーバを使用することです。Let’s Encryptを使用して設定できます。

  • ApacheとLet’s Encryptインストール:apt-get install-y apache2 python-certbot-apache
  • Let’s Encryptの設定:certbot --apache -d <your-domain.com> --agree-tos -m <your-email> --redirect
  • SSL証明書の自動更新を設定:crontablに10 3 * * * /usr/bin/certbot renew --quietを追加

カスタムコンテキストパス パーマリンク to "カスタムコンテキストパス"

server.servlet.context-pathパラメータと値を渡すことで、Spring Bootバックエンドのコンテキストパスを指定できます。

java -jar jhipster.jar --server.servlet.context-path=/jhipster/

または、この設定をapplication.ymlに追加することもできます。

---
server:
  servlet:
    context-path: /jhipster/

フロントエンドバンドラの場合、コンテキストパスはビルド時の設定となります。

Angular フロントエンドは以下を使用して設定できます。

  • angular.json: projects -> * プロジェクト名 -> architect -> build -> options -> baseHref : '/jhipster/'
  • ng build --base-href '/jhipster/'
  • APP_BASE_HREFを使用してください。

Webpack-based フロントエンドは以下を使用して設定できます。

  • Webpackの設定ファイル
    new HtmlWebpackPlugin({
      ...
      base: '/jhipster/'
    })
    

その他にも、開発サーバーの設定やswagger-uiのようなページでのiframeの調整などの変更が必要になる場合があります。

注意 ./のような相対ベースパスを使用することは可能ですが、それと互換性を持つように他の設定を調整する必要があります。

モニタリング パーマリンク to "モニタリング"

JHipsterは、Micrometerによる完全なモニタリングサポートを備えています。

開発環境では、MetricsデータはJMX経由で利用可能であり、JConsoleを起動するとアクセスできます。

プロダクション環境では、アプリケーションがエンドポイント上のメトリックデータを公開することで、Prometheusサーバが、設定に応じて定期的にスクレイピングできます。