03-Java

Javaシステム(サーブレット&JSP)をデプロイする方法|

VirtualBoxで、Webサーバー、アプリケーションサーバー、データベースサーバーの3つをUbuntuを利用して構築する手順。


前提条件

  • VirtualBoxがインストール済である。
  • 各サーバーにUbuntuがインストール済みである。
  • 各サーバーがインターネット接続可能。
  • 各サーバーは仮想ネットワークに接続されている。(例: ブリッジ接続または内部ネットワーク)

1. 仮想マシンの作成と基本設定

仮想マシンの作成とIPアドレスの設定。

サーバー1: Webサーバー (Nginx)

①から④は前提条件部分。⑤以降は設定部分。

  1. 新しい仮想マシンを作成
    • 名前: UbuntuWebServer
    • タイプ: Linux
    • バージョン: Ubuntu24.04 (64-bit)
  2. メモリとディスクを設定
    • 2コア(Webサーバー、APサーバ、DBサーバ)
    • メモリ: 2GB 以上(Webサーバー、APサーバ、DBサーバ)
    • 仮想ハードディスク: 最小 25GB 以上(必要に応じて増やす)
  3. ネットワーク設定
    • 仮想ネットワーク設定を変更し、内部ネットワークまたはブリッジ接続に設定。
  4. Ubuntuをインストール
    • Ubuntu ISOを使用して仮想マシンを起動し、インストール。
  5. IPアドレス設定
    • Ubuntuにログイン後、固定IPアドレスを設定。
  6. Nginxのインストール

IPアドレス設定

Ubuntuにログイン後、固定IPアドレスを設定。

# 次のコマンドでnetplanディレクトリ内にあるyamlファイルを確認。
ls /etc/netplan/

# 存在するファイルの中身を sudo cat コマンドで確認し、dhcp4: true となっている設定ファイルを編集。
# 例えは、「01-network-manager-all.yaml 50-cloud-init.yaml」のように複数ある場合はそれぞれ中身を確認。
sudo cat /etc/netplan/01-network-manager-all.yaml
sudo cat /etc/netplan/50-cloud-init.yaml

(本記事での場合)01-network-manager-all.yamlの中身の確認。

sudo cat /etc/netplan/01-network-manager-all.yaml

(本記事での場合)50-cloud-init.yamlの中身の確認。今回はこちらを編集

sudo cat /etc/netplan/50-cloud-init.yaml

以下の内容に変更(192.168.2.101/24):

sudo nano /etc/netplan/50-cloud-init.yaml

50-cloud-init.yamlファイルの設定

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.2.101/24
      routes:
        - to: default
          via: 192.168.2.1  # default gatewayとして設定
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

「renderer: networkd」というのは、Linuxシステムで使用されるネットワークの設定に関連するコンセプトです。具体的には、systemd-networkdというネットワーク管理ツールを指しています。

systemd-networkdは、システムのネットワーク設定を管理するためのツールで、networkdという名前でシステムサービスとして動作します。これを使って、ネットワークインターフェースの設定や、IPアドレスの割り当て、ルーティング、DNS設定などを管理します。

renderer: networkdは、主にネットワーク設定ファイルで指定され、どのネットワーク管理ツールを使用するかを決定する部分です。例えば、NetworkManagerやsystemd-networkdといった異なる管理ツールから選ぶことができます。renderer: networkdを指定することで、そのシステムのネットワーク設定をsystemd-networkdによって管理することを意味します。

この設定は、特にサーバーや高パフォーマンスを求められるシステムでよく使われます。

「/etc/netplan/01-network-manager-all.yamlファイル」と「/etc/netplan/50-cloud-init.yamlファイル」で、その他のユーザーが読み書き不能にする。

sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo chmod 600 /etc/netplan/50-cloud-init.yaml

設定後、ネットワークを適用します。

sudo netplan apply

Nginxのインストール

Nginxをインストールします。

sudo apt update

sudo apt install nginx

インストール後、Nginxが正常に動作しているか確認します。

sudo systemctl status nginx

次のように「active」となれば成功です。下の画面からはキーボードの「q」でプロンプト表示に戻ります。

サーバー2: アプリケーションサーバー

アプリケーションサーバー (Apache Tomcat + OpenJDK)

①から②は前提条件部分。③以降は設定部分。

  1. 新しい仮想マシンを作成
    • 名前: UbuntuAppServer
    • IPアドレス: 192.168.2.102/24
  2. メモリとディスクを設定
    • 2コア(Webサーバー、APサーバ、DBサーバ)
    • メモリ: 2GB 以上(Webサーバー、APサーバ、DBサーバ)
    • 仮想ハードディスク: 最小 25GB 以上(必要に応じて増やす)
  3. ネットワーク設定
    • 仮想ネットワーク設定を変更し、内部ネットワークまたはブリッジ接続に設定。
  4. Ubuntuのインストールとネットワーク設定
    • Webサーバと同様にUbuntuをインストールし、/etc/netplan/でIPアドレス192.168.2.102/24を設定します。
  5. OpenJDKのインストール
  6. Tomcatのインストール
    • 最新のTomcatを公式サイトからダウンロードしてインストールします。

