Skip to main content

プロダクション環境でのJHipsterの使用

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

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

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

プロダクションビルドのテスト

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

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

./mvnw -Pprod

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

./gradlew -Pprod

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

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

実行可能なJAR/WARファイルの構築

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アセットは含まれません。

That when building a JAR or WAR file with the prod profile, the generated archive will not include the dev assets.

:::

Gradleを使用

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

./gradlew -Pprod clean bootJar

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

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

./gradlew -Pprod -Pwar clean bootWar

プロダクション環境での実行

アプリケーションサーバーを使用しない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コンテナでのアプリケーションの実行

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

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

サービスとして実行

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サービスが含まれています。

パフォーマンスの最適化

キャッシュのチューニング

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

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

以下をお読みください。

HTTP/2のサポート

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

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

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

GZip圧縮

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

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

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

キャッシュ・ヘッダー

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

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プロファイルでアプリケーションを実行するときに提供されます。

セキュリティ

デフォルトのユーザーおよび管理者アカウントの保護

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

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

HTTPSサポート

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

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設定

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を追加

カスタムコンテキストパス

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の調整などの変更が必要になる場合があります。

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

モニタリング

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

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

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