クラウド仮想サーバー

VPSにJavaアプリの開発環境を自動で構築する方法:Apache+Tomcat+PostgreSQL

開発環境を整えるとき、いきなり細かい設定から入ってしまうと、構築の全体像が見えず混乱しがちです。本シリーズでは、5つのパートに分けて順を追って開発環境を構築していきます。

この構成は、構築に必要な順序でステップを並べ(クラウド → Web → AP → DB → 保守)、各パートは独立して読めるようにし、スクリプトによる自動化を前提に操作負担を極力減らす方針に基づいています。ただし、手動で対応すべき設定も明示的に解説します。

構築する環境のイメージ

最終的に以下のような構成になります。

Webサーバ → アプリサーバ → データベース までの流れを想定した構成です。

サーバーは一度作って終わりではなく、構築した後の保守こそが本番です。

CPUやメモリの監視、バックアップ、転送ミスの防止など、運用に耐える仕組みがなければ実用ではありません。

このあと紹介する「保守スクリプト」も合わせて導入することで、ようやく「動くだけじゃない使える開発環境」になります。

構築の基本方針

これらの方針に従うことで、効率的かつ再現性の高いサーバー環境の構築が可能になります。また、トラブルシューティングや将来の拡張にも対応しやすい構成を目指します。

構成要素とざっくりステップ

開発環境の構成要素

  • クラウドサーバー準備編
    実際にどんな手順で開発環境を構築していくのか、各ステップごとにもう少し具体的にクローズアップして見ていきます。
  • Webサーバー構築編
    ApacheでWebの入り口を作る。リクエストの受け口はここで決まる。
  • APサーバー構築編
    Javaアプリを動かす本丸。Tomcatでロジックを受け止める。
  • DBサーバー構築編
    データは生きている。PostgreSQL / MySQL を安全に立ち上げる。
  • 運用保守編
    環境を作っただけでは終わりません。日々の運用を安定させるために必要な保守スクリプトにクローズアップして紹介します。

ざっくりステップ

  • VPSを契約する

  • OS初期設定スクリプトを実行する

  • Apacheをインストールする

  • Apacheの設定を行う

  • Tomcatをインストールする

  • Tomcatの設定を行う

  • ApacheとTomcatを連携させる

  • DBMSをインストールする
  • DBMSの設定を行う
  • Javaアプリを配置して動作確認する

前提となる実行環境

これからサーバーを構築していく中で、それぞれの構成や設定を自動化するために複数のスクリプトを使っていきます。そのスクリプトはすべて、以下のようなディレクトリ構成の中で実行されることを前提にしています。

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • <<各種実行スクリプト>>.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • logger.shrc(共通ログ出力ファイル)
      • utils.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • infraMessage.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

自動処理と手動設定の区別について

この記事では、スクリプトによって自動で実行される部分と、読者自身が手動で設定する必要がある部分を明確に区別して記載しています。

今後の各ステップでは、以下のような表記を使って説明を進めていきます。

自動処理と手動設定の区別

  • ✅ スクリプトで自動的に処理される作業
    この作業はスクリプト内ですべて自動的に実行されます。

  • ⚠️ 読者自身で手動設定が必要な作業
    この設定はスクリプトでは行われません。用途に応じて手動で追加してください。 

クラウドサーバー準備編

サーバーを契約し、初期設定できるようになることが目標です。VPSの選び方からOS選定、SSH接続、基本設定までの判断と操作をナビゲートします。

  • 適切なVPSプロバイダーの選定方法

  • 用途に合ったOSの選び方

  • セキュアなSSH接続の確立

  • サーバーの基本設定と初期化 

このパートでは、開発環境の土台となるクラウドサーバーの準備に焦点を当てます。サーバー契約時の判断基準や、初期設定の重要なポイントを解説し、安全かつ効率的なサーバー環境の基盤を整えます。

STEP1:⚠️ VPSを契約する

まずは VPS を契約します。以下のようなサービスがおすすめです。

用途別おすすめVPS

▶︎ 初心者でも扱いやすく、利便性を重視するなら ConoHa VPS

ConoHa VPS

▶︎ コスパ最優先で安く使いたいなら さくらのVPS

さくら VPS

▶︎ 法人利用や長期的な安定運用を求めるなら Xserver VPS

XServer VPS

[ 参考値 ]

サービス名月額料金(概算)メモリvCPUストレージ
ConoHa VPS(2GBプラン)1,089円2GB3コア100GB(SSD)
さくらのVPS(2GBプラン)968円2GB3コア100GB(SSD)
エックスサーバー VPS(2GBプラン)1,150円2GB3コア50GB(NVMe SSD)