IPアドレス設定

Ubuntuにログイン後、固定IPアドレスを設定。

# 次のコマンドでnetplanディレクトリ内にあるyamlファイルを確認。
ls /etc/netplan/

# 存在するファイルの中身を sudo cat コマンドで確認し、dhcp4: true となっている設定ファイルを編集。
# 例えは、「01-network-manager-all.yaml 50-cloud-init.yaml」のように複数ある場合はそれぞれ中身を確認。
sudo cat /etc/netplan/01-network-manager-all.yaml
sudo cat /etc/netplan/50-cloud-init.yaml

(本記事での場合)01-network-manager-all.yamlの中身の確認。

sudo cat /etc/netplan/01-network-manager-all.yaml

(本記事での場合)50-cloud-init.yamlの中身の確認。今回はこちらを編集

sudo cat /etc/netplan/50-cloud-init.yaml

以下の内容に変更(192.168.2.102/24):

sudo nano /etc/netplan/50-cloud-init.yaml

50-cloud-init.yamlファイルの設定

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.2.102/24
      routes:
        - to: default
          via: 192.168.2.1  # default gatewayとして設定
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

「/etc/netplan/01-network-manager-all.yamlファイル」と「/etc/netplan/50-cloud-init.yamlファイル」で、その他のユーザーが読み書き不能にする。

sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo chmod 600 /etc/netplan/50-cloud-init.yaml

設定後、ネットワークを適用します。

sudo netplan apply

OpenJDKのインストール(バージョン17.0.10)

JDKのバージョンをEclipseのJavaプログラムで確認する場合は次のプログラムを実行します。→『System.out.println(System.getProperty(“java.version”));』

sudo apt update

sudo apt install openjdk-17-jdk

Tomcatのインストール(Tomcat 10.0.27)

最新のTomcatを公式サイトからダウンロードしてインストールします。

次のコマンドでダウンロードできない場合はFireFoxで直接ファイルをダウンロードして「sudo mv ~/ダウンロード/apache-tomcat-10.0.27.tar.gz /opt/」コマンドで移動させるても問題はありません。

# cdコマンドを利用して/optディレクトリへ移動します。
# /optはサードパーティ製のソフトウェアをインストールする場所として使われます。
# Tomcatはここにインストールするのが一般的です。
cd /opt

# wgetを使ってTomcat 10.0.27をダウンロードします。
sudo wget https://archive.apache.org/dist/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz

# ダウンロードした .tar.gz ファイルを解凍して、適当なディレクトリ(/opt)に配置します。
sudo tar xzvf apache-tomcat-10.0.27.tar.gz

# シンボリックリンクを作成します。
# これにより、/opt/tomcatという短いパスでTomcatを参照できるようになります。
sudo ln -s /opt/apache-tomcat-10.0.27 /opt/tomcat

Tomcatを起動するには次のコマンドを実行します。

sudo /opt/tomcat/bin/startup.sh

Tomcatが正常に動作するかブラウザでhttp://192.168.2.102:8080にアクセスして確認します。次のように表示されれば成功です。

Tomcatを停止するには次のコマンドを実行します。

sudo /opt/tomcat/bin/shutdown.sh

WARファイルと追加で必要なパッケージをFileZilaで転送

UbuntuアプリケーションサーバーへSSHサーバのインストールして起動を行います。

sudo apt update
sudo apt install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh

SSHが正常に起動しているかの確認を行います。

sudo systemctl status ssh

次のように表示されれば成功です。

ファイアウォールの設定で22番ポートを開放します。

sudo ufw allow ssh

WindowsからFileZilaでUbuntuAppServerへ接続します。

FileZilaを起動して次のように設定し接続します。

  1. ファイル」タブから「サイトマネージャー」を選択して「新しいサイト」をクリックします。
  2. 新しいサイト」の名前を「UbuntuAppServer」に変更します。
  3. 次のホスト情報を入力します。
    • プロトコルに「SFTP-SSH File Transfer Protocol」
    • UbuntuAppServerのIPアドレス(今回は192.168.2.102)
    • ログオンタイプに「普通」
    • ユーザーにアクセスを行うユーザー名(今回はubuntuappserver)
    • パスワードにユーザーのパスワード(今回はpasswordaps)
  4. 接続ボタンをクリック

