PlantUML Serverをセットアップする

# PlantUML Serverをセットアップする

PlantUML Serverをローカル環境で使用可能にする方法を記載します。
PlantUMLについての説明はしないので[公式サイト][plantuml]を読むかググっていただきたい。
もちろん[このQiitaにもタグがある][qiita-tags-plantuml]ので活用事例はそちらからどうぞ。

## 対象読者

- PlantUML Serverが必要な人 [^1]
- **悪いインターネット**[^2] に繋がってるものは業務で使えない人 [^1]
- 公式サイトの説明だと手順がよく分からなかった人 [^3] [^4] [^1]


:::note info
2021-09-05 追記
キャッシュ付きのPlantUMLサーバーが欲しいだけの人向けにGitHubにてDocker Composeの構築例を公開しています。
https://github.com/felis392/compose-plantuml
:::

## おことわり

この記事は嘘は書いていませんが間違っている可能性はあります。
執筆時点の`2019-05-26`では通用しますが、将来もずっと通用するかはわかりません。

## 環境

記事の例で使っているOSは`Windows 10 Home`の64bit版です。[^5]
`Pro` や `Server 201X`でも大体同じはずですが、32bit版の事は知りません。

ちなみにインストールするマシン自体はインターネットに繋がってなくても大丈夫です。
（イントラ経由で転送したり、外部メディアで運んだりする手間は掛かる）

## ダウンロードが必要なもの

以下のものが要ります。
ダウンロード手順までは細かく説明しないのであしからず。
もちろん「もう持ってる」なら新たに落としなおす必要はありません。

- [Graphviz]
    - PlantUMLの動作に必要。
    - テキストからグラフを描画するソフト。
    - [Windows用のインストーラー][graphviz-download] がある。
- Java実行環境
    - PlantUMLの動作に必要。
    - JDKでもJREでも可。
    - 今回は[JDK12][java-jdk-12]を使う。
- Javaアプリケーションサーバー
    - PlantUML Serverの動作に必要。
    - `.war`ファイルをデプロイ可能なサーバー。
    - 今回は[Tomcat9][tomcat-9]を使う。
- PlantUML Serverのサーバープログラム
    - Javaサーブレットとして提供されている [plantuml.war] のこと。
- （オプション）[JLatexMath]のjarファイル
    - PlantUMLで`JLatexMath`の構文を使うのに必要。 [^6]
    - 使うなら [PlantUMLサイトからダウンロード][JLatexMath-download] する。
- （オプション）Apache HTTPサーバー [^7]
    - `http://XXXXX:80/plantuml`でアクセスできるようにするのに必要。
    - サーバーキャッシュ機能を使えば一度生成した画像はキャッシュから拾えるようになる。

## インストール手順

### 1.「Graphviz」のインストール

1. ダウンロードした`graphviz-2.38.msi`を実行し画面の指示に従って操作を進めてインストールを行う。

デフォルトでは`C:\Program Files (x86)\Graphviz2.38`にファイルが展開されます。
**PlantUML Serverを動作させるだけなら**これでOKですが、インストーラのくせにPATHを通してくれない不具合があるようなので単独で使う場合は`bin`フォルダにPATHを通してください。
PATHが通っていればコマンドプロンプトで以下の様に表示されます。

```shell-session
> dot -V
dot - graphviz version 2.38.0 (20140413.2041)
```

### 2.「Java実行環境」のインストール

1. ダウンロードした`openjdk-12.0.1_windows-x64_bin.zip`を展開する。
2. 中の`jdk-12.0.1`フォルダを適当な場所に配置する。
3. 環境変数`JAVA_HOME`の値にそのフォルダへのフルパスをセットする。
4. 環境変数PATHの末尾に`%JAVA_HOME%\bin`を追加する。

PATHが通っていればコマンドプロンプトで以下の様に表示されます。

```shell-session
> java -verion
openjdk version "12.0.1" 2019-04-16
OpenJDK Runtime Environment (build 12.0.1+12)
OpenJDK 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)
```

### 3.「Javaアプリケーションサーバー」（Tomcat）のインストール

