実践的Webインフラ構築: インフラエンジニアのための環境構築とチューニング
はじめに
現代のWebアプリケーション開発において、インフラエンジニアの役割は急速に変化し、その重要性が増しています。本書では、三層アーキテクチャを基本としたWebアプリケーション環境の構築から最適化までを、実践的に学んでいきます。
本書の対象読者
基本的なLinuxコマンドを理解しているインフラエンジニア
Webアプリケーションのインフラ構築に興味がある方
開発者との協業をより効果的に行いたい方
本書の構成
Webアプリケーションアーキテクチャの基礎
仮想環境でのUbuntuセットアップ
Webサーバー(Apache)の構築と最適化
ポートの設定と接続
アプリケーションサーバー(Tomcat)の導入とチューニング
データベース(MySQL)のセットアップとセキュリティ強化
三層アーキテクチャの統合と動作確認
パフォーマンスチューニングとトラブルシューティング
セキュリティ強化とベストプラクティス
監視とログ管理の実装
Infrastructure as Codeへの発展
各章は、概念説明、実践手順、最適化のヒント、そして発展的なトピックで構成されています。
第1章 Webアプリケーションアーキテクチャの基礎
1.1 Webアプリケーションの進化
Webアプリケーションアーキテクチャは時代と共に進化してきました。ここでは、主要なアーキテクチャパターンを比較し、それぞれの特徴を理解します。
二層アーキテクチャ
構成:クライアント層とサーバー層
特徴:シンプルで実装が容易、スケーラビリティに課題
例:デスクトップデータベースアプリケーション
三層アーキテクチャ
構成:プレゼンテーション層、アプリケーション層、データ層
特徴:スケーラビリティと保守性が高い、実装がやや複雑
例:多くの企業向けWebアプリケーション
マイクロサービスアーキテクチャ
構成:独立した小さなサービスの集合
特徴:高い柔軟性とスケーラビリティ、運用の複雑さ
例:大規模なクラウドネイティブアプリケーション
1.2 三層アーキテクチャの詳細
本書で扱う三層アーキテクチャについて、各層の役割と相互作用を詳しく見ていきます。
プレゼンテーション層(Apache)
役割:ユーザーインターフェースの提供、リクエストの受付
主要コンポーネント:Webサーバー(Apache)
アプリケーション層(Tomcat)
役割:ビジネスロジックの処理、データの加工
主要コンポーネント:アプリケーションサーバー(Tomcat)、JSP、サーブレット
データ層(MySQL)
役割:データの保存、取得、管理
主要コンポーネント:データベースサーバー(MySQL)
1.3 インフラエンジニアの役割
現代のWebアプリケーション開発におけるインフラエンジニアの重要性と、開発者との協業ポイントについて解説します。
環境構築と最適化
パフォーマンスチューニング
セキュリティ強化
スケーラビリティ設計
監視とログ管理
自動化とInfrastructure as Code
演習
三層アーキテクチャの各層の役割と、それぞれの層で使用される代表的な技術を3つずつ挙げてください。
インフラエンジニアが開発者と協業する上で重要なポイントを3つ考え、それぞれについて簡単に説明してください。
第2章 仮想環境でのUbuntuセットアップ
2.1 仮想化技術の選択
仮想化技術の選択は、開発環境と本番環境の一貫性を保つ上で重要です。主要な仮想化技術の特徴を比較します。
VirtualBox: オープンソース、クロスプラットフォーム対応
VMware: 高性能、エンタープライズ向け機能が充実
KVM: Linuxカーネル統合、高いパフォーマンス
仮想化のメリット:
環境の分離と管理の容易さ
スナップショットによる状態管理
リソースの効率的な利用
デメリット:
オーバーヘッドによるパフォーマンスの低下
複雑な設定が必要な場合がある
2.2 Ubuntu LTSのインストール
Ubuntu Long Term Support (LTS) バージョンを使用することで、長期的な安定性とセキュリティアップデートが保証されます。
# ISOイメージのダウンロード
wget https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso
# 仮想マシンの作成とOSのインストール手順
# (仮想化ソフトウェア特有の手順は省略)
# インストール後の初期設定
sudo apt update
sudo apt upgrade -y
2.3 初期設定とセキュリティ強化
基本的なセキュリティ設定を行い、システムを安全な状態に保ちます。
# ファイアウォールの設定
sudo ufw enable
sudo ufw allow ssh
# SSHの設定強化
sudo vi /etc/ssh/sshd_config
# 以下の行を変更または追加
PermitRootLogin no
PasswordAuthentication no
# SSHサービスの再起動
sudo systemctl restart sshd
# 自動アップデートの設定
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
演習
VirtualBoxまたはVMwareを使用して、Ubuntu 22.04 LTS Serverをインストールしてください。
インストールしたUbuntuに対して、以下の設定を行ってください:
システムを最新の状態に更新
SSHでのルートログインを無効化
ファイアウォールを有効にし、SSHのみ許可
自動アップデートを有効化
設定後、別のマシンからSSH接続ができることを確認してください。
第3章 Webサーバー(Apache)の構築と最適化
3.1 Apacheのインストールと基本設定
Apache HTTP Serverは、最も広く使用されているWebサーバーの一つです。ここでは、Apacheのインストールと基本的な設定方法を学びます。
# Apacheのインストール
sudo apt install apache2 -y
# Apacheの起動と自動起動の設定
sudo systemctl start apache2
sudo systemctl enable apache2
# ステータスの確認
sudo systemctl status apache2
3.2 バーチャルホストの設定
バーチャルホストを使用することで、1台のサーバーで複数のウェブサイトをホストできます。
# バーチャルホスト設定ファイルの作成
sudo vi /etc/apache2/sites-available/example.com.conf
# 以下の内容を追加
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>
# バーチャルホストの有効化
sudo a2ensite example.com.conf
# Apache設定のテストと再読み込み
sudo apache2ctl configtest
sudo systemctl reload apache2
3.3 モジュールの管理と最適化
Apacheの機能はモジュールによって拡張できます。必要なモジュールを有効化し、不要なモジュールを無効化することで、パフォーマンスと安全性を向上させることができます。
# モジュールの有効化(例:mod_rewrite)
sudo a2enmod rewrite
# モジュールの無効化(例:不要なモジュール)
sudo a2dismod status
# 変更の適用
sudo systemctl restart apache2
3.4 パフォーマンスチューニング
ApacheのMPM(Multi-Processing Module)設定を調整して、パフォーマンスを最適化します。
# MPM設定ファイルの編集
sudo vi /etc/apache2/mods-available/mpm_prefork.conf
# 以下のような設定を追加または調整
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
# 設定の再読み込み
sudo systemctl reload apache2
演習
Apacheをインストールし、デフォルトページが表示されることを確認してください。
新しいバーチャルホスト「mysite.local」を作成し、カスタムHTMLページを表示させてください。
mod_rewriteモジュールを有効にし、.htaccessファイルを用いて全てのリクエストをindex.phpにリダイレクトする設定を行ってください。
ApacheBenchを使用して、デフォルト設定と調整後の設定でパフォーマンステストを行い、結果を比較してください。
第4章 ポートの設定と接続
本章では、Webアプリケーションインフラで使用する主要なポートとその設定方法について説明します。この理解は、後続の章でのアプリケーションサーバーやデータベースの設定に不可欠です。
4.1 主要ポートの概要
この環境で使用する主要なポートは以下の通りです:
| サービス | ポート | プロトコル | 説明 |
|---------|-------|-----------|------|
| Apache | 80 | HTTP | クライアントからのWeb要求を受け付ける |
| Apache | 443 | HTTPS | クライアントからの暗号化されたWeb要求を受け付ける |
| Tomcat | 8009 | AJP | ApacheとTomcat間の通信に使用(mod_jk使用時) |
| MySQL | 3306 | TCP | データベース接続に使用 |
4.2 システムアーキテクチャ図
以下は、これらのポートを使用したシステムの基本的なアーキテクチャ図です:
クライアント
|
| HTTP(80)/HTTPS(443)
|
+---v-------------------+
| Apache (80,443) |
+---|-----------------|-+
|
| AJP(8009)
|
+---v-------------------+
| Tomcat (8009) |
+---|-----------------|-+
|
| JDBC(3306)
|
+---v-------------------+
| MySQL (3306) |
+-----------------------+
4.3 各サービスのポート設定
4.3.1 Apache
sudo vi /etc/apache2/ports.conf
以下の行があることを確認:
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
4.3.2 Tomcat
sudo vi /etc/tomcat9/server.xml
以下の行を確認または追加:
<Connector protocol="AJP/1.3"
address="127.0.0.1"
port="8009"
redirectPort="8443" />
4.3.3 MySQL
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
以下の行があることを確認:
port = 3306
4.4 Apache と Tomcat の連携設定
mod_jkのインストール:
sudo apt install libapache2-mod-jk
Apache設定ファイルの編集:
sudo vi /etc/apache2/sites-available/000-default.conf
以下を追加:
<VirtualHost *:80>
...
JkMount /your_app_name/* worker1
...
</VirtualHost>
workers.propertiesファイルの作成:
sudo vi /etc/apache2/workers.properties
以下の内容を追加:
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
演習
上記の設定を実際に行い、各サービス(Apache、Tomcat、MySQL)が正しいポートで動作していることを確認してください。
`netstat` または `ss` コマンドを使用して、各ポートがリッスンしている状態を確認してください。
ApacheとTomcatの連携が正しく機能しているか、テストWebアプリケーションを使用して確認してください。
第5章 アプリケーションサーバー(Tomcat)の導入とチューニング
5.1 Javaのインストール
Tomcatを実行するためには、まずJavaをインストールする必要があります。
# JDKのインストール
sudo apt update
sudo apt install default-jdk -y
# Javaバージョンの確認
java -version
javac -version
5.2 Tomcatのインストールと初期設定
Javaのインストールが完了したら、Tomcatをインストールします。
# Tomcatのインストール
sudo apt install tomcat9 -y
# Tomcatの起動と自動起動の設定
sudo systemctl start tomcat9
sudo systemctl enable tomcat9
# ステータスの確認
sudo systemctl status tomcat9
5.3 Tomcatの設定ファイル
Tomcatの主要な設定ファイルについて解説します。
`/etc/tomcat9/server.xml`: メインの設定ファイル
`/etc/tomcat9/web.xml`: Webアプリケーションのデフォルト設定
`/etc/tomcat9/context.xml`: アプリケーションコンテキストの設定
5.4 JVMチューニング
Tomcatのパフォーマンスは、Java Virtual Machine (JVM)の設定に大きく依存します。
# JAVA_OPTS設定の編集
sudo vi /etc/default/tomcat9
# 以下のような設定を追加または調整
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m"
5.5 Tomcatとの連携
ApacheとTomcatを連携させることで、静的コンテンツと動的コンテンツを効率的に処理できます。
# mod_jkのインストール
sudo apt install libapache2-mod-jk -y
# mod_jkの設定
sudo vi /etc/apache2/mods-available/jk.conf
# 以下の内容を追加
<IfModule jk_module>
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /*.jsp worker1
JkMount /servlet/* worker1
</IfModule>
# workers.propertiesの作成
sudo vi /etc/apache2/workers.properties
# 以下の内容を追加
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
5.6 負荷テストツール(Jmeter)の導入
アプリケーションサーバーのパフォーマンスを評価するために、Apache Jmeterを使用します。
# Jmeterのインストール
sudo apt update
sudo apt install jmeter -y
# Jmeterのバージョン確認
jmeter --version
5.7 Jmeterを使用した負荷テスト
Jmeterを使用して、Tomcatのパフォーマンスを測定します。
テストプランの作成:
スレッドグループの追加
HTTPリクエストの設定
リスナーの追加(結果ツリー、集計レポートなど)
テストの実行と結果の分析
演習
OpenJDK 11をインストールし、バージョンを確認してください。
Tomcat9をインストールし、デフォルトページが表示されることを確認してください。
JVMのヒープサイズを1GBに設定し、Tomcatを再起動してください。
ApacheとTomcatを連携させ、JSPファイルへのリクエストがTomcatで処理されることを確認してください。
Jmeterをインストールし、以下の条件で負荷テストを実施してください:
同時ユーザー数: 100
ランプアップ期間: 30秒
ループ回数: 10
負荷テストの結果を分析し、Tomcatの設定(server.xml, JVMオプション)を調整して、レスポンスタイムを10%以上改善してください。
5.8 パフォーマンスチューニングのベストプラクティス
これらの設定を適用し、再度Jmeterで負荷テストを行うことで、パフォーマンスの改善を確認できます。
第6章 データベース(MySQL)のセットアップとセキュリティ強化
6.1 MySQLのインストールと初期設定
MySQLは広く使用されているオープンソースのリレーショナルデータベース管理システムです。
# MySQLのインストール
sudo apt install mysql-server -y
# MySQLの起動と自動起動の設定
sudo systemctl start mysql
sudo systemctl enable mysql
# 初期セキュリティ設定
sudo mysql_secure_installation
6.2 ユーザーとデータベースの作成
アプリケーション用のデータベースとユーザーを作成します。
# MySQLにrootでログイン
sudo mysql
# データベースの作成
CREATE DATABASE myapp;
# ユーザーの作成と権限付与
CREATE USER 'myappuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON myapp.* TO 'myappuser'@'localhost';
FLUSH PRIVILEGES;
# 設定の確認
SHOW GRANTS FOR 'myappuser'@'localhost';
6.3 MySQLのパフォーマンスチューニング
MySQLの設定ファイル(my.cnf)を調整してパフォーマンスを最適化します。
# 設定ファイルの編集
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# 以下のような設定を追加または調整
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# MySQLの再起動
sudo systemctl restart mysql
6.4 MySQLのバックアップと復元
定期的なバックアップは重要なタスクです。
# データベースのバックアップ
mysqldump -u root -p --all-databases > all_databases_backup.sql
# 特定のデータベースのバックアップ
mysqldump -u root -p myapp > myapp_backup.sql
# バックアップからの復元
mysql -u root -p myapp < myapp_backup.sql
演習
MySQLをインストールし、セキュリティ設定を行ってください。
アプリケーション用のデータベースとユーザーを作成してください。
MySQLのパフォーマンス設定を調整し、mysqltunerを使用して設定を評価してください。
データベースのバックアップを作成し、新しいデータベースに復元してください。
第7章 三層アーキテクチャの統合と動作確認
7.1 アプリケーションのデプロイ
Tomcatにサンプルアプリケーションをデプロイします。
# サンプルWARファイルのダウンロード
wget https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
# Tomcatのwebappsディレクトリにコピー
sudo cp sample.war /var/lib/tomcat9/webapps/
# Tomcatの再起動
sudo systemctl restart tomcat9
7.2 接続テスト
各層の接続を確認します。
ApacheからTomcatへの接続確認
TomcatからMySQLへの接続確認
7.3 ログの確認と解析
各コンポーネントのログを確認し、問題がないか確認します。
# Apacheのログ
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log
# Tomcatのログ
sudo tail -f /var/log/tomcat9/catalina.out
# MySQLのログ
sudo tail -f /var/log/mysql/error.log
演習
サンプルJSPアプリケーションをTomcatにデプロイしてください。
ApacheからTomcat、そしてMySQLまでの接続が正常に機能していることを確認してください。
各コンポーネントのログを分析し、潜在的な問題や最適化の余地を特定してください。
第8章 パフォーマンスチューニングとトラブルシューティング
8.1 システムリソースの監視
# topコマンドでリソース使用状況を確認
top
# ディスクI/Oの監視
iostat -x 1
# ネットワークトラフィックの監視
iftop
8.2 ボトルネックの特定と解決
よくあるボトルネックとその解決方法:
CPU使用率が高い
プロセスの優先度調整
コード最適化
メモリ不足
スワップ使用の最小化
メモリリークの特定と修正
ディスクI/O
SSDへの移行
RAID構成の最適化
ネットワーク遅延
CDNの利用
ネットワーク機器のアップグレード
8.3 総合的な負荷テストと分析
第4章で導入したApache JMeterを使用して、システム全体の負荷テストを実施します。
テストシナリオの作成
ユーザー登録
ログイン
商品検索
商品詳細表示
注文処理
段階的な負荷増加テスト
同時ユーザー数: 10 → 50 → 100 → 500
各段階で5分間の持続負荷
結果の分析
レスポンスタイム
スループット
エラー率
サーバーリソース使用率(CPU、メモリ、ディスクI/O、ネットワーク)
ボトルネックの特定
各コンポーネント(Apache、Tomcat、MySQL)のパフォーマンス指標を比較
最も負荷が高いコンポーネントを特定
最適化
特定されたボトルネックに基づいて、該当コンポーネントの設定を調整
Apache: MPM設定、KeepAlive設定
Tomcat: スレッドプール設定、JVMメモリ設定
MySQL: クエリキャッシュ、インデックス最適化
再テストと結果比較
最適化後に同じテストシナリオを実行
最適化前後のパフォーマンスを比較し、改善度を評価
演習
上記の手順に従って、総合的な負荷テストを実施してください。
テスト結果を分析し、主要なボトルネックを3つ以上特定してください。
特定したボトルネックに対する最適化案を提案し、実装してください。
最適化前後のパフォーマンスを比較し、改善率を計算してください。
負荷テストと最適化のプロセスをレポートにまとめ、今後の改善点を提案してください。
第9章 基本的なセキュリティ設定
本章では、Webインフラにおける基本的なセキュリティ設定として、ファイアウォールの設定と自動更新の設定に焦点を当てます。
9.1 ファイアウォールの設定
Ubuntu では、UFW (Uncomplicated Firewall) を使用してファイアウォールを簡単に設定できます。
# UFWのインストール(通常はデフォルトでインストールされています)
sudo apt install ufw
# UFWの有効化
sudo ufw enable
# デフォルトポリシーの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSHを許可(必要に応じてポート番号を変更)
sudo ufw allow 22/tcp
# HTTPとHTTPSを許可
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# ファイアウォールのステータス確認
sudo ufw status verbose
注意: SSHを許可する前にUFWを有効化すると、現在のSSH接続が切断される可能性があります。SSHを許可してからUFWを有効化するようにしてください。
9.2 自動更新の設定
Ubuntu の unattended-upgrades パッケージを使用して、システムの自動更新を設定します。
# unattended-upgradesのインストール
sudo apt install unattended-upgrades
# 自動更新の設定
sudo dpkg-reconfigure --priority=low unattended-upgrades
設定ファイルをより詳細に調整したい場合は、以下のファイルを編集します:
sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
主な設定オプション:
`Unattended-Upgrade::Allowed-Origins`: 更新を許可するソースの指定
`Unattended-Upgrade::Package-Blacklist`: 自動更新しないパッケージの指定
`Unattended-Upgrade::AutoFixInterruptedDpkg`: 中断されたアップグレードの自動修復
`Unattended-Upgrade::MinimalSteps`: 最小ステップでの更新実行
自動更新の動作確認:
sudo unattended-upgrades --dry-run --debug
演習
UFWを使用して、以下の条件でファイアウォールを設定してください:
SSHは特定のIPアドレス範囲からのみ許可
HTTP, HTTPSは全てのIPアドレスから許可
その他全ての受信トラフィックをブロック
unattended-upgradesを設定し、以下の条件を満たすようにしてください:
セキュリティアップデートのみを自動的にインストール
アップデート後に自動的に再起動しない
更新ログを特定のファイルに出力する
設定後、ファイアウォールのルールと自動更新の設定を確認し、レポートを作成してください。
これらの基本的なセキュリティ設定により、システムの安全性が向上し、最新のセキュリティパッチが適用されるようになります。ただし、これらは包括的なセキュリティ対策の一部に過ぎません。実際の運用環境では、さらに高度なセキュリティ対策が必要となる場合があります。
第10章 監視とログ管理の実装
この章では、システムの監視とログ管理の重要性について学び、実際に監視ツールとログ管理システムを実装します。
10.1 Prometheus + Grafanaによるシステム監視
Prometheusのインストールと設定
Grafanaのインストールとダッシュボードの作成
アラートルールの設定
10.2 ELKスタックによるログ管理
Elasticsearchのインストールと設定
Logstashの設定とログの収集
Kibanaを使用したログの可視化と分析
10.3 アラート設定
Prometheusアラートマネージャーの設定
Slackやメールへのアラート通知の実装
演習
Prometheus + Grafanaを使用して、システムリソース(CPU、メモリ、ディスク、ネットワーク)の監視ダッシュボードを作成してください。
ELKスタックを使用して、Apache、Tomcat、MySQLのログを集中管理するシステムを構築してください。
特定の条件(例:高CPU使用率、エラーログの急増)でアラートが発生するように設定し、テストしてください。
第11章 Infrastructure as Codeへの発展
この章では、Infrastructure as Code (IaC) の概念と利点を学び、実際にAnsibleを使用してインフラストラクチャの自動化を行います。
11.1 Ansibleの基本
Ansibleのインストールと設定
インベントリファイルの作成
基本的なPlaybookの作成と実行
11.2 Playbookを使用したWebサーバーの自動構築
Apache、Tomcat、MySQLのインストールと設定を自動化するPlaybookの作成
セキュリティ設定の自動化
11.3 継続的インフラストラクチャ(CI for Infrastructure)
GitLabを使用したPlaybookのバージョン管理
CI/CDパイプラインの構築
演習
これまでの章で手動で行った設定を自動化するAnsible Playbookを作成してください。
GitLabを使用してPlaybookのバージョン管理を行い、変更をプッシュした際に自動的にテスト環境に適用されるCI/CDパイプラインを構築してください。
作成したPlaybookを使用して、新しい仮想マシンに完全な環境を自動でセットアップし、動作確認を行ってください。
結論
本書を通じて、Webインフラの構築からチューニング、セキュリティ強化、監視、そして自動化まで、インフラエンジニアとして必要な幅広いスキルを学びました。これらの知識とスキルを実際のプロジェクトに適用し、継続的に学習と改善を重ねることで、より強固で効率的なWebインフラを構築・運用できるようになるでしょう。
技術の進化は速いため、常に新しい技術やベストプラクティスをキャッチアップし、adaptableな姿勢を持ち続けることが重要です。インフラエンジニアとしての旅は、ここからが本当の始まりです。頑張ってください!
そしてPR
私が代表を務める(株)アウルキャンプでは、随時ITエンジニアを採用しています。
未経験者に向けても門戸を広げるべく、学習機会を提供するプログラムも開始しました。
エンジニアとして働いてみたい方、エンジニア転職を希望する方は、ぜひこちら👇を覗いてみてください。