サーバー構築演習では、ローカル環境や仮想環境を使って、実際にWebサーバーやアプリケーションサーバーを構築する手順を学びます。この記事は、Linuxの基本操作を理解しながら、ApacheやNginx、MySQL、PHPなどの導入・設定を初学者でも理解できるように丁寧に解説したものです 🚀
🎯 演習の目的
- 🐧 Linuxの基本操作に慣れる
- 🌐 Webサーバー(Apache/Nginx)の構築
- 🗄️ データベース(MySQL/MariaDB)の導入
- ⚡ PHPによる動的Webサイトの基礎構築
- 🔒 セキュリティの初歩(ファイアウォール・パーミッション)
- 🔧 実際のサーバー運用に必要な基礎知識の習得
- 📊 システム監視とメンテナンスの基本
🧰 使用ツール・環境
💻 OS環境
環境 | 特徴 | 推奨度 | 初心者向け |
---|---|---|---|
📦 VirtualBox + Ubuntu | 完全な仮想環境 | ⭐⭐⭐ | ⭐⭐⭐ |
🪟 WSL2 + Ubuntu | Windows上のLinux | ⭐⭐⭐ | ⭐⭐ |
☁️ AWS EC2 | 本格的なクラウド環境 | ⭐⭐ | ⭐ |
🐳 Docker | コンテナ型仮想化 | ⭐⭐ | ⭐ |
🛠️ 開発ツール
- 🖥️ ターミナル:Linuxコマンドライン(bash)
- ✏️ エディタ:nano / vim / Visual Studio Code(Remote SSH)
- 🌐 Webブラウザ:Chrome / Firefox(動作確認用)
- 📁 ファイル転送:SCP / SFTP / rsync
🚀 事前準備:環境構築
📦 VirtualBox + Ubuntu環境の準備
Step 1: VirtualBoxのインストール
# Windows/Mac/Linuxで以下サイトからダウンロード
# https://www.virtualbox.org/
Step 2: Ubuntu Server ISOのダウンロード
# Ubuntu 22.04 LTS Server版を推奨
# https://ubuntu.com/download/server
Step 3: 仮想マシンの作成
- 💾 メモリ:最低2GB、推奨4GB
- 💿 ストレージ:最低20GB、推奨40GB
- 🌐 ネットワーク:NAT(初期設定)
🪟 WSL2環境の準備(Windows用)
# PowerShellを管理者権限で実行
# WSL2の有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 再起動後、WSL2をデフォルトに設定
wsl --set-default-version 2
# Ubuntuのインストール
wsl --install -d Ubuntu-22.04
🏗️ サーバー構築ステップ(LAMP構成)
📝 Step 1: システムの初期設定
パッケージの更新
# システム全体のパッケージリストを更新
sudo apt update && sudo apt upgrade -y
# 基本的な開発ツールをインストール
sudo apt install -y curl wget git unzip software-properties-common
# システム情報の確認
uname -a # カーネル情報
lsb_release -a # Ubuntu バージョン
free -h # メモリ使用量
df -h # ディスク使用量
ユーザー設定とセキュリティ
# 新しいユーザーを作成(実際の運用では推奨)
sudo adduser webapp
sudo usermod -aG sudo webapp # sudo権限を付与
# SSH設定(リモート接続する場合)
sudo systemctl status ssh
sudo systemctl enable ssh
sudo systemctl start ssh
🌐 Step 2: Webサーバー(Apache)の構築
Apacheのインストールと起動
# Apacheのインストール
sudo apt install -y apache2
# Apacheの状態確認
sudo systemctl status apache2
# 自動起動の設定
sudo systemctl enable apache2
# ファイアウォール設定
sudo ufw allow 'Apache Full'
sudo ufw --force enable
# 動作確認
curl http://localhost
# または ブラウザで http://サーバーのIP にアクセス
Apacheの基本設定
# 設定ファイルの場所
/etc/apache2/apache2.conf # メイン設定
/etc/apache2/sites-available/ # サイト設定
/var/www/html/ # ドキュメントルート
# デフォルトサイトの編集
sudo nano /var/www/html/index.html
<!-- 簡単なテストページ -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>サーバー構築演習 🚀</title>
</head>
<body>
<h1>Apache サーバーが正常に動作しています! ✅</h1>
<p>現在時刻: <span id="time"></span></p>
<script>
document.getElementById('time').textContent = new Date().toLocaleString('ja-JP');
</script>
</body>
</html>
重要なApacheコマンド
# サービス操作
sudo systemctl start apache2 # 開始
sudo systemctl stop apache2 # 停止
sudo systemctl restart apache2 # 再起動
sudo systemctl reload apache2 # 設定再読み込み
# 設定テスト
sudo apache2ctl configtest
# ログの確認
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log
⚡ Step 3: PHP環境の構築
PHPのインストール
# PHP 8.1とよく使うモジュールをインストール
sudo apt install -y php8.1 php8.1-mysql php8.1-mbstring php8.1-xml php8.1-gd php8.1-curl php8.1-zip
# PHP-FPM(FastCGI Process Manager)
sudo apt install -y php8.1-fpm
# Apacheでmod_phpを有効化
sudo a2enmod php8.1
# Apache再起動
sudo systemctl restart apache2
PHP動作テスト
# PHPinfo ページの作成
sudo nano /var/www/html/phpinfo.php
<?php
// PHP情報表示
phpinfo();
// データベース接続テスト用の関数
function testDatabaseConnection() {
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');
return "✅ データベース接続成功";
} catch (PDOException $e) {
return "❌ データベース接続失敗: " . $e->getMessage();
}
}
echo "<h2>📊 システム情報</h2>";
echo "<p><strong>PHP Version:</strong> " . phpversion() . "</p>";
echo "<p><strong>Server:</strong> " . $_SERVER['SERVER_SOFTWARE'] . "</p>";
echo "<p><strong>Document Root:</strong> " . $_SERVER['DOCUMENT_ROOT'] . "</p>";
echo "<p><strong>DB Connection:</strong> " . testDatabaseConnection() . "</p>";
?>
PHP設定の調整
# php.ini の編集
sudo nano /etc/php/8.1/apache2/php.ini
# 主要な設定項目
upload_max_filesize = 100M # アップロードファイルサイズ
post_max_size = 100M # POSTデータサイズ
memory_limit = 256M # メモリ制限
display_errors = On # エラー表示(開発時のみ)
error_reporting = E_ALL # エラーレポート
🗄️ Step 4: MySQL(MariaDB)の構築
MySQLのインストール
# MySQL Server のインストール
sudo apt install -y mysql-server mysql-client
# MySQL の起動と自動起動設定
sudo systemctl start mysql
sudo systemctl enable mysql
# セキュリティ設定(重要!)
sudo mysql_secure_installation
MySQL初期設定
# MySQLにログイン
sudo mysql -u root -p
# データベースとユーザーの作成
CREATE DATABASE webapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'webapp_user'@'localhost' IDENTIFIED BY 'strong_password_123';
GRANT ALL PRIVILEGES ON webapp_db.* TO 'webapp_user'@'localhost';
FLUSH PRIVILEGES;
# テストテーブルの作成
USE webapp_db;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
# テストデータの挿入
INSERT INTO users (name, email) VALUES
('山田太郎', 'yamada@example.com'),
('佐藤花子', 'sato@example.com');
# データの確認
SELECT * FROM users;
EXIT;
重要なMySQLコマンド
# サービス操作
sudo systemctl status mysql # 状態確認
sudo systemctl restart mysql # 再起動
# ログの確認
sudo tail -f /var/log/mysql/error.log
# データベース接続テスト
mysql -u webapp_user -p -h localhost webapp_db
🔒 Step 5: セキュリティ設定
ファイアウォール(UFW)の設定
# UFWの状態確認
sudo ufw status
# 基本的な設定
sudo ufw default deny incoming # 入力拒否
sudo ufw default allow outgoing # 出力許可
# 必要なポートを開放
sudo ufw allow ssh # SSH (22)
sudo ufw allow 'Apache Full' # HTTP (80) + HTTPS (443)
sudo ufw allow 3306 # MySQL (内部のみ推奨)
# UFWを有効化
sudo ufw --force enable
# 設定確認
sudo ufw status verbose
ファイルパーミッションの設定
# Webディレクトリの所有者変更
sudo chown -R www-data:www-data /var/www/html/
# 適切なパーミッション設定
sudo find /var/www/html/ -type d -exec chmod 755 {} \; # ディレクトリ
sudo find /var/www/html/ -type f -exec chmod 644 {} \; # ファイル
# 設定ファイルのバックアップ
sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.backup
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup
ログ監視の設定
# ログローテーションの確認
sudo nano /etc/logrotate.d/apache2
# 重要なログファイル
/var/log/apache2/access.log # アクセスログ
/var/log/apache2/error.log # エラーログ
/var/log/mysql/error.log # MySQLエラーログ
/var/log/auth.log # 認証ログ
# リアルタイムログ監視
sudo tail -f /var/log/apache2/access.log
🌐 Step 6: 動的Webアプリケーションの作成
簡単なPHP+MySQL Webアプリ
# アプリケーション用ディレクトリ作成
sudo mkdir -p /var/www/html/webapp
sudo chown www-data:www-data /var/www/html/webapp
<!-- /var/www/html/webapp/index.php -->
<?php
$host = 'localhost';
$dbname = 'webapp_db';
$username = 'webapp_user';
$password = 'strong_password_123';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ユーザー一覧の取得
$stmt = $pdo->query("SELECT * FROM users ORDER BY created_at DESC");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
die("❌ データベース接続エラー: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>サーバー構築演習 - Webアプリ 🚀</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 40px; background: #f5f5f5; }
.container { max-width: 800px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
h1 { color: #333; border-bottom: 3px solid #007acc; padding-bottom: 10px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; }
th { background: #f8f9fa; font-weight: bold; }
.status { margin: 20px 0; padding: 15px; background: #d4edda; border: 1px solid #c3e6cb; border-radius: 5px; color: #155724; }
</style>
</head>
<body>
<div class="container">
<h1>🎉 LAMP環境構築完了!</h1>
<div class="status">
<strong>✅ システム状態:</strong><br>
📅 現在時刻: <?php echo date('Y年m月d日 H:i:s'); ?><br>
🖥️ サーバー: <?php echo $_SERVER['SERVER_SOFTWARE']; ?><br>
⚡ PHP Version: <?php echo phpversion(); ?><br>
🗄️ データベース: 接続成功
</div>
<h2>👥 ユーザー一覧</h2>
<table>
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
<th>登録日時</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo htmlspecialchars($user['id']); ?></td>
<td><?php echo htmlspecialchars($user['name']); ?></td>
<td><?php echo htmlspecialchars($user['email']); ?></td>
<td><?php echo htmlspecialchars($user['created_at']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<h2>📊 システム情報</h2>
<p><strong>ドキュメントルート:</strong> <?php echo $_SERVER['DOCUMENT_ROOT']; ?></p>
<p><strong>サーバー名:</strong> <?php echo $_SERVER['SERVER_NAME']; ?></p>
<p><strong>使用ポート:</strong> <?php echo $_SERVER['SERVER_PORT']; ?></p>
</div>
</body>
</html>
❌ よくあるトラブルと対処法
問題 | 症状 | 原因 | 解決方法 | 重要度 |
---|---|---|---|---|
🌐 Webページが表示されない | Connection refused |
Apache未起動 | sudo systemctl start apache2 |
⭐⭐⭐ |
⚡ PHPが動作しない | ソースコードがそのまま表示 | PHP未インストール | sudo apt install php8.1 |
⭐⭐⭐ |
🗄️ データベース接続エラー | Access denied |
MySQL設定ミス | ユーザー権限を再確認 | ⭐⭐⭐ |
🔒 Permission denied | ファイルアクセス不可 | パーミッション設定 | sudo chown www-data:www-data |
⭐⭐ |
🔥 ファイアウォールでブロック | 外部からアクセス不可 | UFW設定 | sudo ufw allow 'Apache Full' |
⭐⭐ |
🔧 デバッグコマンド集
# システム状態の確認
sudo systemctl status apache2 # Apache状態
sudo systemctl status mysql # MySQL状態
sudo systemctl status ufw # ファイアウォール状態
# ネットワーク確認
sudo netstat -tulpn | grep :80 # ポート80の確認
sudo netstat -tulpn | grep :3306 # MySQL ポート確認
curl -I http://localhost # HTTP ヘッダー確認
# ログの確認
sudo tail -20 /var/log/apache2/error.log
sudo tail -20 /var/log/mysql/error.log
# ディスク・メモリ使用量
df -h # ディスク使用量
free -h # メモリ使用量
top # プロセス一覧
🎯 応用演習課題
🌟 初級課題
-
🏠 独自ホームページの作成
- HTML/CSS/PHPを使った自己紹介サイト
- データベースから動的にコンテンツを表示
-
📝 簡単な掲示板システム
- 投稿フォームの作成
- データベースへの投稿保存
-
📊 システム監視ページ
- サーバーの負荷情報を表示
- ログファイルの内容を画面表示
🎯 中級課題
-
🔐 ユーザー認証システム
- ログイン・ログアウト機能
- セッション管理
-
📁 ファイルアップロード機能
- 画像ファイルのアップロード
- セキュアなファイル管理
-
🌐 バーチャルホストの設定
- 複数サイトの運営
- サブドメインの設定
🚀 上級課題
-
🔒 SSL/TLS(HTTPS)の導入
- Let's Encrypt証明書の設定
- HTTP→HTTPS リダイレクト
-
⚡ パフォーマンス最適化
- Apacheの設定チューニング
- PHP-FPMの最適化
-
🐳 Docker化
- LAMP環境のコンテナ化
- Docker Compose での管理
📝 次のステップ(発展学習)
🔧 システム管理・運用
- 🔑 SSH接続・公開鍵認証:セキュアなリモートアクセス
- 🌍 独自ドメインとDNS設定:実際のWebサイト公開
- 🔒 SSL(Let's Encrypt)導入:HTTPS対応
- 📊 監視・ログ管理:Nagios、Zabbix、ELK Stack
- 🔄 自動化:Ansible、Terraform
☁️ クラウド・インフラ
- ☁️ AWS/Azure/GCP:クラウドでのサーバー構築
- 🐳 Docker・Kubernetes:コンテナオーケストレーション
- 🔄 CI/CD:Jenkins、GitHub Actions
- 📈 スケーリング:ロードバランサー、オートスケーリング
🚀 構成の比較・選択
構成 | 用途 | メリット | デメリット | 学習難易度 |
---|---|---|---|---|
🐧 LAMP | 一般的なWeb開発 | 実績豊富、情報多い | やや重い | ⭐⭐ |
⚡ LEMP | 高速Webサイト | Nginxで高性能 | 設定が複雑 | ⭐⭐⭐ |
🐳 Docker | モダン開発 | 環境統一、移植性 | 学習コスト | ⭐⭐⭐ |
☁️ Serverless | スケーラブル | 管理不要、従量課金 | ベンダーロックイン | ⭐⭐⭐ |
📋 実習成果物のまとめ
✅ 提出チェックリスト
- 📁 構築手順書:実行したコマンドとその説明
- 🖼️ スクリーンショット:各ステップの実行結果
- 🌐 動作確認:作成したWebアプリケーションの画面
- 🔧 設定ファイル:apache2.conf、php.ini等のバックアップ
- 📊 システム情報:ハードウェア・ソフトウェア構成
📦 ファイル構成例
学籍番号-サーバー構築-実習1/
├── 手順書.md # 構築手順の詳細
├── screenshots/ # スクリーンショット集
│ ├── apache_install.png # Apache インストール画面
│ ├── php_test.png # PHP 動作確認
│ ├── mysql_setup.png # MySQL セットアップ
│ └── webapp_demo.png # 完成したWebアプリ
├── config_files/ # 設定ファイルのバックアップ
│ ├── apache2.conf
│ ├── php.ini
│ └── mysql.conf
├── source_code/ # 作成したソースコード
│ ├── index.html
│ ├── phpinfo.php
│ └── webapp/
│ └── index.php
└── README.md # 概要と使用方法
📚 学習リソース
📖 公式ドキュメント
🎓 オンライン学習
- 💻 Linux Journey:Linux基礎学習
- 🎯 DigitalOcean Tutorials:実践的なチュートリアル
- 📺 YouTube - Server Administration:動画での学習
🛠️ 実践環境
- ☁️ AWS Free Tier:クラウド実習
- 🔵 DigitalOcean:シンプルなVPS
- 📦 Vagrant:開発環境の自動構築
📋 まとめ
💡 重要ポイント
- 🏗️ 基礎が重要:Linux操作、ネットワーク理解が全ての基盤
- 🔧 実践重視:理論だけでなく、実際に手を動かすことが大切
- 🔒 セキュリティ意識:最初からセキュリティを考慮した構築
- 📊 監視・保守:構築後の運用・メンテナンスも重要
- 🚀 継続学習:技術は常に進歩、継続的なアップデートが必要
🎯 キャリアへの活用
- 💼 Web開発者:LAMP/LEMP環境の理解は必須
- 🛠️ インフラエンジニア:サーバー構築・運用の基礎
- ☁️ クラウドエンジニア:オンプレからクラウドへの移行知識
- 🔒 セキュリティエンジニア:システム全体のセキュリティ理解
🌟 今後の展望
現代のITインフラは急速に進化していますが、基本的なサーバー構築の知識は依然として重要です。クラウドサービスやコンテナ技術が主流になっても、その基盤となる技術を理解していることで、より高度な技術への応用が可能になります 🚀
🚀 おわりに
サーバー構築は最初は難しく感じるかもしれませんが、一つずつステップを踏んで進めば必ずマスターできます 💪
エラーが発生しても諦めずに、ログを確認し、原因を特定して解決する経験が、実際の運用現場で非常に役立ちます。今回の演習で構築したLAMP環境は、多くのWebサービスの基盤となる重要な技術スタックです 🌟
実際に手を動かして、サーバー構築の楽しさと達成感を味わってください! 🎉
この記事が皆さんのサーバー構築学習の第一歩となれば幸いです。インフラエンジニアやWeb開発者への道のりを着実に歩んでいきましょう! 💻✨