1. ダウンロードした`apache-tomcat-9.0.20.exe`を実行し、画面の指示に従って操作を進めてインストールを行う。
    1. Install type は Minimum を選択する。
    2. 使用するポート番号は特に理由がなければデフォルトのまま（8080）にする。
    3. JREの場所を聞かれるので、「Java実行環境」をインストールしたフォルダを選択する。
    4. Tomcatをインストールするフォルダは`C:\Apache Tomcat 9.0`など分かりやすい場所を入力する。
2. インストールが完了したらアプリケーションサーバーを起動します。

Webブラウザから http://localhost:8080 にアクセスすると以下の様に表示されます。

![ss-tomcat.png]

### 4.「PlantUML Server」のインストール

#### 4.1. （オプション）「JLataxMath」のライブラリの配備

JLatexMathを使用する場合は外部JARファイルをTomcatにロードさせる必要があります。

1. ダウンロードした`plantuml-jlatexmath.zip`を展開し、JARファイルを取り出す。
    - batik-all-1.7.jar
    - jlatexmath-minimal-1.0.3.jar
    - jlm_cyrillic.jar
    - jlm_greek.jar
2. Tomcatをインストールしたフォルダ（`catalina.home`という）の下に`sharedLib`というフォルダを作成する。
3. 作成したフォルダに上記のJARファイルを配置する。
4. `{catalina.home}\conf`にある設定ファイル`catalina.properties`をテキストエディタで開く。
    - 以下の様に編集してコモンローダーのスキャン対象に上記のJARファイルが含まれるようにする。
5. Tomcatを再起動する。

```properties:catalina.properties(抜粋)
#common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar","${catalina.home}/sharedLib","${catalina.home}/sharedLib/*.jar"
```

#### 4.2. 「plantuml.war」の配備

1. Tomcatをインストールしたフォルダ（`catalina.home`という）の下にある`webapps`フォルダを開く。
2. このフォルダにダウンロードした`plantuml.war`を配置する。
3. しばらく待つとTomcatのオートロード機能によって`plantuml`というフォルダに展開される。

Webブラウザから http://localhost:8080/plantuml にアクセスすると以下の様に表示されます。

![ss-plantumlserver.png]

:smile:お疲れ様でした。

…と言いたいところですが、ここまでやったならもう一仕事しましょう。

### 5. （オプション）「Apache HTTPサーバー」のインストール

#### 5.1. 「Apache HTTPサーバー」のインストール

1. ダウンロードした`httpd-2.4.39-o111b-x64-vc15.zip`を展開し、`Apache24`フォルダを取り出す。
2. Apache24フォルダをCドライブ直下（`C:\Apache24`）など分かりやすい場所に配置する。
3. コマンドプロンプトを起動し、以下のコマンドを実行してWindowsのサービスに登録する。
4. 登録したサービスを開始…は**まだしない**。

```shell-session
> cd c:/apache24/bin
> httpd -k install -n "Apache24"
```

なお、サービスを開始している場合は http://localhost にアクセスすると以下の様に表示されます。

![ss-apache24.png]

#### 5.2. ProxyPassとCacheの設定

1. Apache HTTPサーバーをインストールしたフォルダの`conf`フォルダにある設定ファイル`httpd.conf`をテキストエディタで開く。
2. 下記の様に編集する、
    1. 必要なモジュールがロードされるようにする。（コメント行になっているので行頭のハッシュを外す）
    2. 80番ポートでPlantUML Serverにアクセスできるようにする。
    3. PNGファイルとSVGファイルのサーバーキャッシュを有効にする。
3. 登録したサービスを開始し、Apache HTTPサーバーを起動する。

```conf:httpd.conf(抜粋)
LoadModule cache_module modules/mod_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so
LoadModule expires_module modules/mod_expires.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
```

```conf:httpd.conf(抜粋)
<IfModule mod_proxy.c>
    ProxyRequests Off
    <Location /plantuml>
        Require all denied
    </Location>
    <LocationMatch "/plantuml/(png|svg)/">
        Require all granted
    </LocationMatch>

    # PlantUML Serverへのプロキシ定義
    # {XXX.XXX.XXX}は利用者から見えるドメイン名かIPアドレス（localhostは不可）
    ProxyPass         /plantuml   http://{XXX.XXX.XXX}:8080/plantuml
    ProxyPassReverse  /plantuml   http://{XXX.XXX.XXX}:8080/plantuml
</IfModule>
```

