見出し画像

Raspberry PiにApache-Tomcatを入れてローカルサーバーをたてる

IT企業に入社して、今後Linuxを使う機会が増えるそう。そこで、実家にあったRaspberry Piを使い、Apache-TomcatをインストールしてTomcatで動くアプリのデプロイ(ローカルネットワーク)方法について学びました。
いくつか躓いたポイントがあったのと、+忘備録的意味も込めてnoteを書こうと思います。

前提(マシン)
スペック①サーバー本体
Raspberry Pi 4 Model B ;Raspbian Debian version: 11 (bullseye)
スペック②SSH接続用PC
Microsoft Surface; Windows 10(tera term使用)
前提(環境)
・すでにWindowsでTomcatで動作するアプリを開発し終えた状態
・Linuxに関する経験・SSH接続等はawsの勉強で少し触った程度

主に参考にしたサイト
いろんなサイトを見ましたが、どのサイトも違う方法を伝授してくれるので、逆に何を参考に環境構築すればよいのかわからなくなってしまいました。特にTomcatをapt-getするのか否か、/usr/localにインストールするか/opt/tomcat/にインストールするか否か、等、初心者には方法が多すぎて、情報を飲み込むのに精いっぱい。
何度も失敗しましたが、最終的には次のサイトが最も参考になりました:

ここからは、↑このサイトを参考にして環境構築を行った際に躓いたポイントを4つ挙げていこうと思います。

①環境構築で最初に躓いたポイント:使用するApache-Tomcatのイメージ選択

/opt/tomcat以下にapache-tomcatのシステムを入れていくのですが、ここでbinフォルダが展開されるときとされない時があり、最初は何度もtomcatを入れたり消したりしていたのが悪かったと思ってたのですが(よく分からなくなってOSのリセットも試した…)、実際は選択したイメージに癖があったようです。

上のサイトからTomcatのバージョンを選択するのですが、本来であればapache-tomcat-(バージョン).tar.gzをDLしなければいけないところを、名前が似ているapache-tomcat-(バージョン)-deployer.tar.gzを保存していたみたいでした。後者で手順を進めると、想定される内容とは違うものがインストールされるようです(用途や違いまでは調べなかった)。

②手順サイトの内容を鵜吞みにしているとtomcat起動時にエラー

/etc/systemd/system/tomcat.service
という場所にsystemdファイルを作成するのですが、上で紹介したサイトの内容そのままをコピペするとtomcatが起動してくれませんでした。
書き込む内容としては

[Unit]
Description=Tomcat webs servlet container
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
RestartSec=10
Restart=always
Environment="JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target

ですが、この10行目がひっかけで、JAVA_HOMEの宛先がユーザーによって変わるみたいです(これはちゃんと記事を読めば分かった…)。
その確認方法として紹介されていたのが、次のコマンド:

sudo update-java-alternatives -l

です。私の場合、

java-1.11.0-openjdk-armhf  1111  /usr/lib/jvm/java-1.11.0-openjdk-arm

という答えが返ってきたので、tomcat.serviceファイルのJAVA_HOMEの宛先は次のように書き換えてあげる必要がありました:

Environment="JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amdhf"

この問題の解決策を考えるために参考になったサイト:

③WARファイルの配備(というよりWARファイル生成に問題があった)

上で紹介したサイトの手順を参考にして何とかサーバーが立ち、<local IP address>:8080にアクセスすることで、同一Wifiルーターに接続されたスマホ・PCからTomcatの初期画面を見られるようになりました。
次に問題になったのが、開発済みのアプリのデプロイです。

事前準備として、Windows環境内のEclipseでTomcatプロジェクトを作成していました。localhos:8080からアプリを開発・実行し、WARファイルの作成もEclipseから行うつもりで、実際に最初はEclipseでWARファイルをExportしてました。そのWARファイルを、TeraTermでラズパイ/opt/tomcat/webapps内にコピーすることで展開していたのですが、どうもアプリがブラウザで表示されません。

WARファイルをwebapps以下に設置したあと、(Tomcat開始後にWARファイルが自動解凍・配備される設定であることは確認済み)<ラズパイのローカルIP>:8080/managerから、起動中のアプリを見ると、一応アプリ名のパスが通っており、実行中 = true表示になっていたのですが、どうも設定していたはずのウェルカムページが表示されませんでした。(下図の画面でパスが通っているのを確認した。スクショでは今回入れたアプリの情報は見切れています…)

/managerの下に、自分で配備した(はず)のアプリも載ってます。見切れててすみません…。

そこで/opt/tomcat/webapps/<自作アプリ名>以下をlsコマンドで覗くと、
<自作アプリ名>
  └WEB-INF
  └META-INF
の構造になっていて、知っているはずの.jspファイルやservletが存在しませんでした….。

この時、ウェルカムページが表示されない原因としてコンテキストのパスが通っていない等の仮説を立てたりもしましたが、webapps下、自作アプリのフォルダ直下に簡単なindex.htmlを生成すると、ブラウザからウェルカムページを見ることができました。ですのでwebappsに配備されたアプリデータの構造に問題があると断定し、Eclipse以外からWARファイルを作成することに。

WARファイルはPowershellのjarコマンド実行でも作成できるとのことだったので、jarコマンド用の環境変数を設定し、無事適切なWARファイルの作成に成功しました。

WARファイルの作成については以下のサイトを参考にしました

④直接WARファイルをwebappsには置かず、tomcatのmanager画面から配備

Powershellで適切なWARファイルが生成できるようになった後は、/opt/tomcat/webappsに直接WARファイルを置かずに、ある動画で見たデプロイの方法を参考にして作業を行いました。

Windows側のChromeから<ラズパイのローカルIP>:8080/managerにアクセスし、画面を下までスクロールすると、WARファイルの[ファイルを選択]ボタン、[配備]ボタンがご丁寧に準備されているのが確認できます。ですので、windowsからはTeraTermを使わずに、ブラウザからWARファイルをデプロイしてみます。

わぁ(WAR)、なんて素敵な機能だこと

配備には時間がかかりますが、無事アプリが設置されるとメッセージで”OK”と表示してくれます。これで無事、Windowsのlocalhostから見ていたものと同じアプリが、ラズパイサーバーを使って見られるようになりました。(終)

メッセージ : OK

この記事が気に入ったらサポートをしてみませんか?