パスワードを保存するかを聞かれるので都合の良い選択をして「OK」をクリック。

「不明なホスト鍵」の表示がでます。今回は接続先が分かっているのでそのまま「OK」をクリックします。

接続が完了すると右半分の「リモートサイト」にUbuntuAppServerの情報が表示されます。

EclipseからエクスポートしたWARファイルをUbuntuAppServerのダウンロードディレクトリに転送します。

「sudo mv ~/ダウンロード/ファイル名.war /opt/tomcat/webapps」コマンドで各warファイルを移動させます。※今後、ファイル名の部分をmyapp.warとして記事にしています。

Tomcatを再起動します。(その後、停止します。)

sudo /opt/tomcat/bin/startup.sh
sudo /opt/tomcat/bin/shutdown.sh

次に開発時にTomcatに追加したパッケージを転送します。

warファイルが/opt/tomcat/webappsに転送された後、Tomcatの再起動が行われていないと、/webapps/プロジェクト名/WEB-INF/libディレクトリが作成されません。

WAR ファイル更新時の対応手順
サーバーで実行中のアプリケーションを停止します。

sudo /opt/tomcat/bin/shutdown.sh

古い WAR ファイルと展開済みフォルダを削除
Tomcat の webapps ディレクトリにある WAR とフォルダを削除します。※ myapp.war はアプリ名に置き換えてください

rm -rf  /opt/tomcat/webapps/myapp.war myapp/

新しい WAR ファイルを配置
新しい WAR ファイルを webapps/ に配置します。
EclipseからエクスポートしたWARファイルをUbuntuAppServerのダウンロードディレクトリに転送します。

「sudo mv ~/ダウンロード/ファイル名.war /opt/tomcat/webapps」コマンドで各warファイルを移動させます。

Tomcatを再起動します。

sudo /opt/tomcat/bin/startup.sh

Windows側に保管されている必要なパッケージをUbuntuAppServerのダウンロードディレクトリに転送します。

「sudo mv ~/ダウンロード/ファイル名 /opt/tomcat/webapps/プロジェクト名/WEB-INF/lib」コマンドで各jarファイルを移動させます。

例:sudo mv ~/ダウンロード/javax.activation-1.2.0.jar /opt/tomcat/webapps/プロジェクト名/WEB-INF/lib

Tomcatを再起動します。

sudo /opt/tomcat/bin/startup.sh

ここまでで、VirtualBoxの外からブラウザでhttp://192.168.2.102:8080/アプリケーション名でアクセスが可能になります。

確認ができたらTomcatを停止します。

sudo /opt/tomcat/bin/shutdown.sh

必要な環境変数の設定

(前提:PuTTyは既にインストール済み)

PuTTyを利用してUbuntuAppServerへ接続します。

SSHが正常に起動しているかの確認を行います。

sudo systemctl status ssh

次のように表示されれば成功です。

PuTTyを起動して、次のように設定します。

  1. Host Name(ホスト名):192.168.2.102
  2. Port(ポート番号):22
  3. Connection type(接続タイプ):SSH

設定が終わったら「Open」をクリックします。

UbuntuAppServerのユーザー名とログイン時のパスワードを入力します。

PuTTY Security Alert が表示された場合は「Accept」をクリックします。

接続が完了すると次のようにプロンプトが表示されます。

今回はシステム全体として利用できる環境変数を設定します。システム全体での設定は/etc/environmentに記述します。

nanoエディタで次のように記述します。

変数名 = “値”

/etc/environmentを開きます。

sudo nano /etc/environment

記述例

GOOGLE_MAIL_APP_PASS = "abcd************"
GOOGLE_MAPS_API_KEY = "AI*************************************"
OPENAI_API_KEY = "sk-***************************************************"

もともと記述のあるPATHの下に改行して追記します。

ファイルの編集を完了したらCtrl + X を押しエディタを終了します。終了時に変更を行うか問われるのでY(またはy)を押して変更を保存します。

システムへの適用を行います。

source /etc/environment

サーバー3: DBサーバー

DBサーバー (MariaDB)

①から②は前提条件部分。③以降は設定部分。

  1. 新しい仮想マシンを作成
    • 名前: UbuntuDbServer
    • IPアドレス: 192.168.2.103/24
  2. メモリとディスクを設定
    • 2コア(Webサーバー、APサーバ、DBサーバ)
    • メモリ: 2GB 以上(Webサーバー、APサーバ、DBサーバ)
    • 仮想ハードディスク: 最小 25GB 以上(必要に応じて増やす)
  3. ネットワーク設定
    • 仮想ネットワーク設定を変更し、内部ネットワークまたはブリッジ接続に設定。
  4. Ubuntuのインストールとネットワーク設定
    • Webサーバと同様にUbuntuをインストールし、/etc/netplan/でIPアドレス192.168.2.103/24を設定します。
  5. MariaDBのインストール
  6. MariaDBの設定
    • MariaDBのセキュリティ設定を行います。
  7. データベースとユーザーの作成
    • MariaDBにログインし、userというユーザーとpasswordというパスワードでデータベースを作成します。