```conf:httpd.conf(抜粋)
<IfModule mod_cache.c>
  <IfModule mod_cache_disk.c>
    # {apache_cache}はキャッシュファイルを格納する任意のフォルダ
    CacheRoot C:\{apache_cache}
    CacheEnable disk /
  </IfModule>
  CacheIgnoreCacheControl On
  CacheIgnoreNoLastMod On
  CacheDefaultExpire 86400
  CacheMaxExpire 2592000
</IfModule>

<ifModule mod_expires.c>
  ExpiresActive On
  # 既定値（キャッシュ無効）
  ExpiresDefault "access plus 0 seconds"
  # 画像（pngとsvgは1か月キャッシュする）
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType image/svg+xml "access plus 1 month"
</ifModule>
```

ここまで設定できていれば [http://localhost/plantuml/svg/ENCODE][localhost-svg-image] にアクセスして、キャッシュが有効な状態のSVG画像を取得できるようになっているはずです。

![ss-svgimage.png]

:grin:お疲れ様でした。

## 謝辞

キャッシュ設定については [RitoLaboのこちらのエントリ](https://www.ritolab.com/entry/4) を勝手に参考にさせていただきました。

[^1]: 私だ。（It's me.）
[^2]: **社外サーバー** や **httpプロトコルで公開されている外部Webサイト**の事である。グーグルに聞くと教えてくれる [悪いインターネット] の方ではない。
[^3]: 全体的に「みんな知ってるね」感のある書き方なので分からない人は多いかと思う。
[^4]: `Salt`を[塩]と訳すくらい丸出しの機械翻訳なので英語ページはもちろん日本語ページでもつらあじ。
[^5]: Windows以外のOSを使ってる人なら自分の使ってるOSに依存する部分については適切に判断できるよね。
[^6]: UML内で使うか？っていうと正直使わないと思う。各種のWiki-likeサイトで使うなら他のLaTexプラグインもあるし。
[^7]: Tomcatをピンで使うなら別になくても困らないが、複数人でガンガン使うなら併用を推奨する。

[graphviz]: https://www.graphviz.org/
[graphviz-download]: https://graphviz.gitlab.io/_pages/Download/Download_windows.html
[plantuml]: http://plantuml.com/ja/
[plantuml.war]: 
https://sourceforge.net/projects/plantuml/files/plantuml.war/download
[JLatexMath]: https://github.com/opencollab/jlatexmath
[JLatexMath-download]: http://beta.plantuml.net/plantuml-jlatexmath.zip
[塩]: http://plantuml.com/ja/salt
[qiita-tags-plantuml]: https://qiita.com/tags/plantuml
[java-jdk-12]: https://jdk.java.net/12/
[tomcat-9]: https://tomcat.apache.org/download-90.cgi
[悪いインターネット]: https://warui.intaa.net/

[ss-tomcat.png]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83175/22446b81-1ef3-c92d-5b5e-2f6d27632fbe.png
[ss-plantumlserver.png]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83175/052de21f-7738-0238-c350-9c838fb1edad.png
[ss-apache24.png]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83175/99b0b6e5-c3e2-ed01-20da-451ba1f6f0ab.png
[ss-svgimage.png]: https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83175/a1cf5bd6-d6d7-6384-a873-71c952086df2.png
[localhost-svg-image]: http://localhost/plantuml/svg/JOwn3eCW68Htdk8V8SIWjfEbFaE7ZaQY0Gi9GgCCMEkxjzIcwNZVbxjSnSSkwDgu8FAs670aCdBsOITKxJAs9Lr4GH-YADl3yQUT3mecSzC1NQS5EZjxj3Saap5jdQqP1TPPdHFypbIJB672z7S4STi55UiBNfvD8lsmner0C_O-hk0ds630VuOswZuRwnrdUnCf9o4zUG40