0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サーバー構築演習:初心者向けステップバイステップガイド 🛠️

Last updated at Posted at 2025-06-25

サーバー構築演習では、ローカル環境や仮想環境を使って、実際に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                               # プロセス一覧

🎯 応用演習課題

🌟 初級課題

  1. 🏠 独自ホームページの作成

    • HTML/CSS/PHPを使った自己紹介サイト
    • データベースから動的にコンテンツを表示
  2. 📝 簡単な掲示板システム

    • 投稿フォームの作成
    • データベースへの投稿保存
  3. 📊 システム監視ページ

    • サーバーの負荷情報を表示
    • ログファイルの内容を画面表示

🎯 中級課題

  1. 🔐 ユーザー認証システム

    • ログイン・ログアウト機能
    • セッション管理
  2. 📁 ファイルアップロード機能

    • 画像ファイルのアップロード
    • セキュアなファイル管理
  3. 🌐 バーチャルホストの設定

    • 複数サイトの運営
    • サブドメインの設定

🚀 上級課題

  1. 🔒 SSL/TLS(HTTPS)の導入

    • Let's Encrypt証明書の設定
    • HTTP→HTTPS リダイレクト
  2. ⚡ パフォーマンス最適化

    • Apacheの設定チューニング
    • PHP-FPMの最適化
  3. 🐳 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操作、ネットワーク理解が全ての基盤
  • 🔧 実践重視:理論だけでなく、実際に手を動かすことが大切
  • 🔒 セキュリティ意識:最初からセキュリティを考慮した構築
  • 📊 監視・保守:構築後の運用・メンテナンスも重要
  • 🚀 継続学習:技術は常に進歩、継続的なアップデートが必要

🎯 キャリアへの活用

  • 💼 Web開発者:LAMP/LEMP環境の理解は必須
  • 🛠️ インフラエンジニア:サーバー構築・運用の基礎
  • ☁️ クラウドエンジニア:オンプレからクラウドへの移行知識
  • 🔒 セキュリティエンジニア:システム全体のセキュリティ理解

🌟 今後の展望

現代のITインフラは急速に進化していますが、基本的なサーバー構築の知識は依然として重要です。クラウドサービスやコンテナ技術が主流になっても、その基盤となる技術を理解していることで、より高度な技術への応用が可能になります 🚀

🚀 おわりに

サーバー構築は最初は難しく感じるかもしれませんが、一つずつステップを踏んで進めば必ずマスターできます 💪

エラーが発生しても諦めずに、ログを確認し、原因を特定して解決する経験が、実際の運用現場で非常に役立ちます。今回の演習で構築したLAMP環境は、多くのWebサービスの基盤となる重要な技術スタックです 🌟

実際に手を動かして、サーバー構築の楽しさと達成感を味わってください! 🎉


この記事が皆さんのサーバー構築学習の第一歩となれば幸いです。インフラエンジニアやWeb開発者への道のりを着実に歩んでいきましょう! 💻✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?