IPアドレス設定

Ubuntuにログイン後、固定IPアドレスを設定。

# 次のコマンドでnetplanディレクトリ内にあるyamlファイルを確認。
ls /etc/netplan/

# 存在するファイルの中身を sudo cat コマンドで確認し、dhcp4: true となっている設定ファイルを編集。
# 例えは、「01-network-manager-all.yaml 50-cloud-init.yaml」のように複数ある場合はそれぞれ中身を確認。
sudo cat /etc/netplan/01-network-manager-all.yaml
sudo cat /etc/netplan/50-cloud-init.yaml

(本記事検証時の場合)01-network-manager-all.yamlの中身の確認。

sudo cat /etc/netplan/01-network-manager-all.yaml

(本記事検証時の場合)50-cloud-init.yamlの中身の確認。今回はこちらを編集

sudo cat /etc/netplan/50-cloud-init.yaml

以下の内容に変更(192.168.2.103/24):

sudo nano /etc/netplan/50-cloud-init.yaml

50-cloud-init.yamlファイルの設定

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.2.103/24
      routes:
        - to: default
          via: 192.168.2.1  # default gatewayとして設定
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

「/etc/netplan/01-network-manager-all.yamlファイル」と「/etc/netplan/50-cloud-init.yamlファイル」で、その他のユーザーが読み書き不能にする。

sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo chmod 600 /etc/netplan/50-cloud-init.yaml

設定後、ネットワークを適用します。

sudo netplan apply

MySQLのインストール

この記事ではMySQLをインストールしますが、ほかのDBMSでも構いません。

もし古いMySQLがインストールされている場合、削除する必要があります。

sudo apt remove --purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt autoremove
sudo apt autoclean

MySQL公式リポジトリを追加

Ubuntuでは、ソフトウェアをインストールするときに 「リポジトリ」 と呼ばれる公式のパッケージ管理システムを利用します。しかし、Ubuntuのリポジトリには必ずしも最新のソフトウェアが含まれているわけではありません。このような理由から、今回は最新のMySQL を入れるために、Ubuntuの標準リポジトリではなく MySQLの公式リポジトリ から取得します。

Ubuntuの標準リポジトリでは古いバージョンが利用されているため、今回はMySQLの公式リポジトリ からインストールします。

パッケージをダウンロードします。

wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb

リポジトリをインストールします。

ここで「The detected system (ubuntu noble) is not supported by MySQL. If you believe the platform is compatible with one of the supported systems, one of the corresponding repositories may be selected.」と表示されることがあります。この場合はそのまま「Yes」で続けます。

sudo dpkg -i mysql-apt-config_0.8.29-1_all.deb

次のコマンドでMariaDBをインストールします。

# パッケージリストを更新
sudo apt update

# MySQLをインストール
sudo apt install mysql-server

# MySQLのバージョンを確認
mysql --version

sudo systemctl start mysql
sudo systemctl enable mysql
sudo systemctl status mysql

MySQLの初期設定