最低スペック:2vCPU / メモリ2GB以上
OSは「RockyLinux 9」または「AlmaLinux 9」推奨です。

STEP2:✅ OS初期設定スクリプトを実行する

初期設定はすべて以下のスクリプトで完了します。

スクリプトの内容

  • ユーザー追加
  • SELinux無効化
  • ファイアウォール設定
  • ロケール / タイムゾーン設定

実行コマンド:

sh init_rhel_devhost.sh

Webサーバー構築編

このパートの目的は、Apacheを立ち上げて外部アクセスを受けられる状態にすることです。Apache導入とSSL設定(Let's Encrypt)をスクリプトで一括対応し、「外に公開できる状態」を整えます。セキュリティを確保しながら、効率的にWebサーバーを構築する方法を解説します。

STEP3:✅ Apacheをインストールする

Apache(httpd)サーバを一括で導入します。Let's Encrypt のSSL証明書取得まで対応しています。

スクリプトを使って一気にWebサーバーの入口を作ると同時に、SSL対応(https)も済ませておきます。無料で使える Let's Encrypt を使って証明書を自動取得します。

実行コマンド:

sh install_apache_host.sh -d example.com -e admin@example.com

このスクリプトでは、SSL証明書を無料で取得するために Let's Encrypt を使っています。Let's Encrypt を使うには、対象のドメイン(-d)と連絡先メールアドレス(-e)が必要になります。

実行引数

  • -d:Webサイトのドメイン名(例:example.com)
  • -e:証明書登録用のメールアドレス(Let's Encrypt用) 

STEP4:✅ Apacheの設定を確認する

ServerName やモジュール設定、証明書ファイルの配置もすべてスクリプト内で自動で行われます。

必要に応じて以下のファイルで確認可能:

  • /etc/httpd/conf/httpd.conf

  • /etc/letsencrypt/live/example.com/

APサーバー構築編

このパートでは、Tomcatを動かし、Javaアプリを起動できる状態にすることを目指します。JDK導入、Tomcat配置、systemd連携など、Java実行環境を自動で整える方法を解説します。

STEP5:✅ Tomcatをインストールする

Javaがインストールされていない場合は、JDK17 を自動で導入します。Tomcat はバージョン10.1系を /opt/tomcat に展開し、systemd で起動管理されるように設定されます。

実行コマンド:

sh install_tomcat_host.sh

STEP6:✅ Tomcatの設定を確認する

  • /opt/tomcat/conf/server.xml
    (ポート番号:8080 → AJP連携のため開放しない設定を推奨)

Tomcatの起動・停止は以下のコマンドで行えます:

systemctl start tomcat # 起動
systemctl stop tomcat # 停止

STEP7:⚠️ ApacheとTomcatを連携する

Tomcat の導入スクリプトでは、以下の内容が自動で設定されます:

  • Java(JDK)のインストール

  • server.xml のポート設定
systemd
  • サービスファイルの生成と有効化

Apache との連携設定(httpd.conf に Location を追加する作業)は手動で行う必要があります。

Apache から Tomcat へは、AJP接続を使って /sample のようなパスを中継します。

設定例は以下の通りです:

<Location /sample/>
    ProxyPass ajp://localhost:8009/sample/
</Location>

DBサーバー構築編

このパートの目的は、データを扱えるようにDBを用意し、接続できるようにすることです。PostgreSQLまたはMySQLを自動導入し、APから接続できる状態にします。データベース選択の基準や、セキュアな接続設定についても解説します。

STEP8:✅ DBMSをインストールする

このステップでは、サーバー上にPostgreSQL(もしくはMySQL)をインストールします。本環境では、RHEL系OSに最適化した自作シェルスクリプト install_postgres.sh により、バージョン指定やポート指定を含む柔軟な自動導入が可能です。

事前にバージョンとポート番号を決めておき、他バージョンと競合しない構成にします。ポートの競合がある場合はエラーとしてインストールを中断します。

インストールには下記のようなコマンドを使用します。

sh install_postgres.sh -m install -v14 -p 5432

スクリプト内で自動的にyumリポジトリを追加し、PostgreSQL本体および拡張パッケージ一式を導入します。導入が完了すると、systemdの自動起動設定、設定ファイルのバックアップ、基本的なアクセス制御(pg_hba.conf)までが一括で処理されます。

なお、パスワードはスクリプト内の POSTGRES_PASS 変数に設定された値が適用されます。 

STEP9:✅ DBMSを設定する

インストール後は、DBMSの初期設定とセキュリティ調整を行います。具体的には以下の構成です。

DBMSの設定

  • postgresql.conf のチューニング

  • pg_hba.conf の認証方式の調整

  • firewalld 経由でのポート開放

  • 外部接続用のユーザーとデータベースの作成

設定ファイルはそれぞれ /var/lib/pgsql/{version}/data/ 以下に生成されており、スクリプト内で自動バックアップを取得しています。pg_hba.conf では、ローカルとAPサーバーのIPだけを許可する形で制限をかけることで、安全な接続を担保します。

また、createdb や createuser コマンドを使って、接続用の専用ユーザーとデータベースを作成します。

psql -U postgres -c "CREATE USER devuser WITH PASSWORD 'P@ssW0rd';"
psql -U postgres -c "CREATE DATABASE devdb OWNER devuser;"

このようにして、アプリケーションからの接続を受け付ける準備が整います。 

STEP10:⚠️ Javaアプリを配置して動作確認する

Tomcat の webapps ディレクトリに .war ファイルを配置すれば自動で展開されます。

/opt/tomcat/webapps/sample.war

Tomcat に .war ファイルを配置したら、Apache を経由してアプリにアクセスできるかを確認します。

ブラウザを開いて、以下のURLにアクセスしてください:

https://example.com/sample

このURLが正常に表示されれば、Apache ⇔ Tomcat 間の連携が成功していることを意味します。ページが表示されない場合は、AJP設定や .war の配置先を再確認してください。

運用・保守編

構築したサーバーを放置しておくと、「気づかないうちに止まっていた」「容量がいっぱいで動かない」というトラブルが起きます。

この章では、それを防ぐための自動スクリプトを紹介します。

実際にやることは次のようなことです:

ポイント

  • メモリやCPUをチェックして「重くなりすぎてないか」を見る

  • 毎日バックアップを取ることで「もしもの時に戻せる」ようにする
  • ログを記録・圧縮することで「原因追跡」と「容量節約」を両立する

  • ファイルを他の場所に転送することで「保管場所の分散」ができる
  • 異常を検知したら通知する仕組み(例:メール通知やログ警告) 

これらはすべて、cron(時間指定実行)に登録するだけで自動で動く仕組みです。
人が毎日操作する必要はありません。

このパートでは、作った環境を安全・安定して運用できるようにすることを目指します。メモリ・ディスクのリソース監視や自動バックアップ、ログ送信など保守スクリプトを紹介し、自動運用を可能にします。

✅ サービス起動・停止・状態表示を実行する

manage_service.sh は、任意の systemd サービスを対象として「起動」「停止」「状態表示」などの操作を一括で行える汎用スクリプトです。

このスクリプトを使えば、Apache や Tomcat、PostgreSQL といった主要なサービスの起動制御を、ログ付きで一貫して実行できます。特に、起動状態を事前にチェックしてから処理を行うため、安全性と実用性を兼ね備えています。

実行コマンド例:

sh manage_service.sh -s httpd -c start

対応コマンド一覧:

コマンド意味
startサービスを起動
stopサービスを停止
restartサービスを再起動
graceful設定変更を反映(reload)
graceful-stopソフト停止(非対応→通常停止)
statusサービスの現在状態を表示

このスクリプトでは、Apache や Tomcat、PostgreSQL などの主要サービスの管理を想定しています。処理はログ出力スクリプト logger.shrc を通じて実行され、標準出力とともに操作履歴をログファイルに記録できます。

✅ CPUとメモリ使用率を監視する

resource_alert.sh は、CPU使用率やメモリ使用率を一定間隔でチェックし、ログに記録したり、しきい値を超えた場合にアラートを出したりできます。

このスクリプトは、次のように cron に登録して使います。

(例:毎分監視)

*/1 * * * * /home/bepro/scripts/bin/resource_alert.sh -m cpu

✅ ディスク使用率を監視する

disk_alert.sh は、各パーティションの使用率を定期的にチェックし、警告または致命的な閾値を超えた場合にアラートを出力し、ログとして記録します。

このスクリプトは、次のように cron に登録して定期監視に利用できます。

(例:毎分監視)

*/1 * * * * /home/bepro/projects/scripts/bin/disk_alert.sh

⚠️ systemd でプロセスの常駐監視を 行う

サービスやプロセスの常駐監視は、シェルスクリプトではなく systemd を使う方法が安定的です。起動失敗時の再起動やログとの連携も簡単に行えます。

たとえば、myapp というプロセスを常に起動状態に保ちたい場合、以下のような systemd ユニットファイルを作成します。

(例:/etc/systemd/system/myapp.service)

[Unit]
Description=MyApp Daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/myapp
Restart=always RestartSec=5

[Install]
WantedBy=multi-user.target

このファイルを作成した後、次のコマンドで自動起動を有効にします。

systemctl daemon-reexec
systemctl enable myapp
systemctl start myapp

これで、myapp が停止しても自動で再起動され、OS再起動後も常駐起動されるようになります。監視対象が複数ある場合は、個別にユニットファイルを作成するのが基本方針です。

✅ 障害を検知し通知する

システムやサービスに障害が発生した際、管理者へ即時に通知できる仕組みを構築することは、運用の安定性を高める上で重要です。systemdのjournaldログと連携することで、特定のエラーパターンを自動検出し、LINEやメールなどへ通知することが可能です。

たとえば、PostgreSQLなどの重要サービスでエラーログが出力された場合、検知後すぐにLINEへメッセージを送信することで、現場にいなくても障害の発生を把握できます。通知手段をLINEにすることで、メールサーバー構築やセキュリティ設定の負担を軽減できます。

sh bin/send_alert.sh -m start -u postgresql-15 -t line -i 5

この仕組みを使えば、定期監視だけでなく即時監視も可能となり、同じエラーメッセージの繰り返し送信を抑止する設定も行えます。これにより、不要な通知スパムを防ぎつつ、必要な情報だけを確実に受け取れます。

✅ バックアップを自動で取る

backupFiles.sh は、指定したファイルやディレクトリを .tar.gz に圧縮して保存するスクリプトです。バックアップファイルには日付が付与されるため、世代ごとの管理が可能です。※自動で古いバックアップを削除する機能は含まれていません。

これも cron に登録して毎日実行する形で使います。

(例:毎日3時にバックアップ)

0 3 * * * /home/bepro/scripts/bin/backupFiles.sh -b /home/bepro/backup

✅ ファイルを圧縮管理する

サーバー運用中に蓄積されるログや一時ファイルを定期的に圧縮・退避することで、ディスク容量を節約し、安定運用に繋げます。この用途に使えるのが compress.sh スクリプトです。

このスクリプトでは、任意のファイルやディレクトリを .zst 形式で圧縮し、保持するか削除するかを選択できます。用途に応じてモードを使い分けることができます。

【使用例】

sh compress.sh -s /var/log/httpd -d /rep/httpd_logs_20250802.zst -m 1

この例では /var/log/httpd ディレクトリを圧縮し、出力ファイル /rep/httpd_logs_20250802.zst に保存、元ファイルは削除されます。保持したい場合は -m 0 を指定してください。

✅ ファイルを確実に転送する

fileTransfer.sh は、.end や .fin を使って「送った・受け取った」を明確に管理しながら、途中の転送ミスを防ぐ仕組みです。

このスクリプトは、以下のようにモード別で動作させ、cronで定期実行します。

送信側:

*/5 * * * * /home/bepro/scripts/bin/fileTransfer.sh -m send -f /tmp/data.csv -t /tmp/senddir

受信側:

*/5 * * * * /home/bepro/scripts/bin/fileTransfer.sh -m recv -f /tmp/senddir/data.csv -t /tmp/receivedir

✅ ディレクトリを転送する

ddirTransfer.sh は、指定したディレクトリを転送元・転送先に指定し、コピーまたは移動させるスクリプトです。
モードは -m オプションで指定し、0 がコピー、1 が移動です。

sh dirTransfer.sh -d /tmp/images -t /mnt/backup/images -m 0

まとめ

本シリーズでは、クラウドサーバーの準備からWebサーバー、APサーバー、DBサーバーの構築、そして運用保守まで、開発環境構築の全体像を5つのパートに分けて解説します。各パートは独立して読めるように設計されており、スクリプトによる自動化を前提に操作負担を極力減らす方針で進めていきます。

本サイトにて記載のすべてのスクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。また、この記事は、実際の案件対応を通じて得た知見をもとに筆者が作成したものであり、全コードと解説は著者本人による設計・検証結果に基づいています。

よく読まれている記事

1

「シェル」と「シェルスクリプト」という言葉を聞いたことがありますか?どちらもLinuxやMacのターミナルで使われるものですが、それぞれの役割や使い方には違いがあります。 本記事では、「シェル」と「シ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-クラウド仮想サーバー