次のコマンドでMySQLへのログインします。(パスワードは未設定)(Ubuntu

sudo mysql -u root

次のコマンドでMySQLのデータをエクスポートします。(Windows

mysqldump -u [ユーザー名] -p --databases [データベース名] > [保存先]/backup.sql

記述例:mysqldump -u root -p –databases databasename > ~/backup.sql

  1. -u root → MySQL の root ユーザーで実行
  2. -p → パスワード入力を求める
  3. –databases databasename → databasename データベースをエクスポート
  4. ~/backup.sql → backup.sql というファイルに保存

出力をしたファイルはFileZilaやSCPコマンドでUbuntuDbServerへ送ります。

接続したら「backup.sql」ファイルを「/home/ubuntudbserver」に送ります。

次のコマンドでデータベースとユーザーの作成を行います。

(重要) ダンプファイルには CREATE DATABASE 文が含まれていない可能性があるため、事前にデータベースを作成しておきます。今回の記事では、利用するsqlファイルでユーザー作成の記述をしているので、次のコマンド操作は行いません。

CREATE DATABASE databasename;

(重要)新規でユーザー(Javaシステムで設定している)の作成を行います。今回の記事では、利用するsqlファイルでユーザー作成の記述をしているので、次のコマンド操作は行いません。

create user 'user'@'localhost' identified with mysql_native_password by 'password';
create user 'user'@'%' identified with mysql_native_password by 'password';

インポートした「backup.sql」ファイルを実行します。

MySQLにログインします。

sudo mysql -u root

backup.sql を実行します。

SOURCE /home/username/backup.sql;

2. サーバー間の接続

各サーバー間の接続確認

各サーバー間で接続を確認します。例えば、Webサーバーからアプリケーションサーバー(Tomcat)への接続を確認するには、次のコマンドを使用します。

Webサーバー ⇔ アプリケーションサーバー ⇔ DBサーバー

ping 192.168.2.102

必要に応じてファイアウォール設定を調整します。

サービスの統合

NginxとTomcatの連携

Nginxをリバースプロキシとして設定し、Tomcatと連携させます。Nginxの設定ファイル(/etc/nginx/sites-available/default)に以下を追加します。

ファイルの下に新しくserver{}を追記するのではなく、元あるserver{}内に追記すします・

nginx

server {

    listen 80;

    server_name 192.168.2.101; #名前で設定することも可能:例:example.com

    # 静的リソースへのアクセス設定
    location /myapp/css/ {
        proxy_pass http://192.168.2.102:8080/myapp/css/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /myapp/js/ {
        proxy_pass http://192.168.2.102:8080/myapp/js/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 他のリクエストをバックエンドのアプリケーションにプロキシ
    location /myapp/ {
        proxy_pass http://192.168.2.102:8080/myapp/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}

この設定の中で使用されている $host, $remote_addr, $proxy_add_x_forwarded_for は、NGINX の変数であり、通常は特に書き換える必要はありません。それぞれの意味は次の通りです:

  • $host:リクエストされたホスト名(例:example.com や 192.168.2.101 など)を表します。このままで問題ない場合がほとんどです。
  • $remote_addr:クライアント(リクエスト元)の IP アドレスを表します。これも特に書き換える必要はなく、プロキシサーバーがクライアントの IP アドレスをバックエンドサーバーに伝えるために使います。
  • $proxy_add_x_forwarded_for:クライアントの IP アドレスを X-Forwarded-For ヘッダーに追加します。複数のプロキシを経由する場合、既存の X-Forwarded-For ヘッダーに現在のリモートアドレスを追加するために使います。

これらの変数を変更するのは、特別な理由がある場合(例えば、特定の IP アドレスを渡したい、あるいはカスタムのヘッダーを使いたい場合)です。しかし、標準的な用途ではそのままで問題ありません。

設定後、Nginxを再起動します。

sudo systemctl restart nginx

Tomcatとデータベースの接続(アプリケーションサーバ)

Tomcatの設定ファイル(/opt/tomcat/conf/context.xml)でMySQLの接続情報を設定します。

TomcatとMySQLを接続するためには、Tomcatのcontext.xmlにデータソースの設定を追加する必要があります。具体的には、context.xmlファイルにJDBCデータソースを設定することで、アプリケーションからMySQLにアクセスできるようにします。

以下は、Tomcatの/opt/tomcat/conf/context.xmlファイルに追加する具体的な設定例です。この設定では、MySQLに接続するためのJDBCリソースを定義します。

1. MySQL(8.0.41) JDBCドライバの準備

まず、MySQL用のJDBCドライバをダウンロードして、Tomcatのlibディレクトリに配置します。MySQL用のJDBCドライバは、MySQL Connector/J のダウンロードページから入手します。

最新の「8.0.41」がない場合は「8.0.x」で代用します。Ubuntu 24 のような新しい環境でも使用することができます。

ダウンロードファイルをFileZilaでアプリケーションサーバへ送ります。

送信した.deb パッケージを展開してJARファイルをTomcatのlibディレクトリにコピーします。

mkdir -p /tmp/mysql-connector-j
dpkg-deb -x mysql-connector-j_8.0.33-1ubuntu23.04_all.deb /tmp/mysql-connector-j

展開後、/tmp/mysql-connector-j/usr/share/java/ に mysql-connector-java-8.0.33.jar が現れます。

JDBC ドライバーを Tomcat の lib ディレクトリにコピーします。

sudo cp /tmp/mysql-connector-j/usr/share/java/mysql-connector-java-8.0.33.jar /opt/tomcat/lib/

lib ディレクトリに mysql-connector-java-8.0.33.jar があることを確認します。

sudo ls -l /opt/tomcat/lib | grep mysql

データベースサーバーの設定確認

対処1

MySQLにログインして、以下のSQLを実行。

SELECT host, user FROM mysql.user WHERE user = 'mysql';
  • host の値が localhost だけなら リモート接続不可
  • 192.168.2.% や % なら 接続可能

問題があれば以下のSQLで、リモートアクセスを許可します。

GRANT ALL PRIVILEGES ON myappDB.* TO 'mysql'@'%' IDENTIFIED BY 'mysql';
FLUSH PRIVILEGES;

特定のIPアドレスのみに制限する場合

GRANT ALL PRIVILEGES ON myappDB.* TO 'mysql'@'192.168.2.%' IDENTIFIED BY 'mysql';
FLUSH PRIVILEGES;

MySQLを再起動します。

sudo systemctl restart mysql

対処2

MySQLが外部接続を許可しているか、設定ファイル(my.cnf)を確認。

サーバーの MySQL 設定ファイル (/etc/my.cnf または /etc/mysql/my.cnf) を開き、bind-address を確認:

sudo cat /etc/mysql/my.cnf

次の「bind-address」部分のアドレスを「0.0.0.0」に設定する。
[mysqld]
bind-address = 0.0.0.0

「bind-address」部分が見当たらない場合はgrepを利用してmy.cnfに読み込んでいるファイルをチェックします。bind-address = 127.0.0.1のような個所が見つかったら0.0.0.0へ変更します。

mysqlx-bind-address は MySQL X Protocol(例えば、JSONデータベース操作など)をローカルでしか使わないなら変更不要 です。

grep -r "bind-address" /etc/mysql/

MySQLを再起動します。

sudo systemctl restart mysql

対処3

ファイアウォールとポートの確認。

sudo ufw status

Status inactiveの場合は次のコマンドを入力します。

sudo ufw enable
sudo ufw allow 3306/tcp
sudo ufw reload

iptables を使用する場合は次のように設定します。

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

対処4

アプリケーションサーバからデータベースへの直接ログインを試みる。

通信が出来るかを確認します。

nc -zv 192.168.2.103 3306

失敗した場合はポートを開く必要があります。

ネットワーク疎通がOKなら、アプリケーションサーバー上でMySQLクライアントを使って直接ログインできるか試します。

MySQL のコマンドラインクライアントをインストールします。

sudo apt update
sudo apt install mysql-client
mysql -h 192.168.2.103 -u mysql -p

MySQL でログイン後、次のコマンドでユーザーがアクセス可能なデータベースを確認できます。

SHOW DATABASES;

もし特定のデータベースがリストに表示されない場合、そのデータベースへのアクセス権限が不足している可能性があります。次のように入力して権限を付与します。

GRANT ALL PRIVILEGES ON <データベース名>.* TO '<ユーザー名>'@'<ホスト名>';
FLUSH PRIVILEGES;

# 入力例1
GRANT ALL PRIVILEGES ON myappDB.* TO 'mysql'@'%' IDENTIFIED BY 'mysql';
FLUSH PRIVILEGES;
# 入力例2
GRANT ALL PRIVILEGES ON myappDB.* TO 'mysql'@'192.168.2.%' IDENTIFIED BY 'mysql';
FLUSH PRIVILEGES;

MySQL 8.0 以降では、次のように GRANT と IDENTIFIED BY を分けて実行する必要があります。(この記事ではこちらのパターンで入力)

# 必要がある場合は、ユーザーがまだ作成されていない場合:
CREATE USER 'mysql'@'%' IDENTIFIED BY 'mysql';
# 必要がある場合は、既存のユーザーにパスワードを変更する場合:
ALTER USER 'mysql'@'%' IDENTIFIED BY 'mysql';
# ユーザーに権限を付与します。
GRANT ALL PRIVILEGES ON myappDB.* TO 'mysql'@'%';
FLUSH PRIVILEGES;

次の2から4の項目は当記事では割愛

※本来設定すべき内容ですが、この記事ではすぐにTomcatの再起動を行っています。

2. context.xmlにデータソースの設定を追加

続けて、Tomcatのcontext.xmlファイルにMySQLの接続設定を追加します。context.xmlは通常/opt/tomcat/conf/context.xmlにあります。

context.xmlファイルをエディタで開きます。

sudo nano /opt/tomcat/conf/context.xml

</Context>タグの直前に、以下のようなデータソース設定を追加します。この設定では、MariaDBに接続するための情報を定義します。

<Context>
    <!-- MySQLデータベース接続のリソース設定 -->
    <Resource name="jdbc/MySQLDB"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://192.168.2.103:3306/ExampleDb?useSSL=false&serverTimezone=UTC"
              username="user"
              password="password"
              maxTotal="20"
              maxIdle="10"
              maxWaitMillis="-1"/>
</Context>

ここで設定する項目は以下の通りです:

  1. name=”jdbc/MySQLDB”: JNDIリソース名
    • JNDIリソース名はアプリケーションから参照する名前です。
  2. driverClassName=”com.mysql.cj.jdbc.Driver”: MySQLのJDBCドライバクラス名。
  3. url=”jdbc:mysql://192.168.2.103:3306/データベース名”: データベースの接続URL。
    • ここではMariaDBのホスト(192.168.2.103)、ポート(3306)、データベース名(ExampleDb)を指定します。
  4. username=”user”: MySQLに接続するためのユーザー名。
  5. password=”password”: 上記ユーザーのパスワード。
  6. maxTotal=”20″: コネクションプールの最大数。
  7. maxIdle=”10″: プール内でアイドル状態の最大コネクション数。
  8. minIdle=”5″: プール内でアイドル状態の最小コネクション数。
  9. maxWaitMillis=”10000″: コネクションを取得するために待機する最大時間(ミリ秒)。

3. web.xmlの設定

Tomcatがデータソースを使用できるように、アプリケーションのweb.xmlファイルにも参照設定を追加する必要があります。通常、web.xmlはアプリケーションのWEB-INFディレクトリにあります。

web.xmlに以下のリソース参照を追加します:

<web-app>

    <!-- その他の設定があればそのまま残しておく -->

    <!-- JNDIリソース参照 -->

    <resource-ref>

        <description>MySQL DataSource</description>

        <res-ref-name>jdbc/ExampleDB</res-ref-name>

        <res-type>javax.sql.DataSource</res-type>

        <res-auth>Container</res-auth>

    </resource-ref>

</web-app>

4. データベース接続のコード例

TomcatのアプリケーションからMariaDBに接続する際、以下のようにJNDIを使用してデータソースを取得し、データベース接続を行います。

次の内容はプログラムでの入力例です。

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class DBHelper {

    public Connection getConnection() throws Exception {

        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource) envContext.lookup("jdbc/ExampleDB");
        return ds.getConnection();

    }
}

5. Tomcatの再起動

設定を反映させるためにTomcatを再起動します。

sudo /opt/tomcat/bin/shutdown.sh

sudo /opt/tomcat/bin/startup.sh

これで、TomcatアプリケーションとMySQLの接続設定は完了です。


  • TomcatのlibディレクトリにMariaDB JDBCドライバ(mariadb-java-client.jar)が正しく配置されていることを確認してください。
  • MariaDBのIPアドレス、ポート番号、データベース名、ユーザー名、パスワードを正しく設定してください。

4. サーバーの起動と確認

  • 各サーバーのサービスを確認し、正常に起動していることを確認します。
  • WebブラウザでWebサーバーのIPアドレス(192.168.2.101)にアクセスし、Tomcatのアプリケーションが動作するか確認します。

これで、Nginx、Tomcat、MySQLを使用した基本的なサーバー構成は完了です。

サーバー4: DNSサーバー (bind9)

①から④は前提条件部分。⑤以降は設定部分。

  1. 新しい仮想マシンを作成
    • 名前: UbuntuDnsServer
    • タイプ: Linux
    • バージョン: Ubuntu24.04 (64-bit)
  2. メモリとディスクを設定
    • (今回は個人用なので)1コア
    • (今回は個人用なので)メモリ: 1GB 以上
    • (今回は個人用なので)仮想ハードディスク: 最小 12.50GB
  3. ネットワーク設定
    • 仮想ネットワーク設定を変更し、内部ネットワークまたはブリッジ接続に設定。
  4. Ubuntuのインストールとネットワーク設定
    • Webサーバと同様にUbuntuをインストールし、/etc/netplan/でIPアドレス192.168.2.100/24を設定します。
  5. IPアドレス設定
    • Ubuntuにログイン後、固定IPアドレスを設定。
  6. bind9のインストール

IPアドレス設定

Ubuntuにログイン後、固定IPアドレスを設定。

# 次のコマンドでnetplanディレクトリ内にあるyamlファイルを確認。
ls /etc/netplan/

# 存在するファイルの中身を sudo cat コマンドで確認し、dhcp4: true となっている設定ファイルを編集。
# 例えは、「01-network-manager-all.yaml 50-cloud-init.yaml」のように複数ある場合はそれぞれ中身を確認。
sudo cat /etc/netplan/01-network-manager-all.yaml
sudo cat /etc/netplan/50-cloud-init.yaml

(本記事検証時の場合)01-network-manager-all.yamlの中身の確認。

sudo cat /etc/netplan/01-network-manager-all.yaml

(本記事検証時の場合)50-cloud-init.yamlの中身の確認。今回はこちらを編集

sudo cat /etc/netplan/50-cloud-init.yaml

以下の内容に変更(192.168.2.100/24):

sudo nano /etc/netplan/50-cloud-init.yaml

50-cloud-init.yamlファイルの設定

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.2.100/24
      routes:
        - to: default
          via: 192.168.2.1  # default gatewayとして設定
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

「/etc/netplan/01-network-manager-all.yamlファイル」と「/etc/netplan/50-cloud-init.yamlファイル」で、その他のユーザーが読み書き不能にする。

sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo chmod 600 /etc/netplan/50-cloud-init.yaml

設定後、ネットワークを適用します。

sudo netplan apply

DNSサーバー(BIND)のインストール

DNSサーバー(BIND)をインストールします。

※VirtualBoxでは接続方法をブリッジアダプターとしています。

sudo apt update
sudo apt install -y bind9 bind9utils bind9-doc

BINDの設定

設定ファイルを編集し、コンテンツサーバーとキャッシュサーバーの両方の機能を有効にします。

named.conf.options の編集(キャッシュDNS用)

sudo nano /etc/bind/named.conf.options

以下のように編集し、キャッシュサーバーを有効にします。

options {
    directory "/var/cache/bind";

    recursion yes;  # キャッシュDNSを有効にする
    allow-query { any; };  # すべてのクライアントからの問い合わせを許可
    allow-recursion { 192.168.2.0/24; };  # ローカルネットワークのクライアントのみ再帰を許可

    forwarders {
        8.8.8.8;  # Google DNSサーバー(外部問い合わせ用)
        8.8.4.4;
    };

    dnssec-validation auto;

    listen-on { any; };
    listen-on-v6 { any; };
};

ゾーン設定(コンテンツDNS用)

ローカルネットワーク用のゾーンを設定します。

sudo nano /etc/bind/named.conf.local

以下を追加します。

zone "myzone.local" {
    type master;
    file "/etc/bind/db.myzone.local";
};

zone "2.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192.168.2";
};

正引きゾーンの作成

sudo nano /etc/bind/db.myzone.local

以下を追加します。

$TTL 86400
@   IN  SOA ns.myzone.local. admin.myzone.local. (
        2024020701  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400       ; Minimum TTL
)

@       IN  NS  ns.myzone.local.
ns      IN  A   192.168.2.100
web     IN  A   192.168.2.101
app     IN  A   192.168.2.102
db      IN  A   192.168.2.103

逆引きゾーンの作成

sudo nano /etc/bind/db.192.168.2

以下を追加します。

$TTL 86400
@   IN  SOA ns.myzone.local. admin.myzone.local. (
        2024020701  ; Serial
        3600        ; Refresh
        1800        ; Retry
        604800      ; Expire
        86400       ; Minimum TTL
)

@       IN  NS  ns.myzone.local.
100.2.168.192.in-addr.arpa. IN PTR ns.myzone.local.
101.2.168.192.in-addr.arpa. IN PTR web.myzone.local.
102.2.168.192.in-addr.arpa. IN PTR app.myzone.local.
103.2.168.192.in-addr.arpa. IN PTR db.myzone.local.

BINDの設定を適用

設定の文法チェックします。

sudo named-checkconf
sudo named-checkzone myzone.local /etc/bind/db.myzone.local
sudo named-checkzone 2.168.192.in-addr.arpa /etc/bind/db.192.168.2

チェックを行いエラーがなければ、BINDを再起動します。

sudo systemctl restart bind9
sudo systemctl enable bind9

sudo systemctl enable bind9がうまく機能しない場合は直接 named.service を有効化します。

実際のユニットファイルの場所を確認

ls -l /etc/systemd/system/bind9.service
ls -l /lib/systemd/system/bind9.service

bind9.service の実体が named.service の場合は、以下のコマンドで named.service を有効化します

sudo systemctl enable named.service
sudo systemctl start named.service

クライアント側のDNS設定

各サーバー(Web、アプリケーション、データベース)の /etc/resolv.conf を編集します。

sudo nano /etc/resolv.conf

以下は設定内容です。

nameserver 192.168.2.100
search myzone.local

Webサーバーの50-cloud-init.yamファイルで設定変更を行います。

sudo nano /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.2.101/24  # nginxのサーバーのIP
      gateway4: 192.168.2.1  # ルーターのIP
      nameservers:
        addresses:
          - 192.168.2.100
        search:
          - myzone.local

設定を適用します。

sudo netplan apply

DNSサーバーの53番ポートを開放します。

ファイアウォールとポートの確認。

sudo ufw status

Status inactiveの場合は次のコマンドを入力します。

sudo ufw enable
sudo ufw allow 53
sudo ufw reload

ホスト名でアクセス

設定したホスト名を使用して、Ubuntuのブラウザのアドレスバーに入力します。
例えば、Webサーバー(192.168.2.101)のホスト名を web.myzone.local に設定した場合は次のようにアクセスします。

http://web.myzone.local/

ホストOS(Windows側)からアクセスするためにはC:\Windows\System32\drivers\etc\hosts ファイルに web.myzone.local とそのIP(例えば 192.168.2.101)を追加する必要があります。

RELATED POST