まず全体像:リクエストはどこを通るか

この1枚が全ステップの地図です。各ステップで「いま図のどこを触っているか」を意識します。

Aリクエストライフサイクル

ブラウザからのリクエストが VPS 内の Apache → PHP → MySQL を通り、HTML になって返るまで。

ブラウザ利用者
②リクエスト
⑦応答
ApacheHTTPサーバ
:80 / :443
③依頼
⑥HTML
PHP動的にHTML生成
④SQL
⑤結果
MySQLデータ保存
:3306

① 事前に DNS がドメイン→IP を解決 / 行き=②③④、戻り=⑤⑥⑦(HTML レスポンス)。番号は処理の順番。

各部品を「何・なぜ」で知る

全体像の各ブロックを1つずつ、存在理由(なぜ要るか)から掘り下げます。

B-1Linux の3つの土台

ファイル・権限・プロセス。この3つが全ての足場です。

① ファイルシステム階層

/ ルート /etc 設定ファイル /var/www Web公開ファイル /var/log ログ /home ユーザーのホーム

どこに何があるか分かると、設定・ログ・公開先を自分で辿れる。

② ユーザーと権限

root(管理者) ↕ sudo で一時昇格 一般ユーザー(普段) 権限 rwx = 読/書/実行

「Permission denied」の多くはここ。誰が何をできるかを理解する。

③ プロセスと systemd

サービス=常駐プロセス (apache2/mysql/php-fpm) systemctl start 起動 systemctl status 状態 systemctl enable 自動起動

「動かない」時はまず status。ログは journalctl / /var/log。

B-2Apache は「受付」

:80/:443 で待ち受け、VirtualHost で対象サイトを選び、拡張子で静的配信と PHP 処理を振り分けます。

リクエスト/index.php
Apache :80/:443VirtualHost で対象選択
DocumentRoot=/var/www/html
拡張子で
分岐
.html / .css / 画像そのまま返す(静的)
.phpPHP に渡す(動的)→ mod_php / PHP-FPM

B-3MySQL は「データの倉庫」

サーバに接続(:3306 かソケット)して、データベース → テーブル → 行を読み書きします。

PHP(アプリ)PDO/mysqli で接続
mysql コマンド手動で確認
接続
:3306 / socket
データベース app_db

テーブル users id | name | email 1 | 佐藤 | a@ex... 2 | 鈴木 | b@ex... 行 = 1レコード

ユーザーと権限(GRANT)誰が・どのDBに・何を(SELECT/INSERT…)できるか

B-4PHP は毎回実行される

静的ファイルと違い、.php はリクエストごとに上から実行して HTML を作り直します。

静的ファイル(.html)そのまま返す。ファイルの内容 = 返る内容(変わらない)
リクエスト到着
上から実行
必要なら MySQL 照会
HTML 出力して終了状態は残らない

毎リクエストで作り直すから最新データを反映できる。「前回の続き」はセッション等で別途保持する。

つなぎ目(ここが一番つまずく)

初学者が必ず詰まるのは「部品どうしの繋ぎ方」。だから独立した図にしています。

C-1Apache ⇄ PHP のつなぎ方(2方式)

mod_php(Apache に内蔵)と PHP-FPM(別プロセスに転送)。研修は簡単な mod_php から。

方式1:mod_php(Apache に内蔵)
Apache プロセス内部に PHP モジュール(同一プロセスで実行)

○ 設定が簡単・研修向き × 密結合で重い・柔軟性が低い

方式2:PHP-FPM(別プロセスに転送)
Apacheproxy_fcgi
.php転送
PHP-FPM:9000/socket

○ 分離できて本番向き × 設定が一手間(転送先の指定)

C-2PHP ⇄ MySQL のつなぎ方(接続の4点セット)

host/port・dbname・user/pass・権限。1つでも違うと繋がりません。「動かない」の定番。

PHP スクリプト

$pdo = new PDO( "mysql:host=127.0.0.1; port=3306;dbname=app_db", "db_user", "db_pass");

PDO / mysqli どちらでも。値が1つ違うと繋がらない。

接続
接続の4点セット(つなぎ目の正体)
  • ① host / port(どこに)127.0.0.1:3306 か socket
  • ② dbname(どの DB に)
  • ③ user / pass(誰として)
  • ④ 権限 GRANT(何ができる)
MySQL:3306

C-3設定ファイルとログの配置マップ

Ubuntu 系と RHEL 系で置き場所が違います。「設定変更/ログ確認」はまずこの表で場所を特定します。

部品設定(Ubuntu/Debian 系)設定(AlmaLinux/RHEL 系)ログ
Apache /etc/apache2/
apache2.conf
sites-available/*.conf
/etc/httpd/
httpd.conf
conf.d/*.conf
/var/log/apache2/error.log
(RHEL: /var/log/httpd/)
PHP /etc/php/8.x/
apache2/php.ini
fpm/php.ini
/etc/php.ini
/etc/php-fpm.d/
Apache の error.log に出る
(display_errors 次第)
MySQL /etc/mysql/
my.cnf
mysql.conf.d/
/etc/my.cnf
/etc/my.cnf.d/
/var/log/mysql/error.log
(RHEL: /var/log/mysqld.log)

手順のフロー

「順番」には理由があります。なぜその順かを図で押さえます。

D-1VPS を LAMP にする順番

先に接続と安全(①〜④)を固め、その上に各層(⑤〜⑦)を積み、最後に繋いで確認(⑧)します。

① SSH 鍵を作成
② VPS に SSH 接続
③ 作業ユーザー作成 + sudo
④ ファイアウォール(ufw):22/80/443 を許可
安全を確保してから公開
⑤ Apache を install → 起動http://IP で疎通確認
⑥ MySQL を install → 起動初期セキュリティ設定
⑦ PHP を install → Apache と結合phpinfo で確認
⑧ 4層を繋いで動作確認(統合)PHP から MySQL のデータを表示できたら完成

D-2HTTPS 化の流れ

DNS を先に向けるのは、certbot のドメイン所有確認がそこを見るから。順番の意味が分かります。

① ドメインの A レコードを VPS の IP に向ける(DNS)
② certbot を実行(Apache プラグイン)
③ Let's Encrypt がドメイン所有を確認(ACME)
④ 証明書を取得 → /etc/letsencrypt/ に保存
⑤ Apache :443 を有効化(certbot が設定を自動追記)
⑥ https:// でアクセス可(証明書は自動更新)

壊れた時に見る場所(最重要スキル)

「自分で調べて直す」を支える地図。最初から手元に置きます。

Eデバッグ地図

症状から順に、ポート → Apache起動 → PHPエラー → DB接続 → 権限、と切り分けます。

症状:ブラウザでページが出ない
① ポートは開いてる?ss -tlnp / curl -I localhost → FW と待ち受けを確認
OKなら次
② Apache は起動してる?systemctl status apache2 → journalctl -xe
OKなら次
③ PHP がエラー?tail -f /var/log/apache2/error.log → 500 は大抵ここ
OKなら次
④ DB に繋がってる?mysql -u user -p で接続テスト → 4点セット(C-2)を疑う
それでも駄目なら
⑤ 権限を確認ls -l /var/www … 所有者 / rwx
ログの置き場(まず見る場所)

Apache : /var/log/apache2/error.log access.log PHP : Apache の error.log に混ざる MySQL : /var/log/mysql/error.log システム: journalctl -u サービス名

混乱の元を先に潰す(対比)

F-1開発(手元)と本番(VPS)

同じ LAMP でも「誰が見るか・壊した時の影響」が段違い。ここを分けて理解します。

開発環境(自分の PC / WSL)
  • アクセス:http://localhost
  • 自分だけが見られる
  • ファイルは手元にある
  • 壊しても影響なし(試す場所)
  • SSH 不要・FW を意識せず
本番環境(VPS)
  • アクセス:http(s)://ドメイン or 公開IP
  • 世界中から見られる(=守る必要)
  • ファイルはサーバ上(SSH/SFTP で転送)
  • 壊すと公開サービスが止まる
  • SSH 鍵ログイン・FW/権限が必須

F-2Apache と Nginx

研修では設定が学びやすい Apache を正とし、Nginx は概念だけ押さえます。

Apache(本研修で使う)
  • .htaccess でディレクトリ単位の設定
  • mod_php で PHP を内蔵実行できる
  • プロセス / スレッド型
  • 設定が直感的で学習向き・教材が豊富
Nginx(違いを知っておく)
  • イベント駆動で大量接続に強い
  • PHP は PHP-FPM 必須(内蔵不可)
  • .htaccess なし(設定は集中管理)
  • リバースプロキシ用途で定番・高トラフィック本番で多い

カリキュラム(6フェーズ・60ステップ)

上の図解 A〜F が「地図」、ここが「歩き方」です。各ステップは概念 → ゴール → 3段ヒントで構成。ヒントは曖昧 → 具体 → 答えに近いの順で、開くほど詳しくなります。答えのコマンドを丸暗記させず、まず自分で調べて手を動かすための設計です。各フェーズ冒頭の「関連図解」から対応する図へ飛べます。

凡例:任意 は飛ばしてよい発展ステップ(HTML/CSS)。OS別 は Ubuntu 系 / RHEL 系の違い、注意 はつまずきやすい点。

Phase 0 · 8ステップ

前提知識(VPS・SSH)

VPSへのSSH接続と基本的なターミナル操作を習得します。

  1. 0-1VPSとは何かを知る

    VPS(仮想プライベートサーバー)とは、物理サーバーを仮想化技術で分割して提供するサービスです。自分専用の環境を持ちながらコストを抑えて本格的なサーバー運用を体験できます。クラウドサービス(AWS・GCP など)も同様の仕組みを利用していますが、VPS はよりシンプルで低コストな選択肢です。

    ゴール

    1. VPSの定義を自分の言葉で説明できる
    2. クラウド(AWS等)とVPSの違いを理解する
    3. 使用するVPSのOSとIPアドレスを確認できる
    ヒント1(調べる方向)

    「VPS クラウド 違い」で検索してみましょう

    ヒント2(具体化)

    VPSは物理サーバーを仮想化で分割したもの。AWSのEC2も同様の仕組みです

    ヒント3(答えに近い)

    講師から渡されたIPアドレス・ユーザー名・初期パスワードを手元に準備しましょう

  2. 0-2SSHとは何かを知る

    SSH(Secure Shell)は、ネットワーク越しにサーバーを安全に操作するためのプロトコルです。通信内容が暗号化されるため、パスワードやコマンドが盗聴されません。認証方式はパスワード認証と公開鍵認証の2種類があり、公開鍵認証のほうが安全です。

    ゴール

    1. SSHの用途と暗号化の仕組みを説明できる
    2. ポート番号22の意味を理解する
    3. 秘密鍵・公開鍵の役割をそれぞれ説明できる
    ヒント1(調べる方向)

    「SSH 仕組み わかりやすく」で検索してみましょう

    ヒント2(具体化)

    SSHは公開鍵暗号を利用します。公開鍵はサーバーに置き、秘密鍵は自分のPCに保管します

    ヒント3(答えに近い)

    ポート22はSSHのデフォルトポートです。`ssh -p 22 user@host` のように指定します(デフォルトなので省略可)

  3. 0-3SSHで初めてサーバーに接続する

    sshコマンドを使ってVPSに接続します。初回接続時はサーバーの「フィンガープリント」を確認するメッセージが表示されるので、yesと入力して承認してください。接続に成功するとプロンプトがサーバー上に変わります。

    ゴール

    1. sshコマンドの基本構文(ssh ユーザー名@IPアドレス)を理解する
    2. 初回接続のフィンガープリント確認を行い承認できる
    3. プロンプトがサーバー上に変わったことを確認できる
    ヒント1(調べる方向)

    「ssh コマンド 接続 方法」で検索してみましょう

    ヒント2(具体化)

    基本構文は `ssh username@サーバーIP` です。講師から渡された情報を使いましょう

    ヒント3(答えに近い)

    Ubuntu/AlmaLinux共通: `ssh username@your-server-ip` を実行し、"yes" を入力してパスワードを入力します

    OS別 Ubuntu/AlmaLinux共通: `ssh username@your-server-ip`

  4. 0-4ターミナルの基本操作

    pwd・ls・cdコマンドはターミナル操作の基本中の基本です。pwdで現在地を確認し、lsでファイル一覧を表示し、cdでディレクトリを移動します。この3つを覚えるだけでほとんどの場所に移動してファイルを確認できます。

    ゴール

    1. 現在地(pwd)を確認できる
    2. ファイル一覧(ls -la)を表示して隠しファイルも確認できる
    3. ディレクトリを移動(cd)し、cd .. で親へ戻れる
    ヒント1(調べる方向)

    「linux pwd ls cd 使い方」で検索してみましょう

    ヒント2(具体化)

    pwd: 現在地表示 / ls -la: 詳細一覧(隠しファイル含む)/ cd /etc: /etcへ移動 / cd ..: 親ディレクトリへ戻る

    ヒント3(答えに近い)

    `pwd` → `ls -la` → `cd /var/log` → `ls` → `cd ..` の順で試してみましょう

  5. 0-5ファイルとディレクトリを操作する

    touch・echo・cp・mv・rmコマンドでファイルの作成・コピー・移動・削除ができます。mkdir でディレクトリを作成し、rmdir または rm -r で削除できます。ファイル操作はサーバー管理の基本なので確実に身につけましょう。

    ゴール

    1. ファイルを作成(touch / echo "text" > file.txt)できる
    2. ファイルをコピー(cp)できる
    3. ファイルを安全に削除(rm)できる
    ヒント1(調べる方向)

    「linux ファイル 作成 削除 コマンド」で検索してみましょう

    ヒント2(具体化)

    touch test.txt でファイル作成 / cp test.txt test2.txt でコピー / mv でリネームや移動 / rm で削除

    ヒント3(答えに近い)

    `mkdir ~/practice && cd ~/practice && touch hello.txt && cp hello.txt hello2.txt && ls && rm hello2.txt && ls` を試しましょう

    注意 rm -rf は取り消せません。実行前に必ずパスを確認してください。

  6. 0-6ファイルの中身を確認する

    cat・less・tail・grepコマンドでファイルの内容を確認します。catは短いファイル、lessは長いファイルのスクロール表示、tailはログ末尾のリアルタイム監視、grepは特定のキーワードを含む行の検索に使います。

    ゴール

    1. catでファイル全体を表示できる
    2. lessで長いファイルをスクロールしてqで終了できる
    3. grepで特定のキーワードを含む行を検索できる
    ヒント1(調べる方向)

    「linux cat less grep 使い方」で検索してみましょう

    ヒント2(具体化)

    cat /etc/os-release でOSを確認 / less /var/log/syslog で長いログを確認(qで終了)/ grep "error" /var/log/syslog でエラー行を検索

    ヒント3(答えに近い)

    `cat /etc/hostname` → `less /etc/passwd`(qで終了)→ `grep root /etc/passwd` の順で試しましょう

  7. 0-7テキストエディタを使う

    サーバー上でファイルを編集するにはnanoまたはvimを使います。nanoはCtrl+Xで終了できる初心者向けエディタです。vimはモード切替が必要ですが習得すると非常に高速に操作できます。まずはnanoで慣れてからvimに挑戦しましょう。

    ゴール

    1. nanoでファイルを開いて編集し、Ctrl+O→Ctrl+Xで保存・終了できる
    2. vimの基本モード(ノーマルモード・インサートモード)を理解する
    3. vimで編集後に :wq で保存・終了できる
    ヒント1(調べる方向)

    「nano 使い方 基本」または「vim 使い方 初心者」で検索してみましょう

    ヒント2(具体化)

    nano test.txt で開く → Ctrl+O で保存 → Ctrl+X で終了。vim test.txt で開く → i でインサートモード → Esc → :wq で保存終了

    ヒント3(答えに近い)

    `nano ~/test.txt` でファイルを作成し、適当な文字を入力してCtrl+O(ファイル名確認してEnter)→Ctrl+Xで保存・終了してみましょう

    注意 vimを初めて使う場合はnanoから始めることを推奨します。vimを終了できなくなった場合は Esc を何度か押してから :q! を入力してください。

  8. 0-8sudoとユーザー管理

    sudoコマンドを使うと、一般ユーザーでも管理者権限が必要な操作を一時的に実行できます。常にrootとして作業するのは危険なため、必要なときだけsudoを使うのがベストプラクティスです。whoamiコマンドで現在のユーザーを確認できます。

    ゴール

    1. sudoの用途と危険性を理解する
    2. whoamiで現在のユーザーを確認できる
    3. sudoを使ったコマンドを実行できる
    ヒント1(調べる方向)

    「sudo 使い方 意味」で検索してみましょう

    ヒント2(具体化)

    sudo は "superuser do" の略。sudo の後ろにコマンドを付けると管理者権限で実行できます

    ヒント3(答えに近い)

    `whoami` → `sudo whoami`(rootと表示されるはず)→ `sudo ls /root` を試してみましょう

Phase 1 · 7ステップ

Linux基礎

パーミッション・パッケージ管理・サービス管理などLinuxの基本操作を習得します。

  1. 1-1ファイルのパーミッションを読む

    ls -laで表示されるrwxビットはファイルのアクセス権を表します。r(読み取り)・w(書き込み)・x(実行)の3種類があり、owner(所有者)・group(グループ)・other(その他)の3区分に設定できます。755や644のような8進数表記でも表現します。

    ゴール

    1. rwxの意味(r=読み取り、w=書き込み、x=実行)を説明できる
    2. 8進数表記(755、644など)を読み解ける
    3. ファイルとディレクトリのパーミッションの違いを理解する
    ヒント1(調べる方向)

    「linux パーミッション rwx 意味」で検索してみましょう

    ヒント2(具体化)

    ls -la で表示される "-rw-r--r--" のような文字列。左から: ファイル種別 / owner / group / other の順に3文字ずつ

    ヒント3(答えに近い)

    `ls -la /etc/passwd` を実行し、表示された "-rw-r--r--" を読み解いてみましょう。644 = owner:rw / group:r / other:r です

  2. 1-2パーミッションを変更する

    chmodコマンドでファイルやディレクトリのアクセス権を変更できます。8進数表記(chmod 644 file)またはシンボル表記(chmod u+x file)で指定します。Webサーバーの設定ファイルは644、実行ディレクトリは755が基本です。

    ゴール

    1. chmod 644 でファイルのパーミッションを設定できる
    2. chmod 755 でディレクトリのパーミッションを設定できる
    3. 変更前後を ls -la で確認できる
    ヒント1(調べる方向)

    「chmod 使い方 数字」で検索してみましょう

    ヒント2(具体化)

    8進数: 4=r, 2=w, 1=x の合計。644 = owner:rw(6) / group:r(4) / other:r(4)

    ヒント3(答えに近い)

    `touch ~/test.txt && ls -la ~/test.txt && chmod 644 ~/test.txt && ls -la ~/test.txt` を実行して変化を確認しましょう

  3. 1-3所有者を変更する

    chownコマンドでファイルやディレクトリの所有ユーザーとグループを変更します。Webサーバーが読み書きできるよう、ドキュメントルートの所有者をApacheの実行ユーザーに設定することが重要です。

    ゴール

    1. chown でファイルの所有者を変更できる
    2. chown user:group の構文を理解する
    3. Webサーバー用ディレクトリの所有者設定を行える
    ヒント1(調べる方向)

    「chown 使い方 ユーザー グループ」で検索してみましょう

    ヒント2(具体化)

    chown user:group /path/to/file で所有者とグループを同時変更できます

    ヒント3(答えに近い)

    Ubuntu: `sudo chown www-data:www-data /var/www/html` / AlmaLinux: `sudo chown apache:apache /var/www/html`

    OS別 Ubuntu: Apacheの実行ユーザーは www-data / AlmaLinux: Apacheの実行ユーザーは apache

  4. 1-4パッケージ管理ツールを使う

    Linuxではaptやdnfというパッケージ管理ツールを使ってソフトウェアをインストール・更新・削除します。パッケージ一覧を最新化してからインストールするのが基本の流れです。

    ゴール

    1. パッケージ一覧を更新できる
    2. 指定したパッケージをインストールできる
    3. インストール済みパッケージを確認できる
    ヒント1(調べる方向)

    「apt install 使い方」または「dnf install 使い方」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo apt update でリスト更新 → sudo apt install パッケージ名 / AlmaLinux: sudo dnf update → sudo dnf install パッケージ名

    ヒント3(答えに近い)

    Ubuntu: `sudo apt update && sudo apt install curl -y` / AlmaLinux: `sudo dnf update -y && sudo dnf install curl -y`

    OS別 Ubuntu: `sudo apt update && sudo apt install <package>` / AlmaLinux: `sudo dnf update && sudo dnf install <package>`

  5. 1-5サービスを管理する

    systemctlはLinuxのサービス(デーモン)を管理するコマンドです。start/stop/restart でサービスを制御し、enable で OS 起動時の自動起動を設定します。status でサービスの現在の状態を確認できます。

    ゴール

    1. サービスの状態を確認(status)できる
    2. サービスを起動(start)・停止(stop)できる
    3. OS起動時の自動起動(enable)を設定できる
    ヒント1(調べる方向)

    「systemctl 使い方 start stop enable」で検索してみましょう

    ヒント2(具体化)

    sudo systemctl status サービス名 / sudo systemctl start サービス名 / sudo systemctl enable サービス名

    ヒント3(答えに近い)

    `sudo systemctl status ssh` でSSHサービスの状態を確認し、`sudo systemctl enable ssh` で自動起動を設定しましょう

  6. 1-6ファイアウォールを設定する

    ファイアウォールはサーバーへの不正アクセスを防ぐ仕組みです。WebサーバーにはHTTP(ポート80)とHTTPS(ポート443)の通信を許可する必要があります。Ubuntuはufw、AlmaLinuxはfirewalldを使います。

    ゴール

    1. ファイアウォールの状態を確認できる
    2. ポート80・443を開放できる
    3. 設定を永続化できる
    ヒント1(調べる方向)

    「ufw allow 使い方」または「firewalld ポート開放」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo ufw status / sudo ufw allow 80/tcp / sudo ufw enable。AlmaLinux: sudo firewall-cmd --list-all

    ヒント3(答えに近い)

    Ubuntu: `sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw enable` / AlmaLinux: `sudo firewall-cmd --permanent --add-service=http --add-service=https && sudo firewall-cmd --reload`

    OS別 Ubuntu: `sudo ufw allow 80/tcp && sudo ufw allow 443/tcp` / AlmaLinux: `sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --reload`

  7. 1-7システムログを読む

    journalctlコマンドでsystemdが管理するサービスのログを確認できます。/var/logディレクトリにはApache・MySQL・システム全体のログファイルが保存されています。問題が発生したときはまずログを確認する習慣をつけましょう。

    ゴール

    1. journalctlでサービスのログを確認できる
    2. /var/log/syslog(Ubuntu)または/var/log/messages(AlmaLinux)を読める
    3. エラーログとアクセスログの違いを理解する
    ヒント1(調べる方向)

    「journalctl 使い方」「/var/log syslog」で検索してみましょう

    ヒント2(具体化)

    sudo journalctl -u サービス名 でサービスのログ / sudo journalctl -xe でエラー詳細 / tail -f でリアルタイム監視

    ヒント3(答えに近い)

    `sudo journalctl -u ssh --since "1 hour ago"` でSSHのログを確認してみましょう

    OS別 Ubuntu: `/var/log/syslog` / AlmaLinux: `/var/log/messages`

Phase 2 · 10ステップ

Apache(HTTPS含む)

ApacheのインストールからHTTPS設定・バーチャルホストまでWebサーバーの構築を学びます。

  1. 2-1Apacheをインストールする

    ApacheはWebサーバーソフトウェアの定番で、世界中のWebサイトで使われています。Ubuntuではapache2、AlmaLinuxではhttpdパッケージをインストールします。インストール後はデフォルトのテストページが表示されます。

    ゴール

    1. Apacheをインストールできる
    2. Apacheのバージョンを確認できる
    3. インストール後のデフォルトページをブラウザで確認できる
    ヒント1(調べる方向)

    「Apache インストール Ubuntu」または「Apache インストール AlmaLinux」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo apt install apache2 / AlmaLinux: sudo dnf install httpd。その後 apachectl -v でバージョン確認

    ヒント3(答えに近い)

    Ubuntu: `sudo apt update && sudo apt install apache2 -y && apache2 -v` / AlmaLinux: `sudo dnf install httpd -y && httpd -v`

    OS別 Ubuntu: `sudo apt install apache2` / AlmaLinux: `sudo dnf install httpd`

  2. 2-2Apacheを起動して動作確認する

    systemctlでApacheを起動し、enableで自動起動を設定します。起動後はサーバーのIPアドレスをブラウザで開くとApacheのデフォルトページが表示されます。これでWebサーバーが正常に動作していることを確認できます。

    ゴール

    1. Apacheを起動できる
    2. サービスを自動起動に設定できる
    3. ブラウザでデフォルトページにアクセスできる
    ヒント1(調べる方向)

    「systemctl start apache2」または「httpd 起動 確認」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo systemctl start apache2 && sudo systemctl enable apache2 / AlmaLinux: sudo systemctl start httpd && sudo systemctl enable httpd

    ヒント3(答えに近い)

    Ubuntu: `sudo systemctl start apache2 && sudo systemctl enable apache2 && sudo systemctl status apache2` を実行し、Active: active (running) を確認しましょう

    OS別 Ubuntu: サービス名は apache2 / AlmaLinux: サービス名は httpd

    注意 ファイアウォールでポート80を開放しておく必要があります(Phase 1参照)。

  3. 2-3バーチャルホストを設定する

    バーチャルホストを使うと、1台のサーバーで複数のドメインやサイトをホストできます。各サイトに独立したドキュメントルートとログファイルを設定することで、サイトを分離して管理できます。

    ゴール

    1. バーチャルホスト設定ファイルを作成できる
    2. ドキュメントルートとServerNameを指定できる
    3. 設定を有効化してApacheをリロードできる
    ヒント1(調べる方向)

    「Apache バーチャルホスト 設定」で検索してみましょう

    ヒント2(具体化)

    <VirtualHost *:80> ブロックにServerName・DocumentRoot・Directoryを設定します

    ヒント3(答えに近い)

    Ubuntu: /etc/apache2/sites-available/mysite.conf を作成 → sudo a2ensite mysite → sudo systemctl reload apache2 / AlmaLinux: /etc/httpd/conf.d/mysite.conf を作成 → sudo systemctl reload httpd

    OS別 Ubuntu: /etc/apache2/sites-available/ に .conf を作成し a2ensite で有効化 / AlmaLinux: /etc/httpd/conf.d/ に .conf を作成するだけで有効

  4. 2-4HTMLファイルを配置してブラウザで確認する

    ドキュメントルート(通常/var/www/html/)にindex.htmlを作成すると、ブラウザからアクセスできるようになります。ファイルのパーミッションがApacheから読み取れる設定になっているか確認することが重要です。

    ゴール

    1. ドキュメントルートにindex.htmlを作成できる
    2. ブラウザでページが表示されることを確認できる
    3. パーミッション設定が適切であることを確認できる
    ヒント1(調べる方向)

    「Apache ドキュメントルート HTML 表示」で検索してみましょう

    ヒント2(具体化)

    ドキュメントルートは /var/www/html/ です。sudo nano /var/www/html/index.html で作成し、ブラウザでIPアドレスにアクセスします

    ヒント3(答えに近い)

    `echo "<h1>Hello LAMP!</h1>" | sudo tee /var/www/html/index.html && sudo chmod 644 /var/www/html/index.html` を実行しブラウザで確認しましょう

  5. 2-5Apacheのログを読む

    Apacheはアクセスログ(access.log)とエラーログ(error.log)を記録しています。アクセスログはリクエストの記録、エラーログはサーバーエラーの記録です。問題発生時はエラーログを最初に確認しましょう。

    ゴール

    1. アクセスログのフォーマット(IPアドレス・日時・リクエスト・ステータスコード)を読み解ける
    2. エラーログでエラー原因を特定できる
    3. tail -f でリアルタイムにログを監視できる
    ヒント1(調べる方向)

    「Apache アクセスログ エラーログ 読み方」で検索してみましょう

    ヒント2(具体化)

    アクセスログ: 200はOK、404は Not Found、500はサーバーエラーを意味します

    ヒント3(答えに近い)

    Ubuntu: `sudo tail -f /var/log/apache2/access.log` / AlmaLinux: `sudo tail -f /var/log/httpd/access_log` を実行しながらブラウザでアクセスしてみましょう

    OS別 Ubuntu: /var/log/apache2/access.log と error.log / AlmaLinux: /var/log/httpd/access_log と error_log

  6. 2-6Certbotをインストールする

    CertbotはLet's EncryptのSSL証明書を自動で取得・更新するツールです。無料でHTTPS化できます。インストール後に certbot --apache コマンドを実行すると、Apacheの設定を自動で更新してくれます。

    ゴール

    1. Certbotをインストールできる
    2. Certbotのバージョンを確認できる
    3. 証明書取得に必要な条件(ドメインのDNS設定)を理解する
    ヒント1(調べる方向)

    「Certbot インストール Ubuntu」または「Certbot Let's Encrypt」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo snap install --classic certbot → sudo ln -s /snap/bin/certbot /usr/bin/certbot / AlmaLinux: sudo dnf install certbot python3-certbot-apache

    ヒント3(答えに近い)

    インストール後 `certbot --version` でバージョンを確認しましょう

    OS別 Ubuntu: snap でインストール / AlmaLinux: dnf でインストール

    注意 ドメインがサーバーのIPに向いていることを事前に確認してください。DNSが伝播するまで数分〜数時間かかる場合があります。

  7. 2-7SSL証明書を取得する

    certbot --apache コマンドを実行すると、ドメインのSSL証明書を取得してApacheの設定を自動で更新します。証明書は90日間有効で、certbotが自動更新タイマーを設定してくれます。

    ゴール

    1. certbot --apache コマンドで証明書を取得できる
    2. 証明書の有効期限を確認できる
    3. 自動更新が設定されていることを確認できる
    ヒント1(調べる方向)

    「certbot --apache 使い方」で検索してみましょう

    ヒント2(具体化)

    sudo certbot --apache -d your-domain.com を実行。メールアドレスとドメインの入力を求められます

    ヒント3(答えに近い)

    `sudo certbot --apache -d your-domain.com` 実行後、`sudo certbot certificates` で取得した証明書の一覧と有効期限を確認しましょう

  8. 2-8HTTPSで接続を確認する

    SSL証明書を取得したら、ブラウザでhttps://から始まるURLでアクセスしてアドレスバーに鍵マークが表示されることを確認します。鍵マークをクリックすると証明書の詳細情報(発行者・有効期限)を確認できます。

    ゴール

    1. ブラウザのアドレスバーに鍵マークが表示されることを確認できる
    2. 証明書の詳細情報(発行者・有効期限)を確認できる
    3. HTTPSで自分のページにアクセスできる
    ヒント1(調べる方向)

    「ブラウザ HTTPS 証明書 確認 方法」で検索してみましょう

    ヒント2(具体化)

    ブラウザで https://your-domain.com にアクセス。鍵マーク→「この接続は保護されています」→「証明書は有効です」を確認

    ヒント3(答えに近い)

    `curl -I https://your-domain.com` で HTTP/2 200 と SSL handshake が確認できます

  9. 2-9HTTP→HTTPSリダイレクトを設定する

    httpでアクセスされた際に自動的にhttpsへリダイレクトすることで、全通信を暗号化できます。certbotが自動設定してくれる場合もありますが、手動で確認・設定する方法も覚えておきましょう。

    ゴール

    1. リダイレクト設定をバーチャルホストに追加できる
    2. curlでリダイレクト(301/302)を確認できる
    3. ブラウザでhttpアクセスがhttpsに転送されることを確認できる
    ヒント1(調べる方向)

    「Apache HTTP HTTPS リダイレクト 設定」で検索してみましょう

    ヒント2(具体化)

    ポート80のバーチャルホストに Redirect permanent / https://your-domain.com/ を追加します

    ヒント3(答えに近い)

    設定後に `curl -I http://your-domain.com` を実行し、`Location: https://your-domain.com/` と表示されることを確認しましょう

  10. 2-10.htaccessを理解する

    .htaccessはディレクトリ単位でApacheの設定を上書きできる設定ファイルです。URLリライト・Basic認証・アクセス制限などに使います。AllowOverride All が設定されている場合のみ有効になります。

    ゴール

    1. AllowOverrideの意味を理解する
    2. .htaccessでBasic認証を設定できる
    3. .htaccessの使いどころと制限を理解する
    ヒント1(調べる方向)

    「.htaccess 使い方 Basic認証」で検索してみましょう

    ヒント2(具体化)

    AuthType Basic / AuthName "Restricted" / AuthUserFile /etc/apache2/.htpasswd / Require valid-user の4行でBasic認証が設定できます

    ヒント3(答えに近い)

    `sudo htpasswd -c /etc/apache2/.htpasswd username` でパスワードファイルを作成し、.htaccessに認証設定を追加してみましょう

    注意 .htaccessの設定ミスはサイト全体に影響します。変更後は必ず動作確認を行い、エラーが出た場合はすぐに設定を元に戻してください。

Phase 3 · 11ステップ

MySQL

MySQLのインストールからCRUD操作・ユーザー管理・バックアップまでデータベース操作を習得します。

  1. 3-1MySQLをインストールする

    MySQLはオープンソースのリレーショナルデータベース管理システムです。Webアプリケーションのデータ保存に広く使われています。インストール後はsystemctlでサービスを起動してデータベースへの接続準備を行います。

    ゴール

    1. MySQLをインストールできる
    2. MySQLサービスを起動・自動起動設定できる
    3. mysql --version でバージョンを確認できる
    ヒント1(調べる方向)

    「MySQL インストール Ubuntu」または「MySQL インストール AlmaLinux」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo apt install mysql-server / AlmaLinux: sudo dnf install mysql-server。インストール後に sudo systemctl start mysql(またはmysqld)

    ヒント3(答えに近い)

    Ubuntu: `sudo apt install mysql-server -y && sudo systemctl start mysql && mysql --version` / AlmaLinux: `sudo dnf install mysql-server -y && sudo systemctl start mysqld && mysql --version`

    OS別 Ubuntu: パッケージ名は mysql-server、サービス名は mysql / AlmaLinux: パッケージ名は mysql-server、サービス名は mysqld

  2. 3-2MySQLの初期セキュリティ設定

    mysql_secure_installation は MySQL インストール直後に実行すべきセキュリティ設定スクリプトです。rootパスワードの設定・匿名ユーザーの削除・テストデータベースの削除などを対話形式で設定できます。

    ゴール

    1. mysql_secure_installation を実行できる
    2. rootパスワードを設定できる
    3. 匿名ユーザーとテストデータベースを削除できる
    ヒント1(調べる方向)

    「mysql_secure_installation 手順」で検索してみましょう

    ヒント2(具体化)

    `sudo mysql_secure_installation` を実行すると対話形式で質問が始まります。基本的にすべて Y で答えます

    ヒント3(答えに近い)

    `sudo mysql_secure_installation` → パスワードの強度設定でレベルを選択 → rootパスワード設定 → 匿名ユーザー削除(Y) → rootリモートログイン禁止(Y) → テストDB削除(Y) → 権限テーブルリロード(Y)

  3. 3-3MySQLに接続する

    mysqlコマンドラインクライアントを使ってMySQLサーバーに接続します。-u でユーザー名、-p でパスワード入力を指定します。接続に成功すると mysql> プロンプトが表示され、SQL文を実行できるようになります。

    ゴール

    1. mysql -u root -p でMySQLにログインできる
    2. mysql> プロンプトが表示されることを確認できる
    3. SHOW DATABASES; でデータベース一覧を確認できる
    ヒント1(調べる方向)

    「mysql コマンド ログイン」で検索してみましょう

    ヒント2(具体化)

    `sudo mysql -u root -p` を実行し、先ほど設定したrootパスワードを入力します

    ヒント3(答えに近い)

    接続後に `SHOW DATABASES;` を実行してみましょう。最後の ; (セミコロン) を忘れずに

  4. 3-4データベースを作成する

    CREATE DATABASE 文でデータベースを作成します。文字コードとして utf8mb4 を指定することで日本語を正しく扱えます。USE 文でデータベースを選択すると、以降のSQL文がそのデータベースに対して実行されます。

    ゴール

    1. CREATE DATABASE でデータベースを作成できる
    2. USE でデータベースを選択できる
    3. SHOW DATABASES; で一覧に表示されることを確認できる
    ヒント1(調べる方向)

    「MySQL CREATE DATABASE 文字コード」で検索してみましょう

    ヒント2(具体化)

    CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; で日本語対応DBを作成

    ヒント3(答えに近い)

    `CREATE DATABASE lamp_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` → `USE lamp_app;` → `SELECT DATABASE();` で選択を確認

  5. 3-5テーブルを作成する

    CREATE TABLE 文でテーブルの構造(カラム名・データ型・制約)を定義します。PRIMARY KEY で主キーを設定し、AUTO_INCREMENT で自動連番を使います。NOT NULL 制約でNULL値を禁止できます。

    ゴール

    1. 適切なデータ型(INT, VARCHAR, TEXT, DATETIME)でテーブルを作成できる
    2. PRIMARY KEY と AUTO_INCREMENT を設定できる
    3. DESCRIBE テーブル名; でテーブル構造を確認できる
    ヒント1(調べる方向)

    「MySQL CREATE TABLE データ型 一覧」で検索してみましょう

    ヒント2(具体化)

    INT: 整数 / VARCHAR(n): 最大n文字の文字列 / TEXT: 長文 / DATETIME: 日時 / PRIMARY KEY AUTO_INCREMENT: 自動連番の主キー

    ヒント3(答えに近い)

    `CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP);` を実行して `DESCRIBE users;` で確認

  6. 3-6データを挿入する

    INSERT INTO 文でテーブルにデータを追加します。カラム名を明示して値を挿入すると、カラムの順序が変わっても正しく動作します。VALUES で複数行を一度に挿入することもできます。

    ゴール

    1. INSERT INTO ... VALUES で1件データを挿入できる
    2. 複数行を一度に挿入できる
    3. SELECT * FROM テーブル名; でデータを確認できる
    ヒント1(調べる方向)

    「MySQL INSERT INTO 使い方」で検索してみましょう

    ヒント2(具体化)

    INSERT INTO users (name, email) VALUES ('山田太郎', 'yamada@example.com'); でデータを1件挿入

    ヒント3(答えに近い)

    `INSERT INTO users (name, email) VALUES ('山田太郎', 'yamada@example.com'), ('佐藤花子', 'sato@example.com');` で2件同時挿入 → `SELECT * FROM users;` で確認

  7. 3-7データを取得する

    SELECT 文で条件・順序・件数を指定してデータを取得します。WHERE 句で絞り込み、ORDER BY でソート、LIMIT で取得件数を制限できます。これらを組み合わせることで目的のデータを効率よく取得できます。

    ゴール

    1. WHERE 句で条件を指定してデータを絞り込める
    2. ORDER BY でソート(ASC/DESC)できる
    3. LIMIT で取得件数を制限できる
    ヒント1(調べる方向)

    「MySQL SELECT WHERE ORDER BY LIMIT」で検索してみましょう

    ヒント2(具体化)

    SELECT * FROM users WHERE id = 1; / SELECT * FROM users ORDER BY created_at DESC; / SELECT * FROM users LIMIT 10;

    ヒント3(答えに近い)

    `SELECT * FROM users WHERE name LIKE '山田%' ORDER BY id DESC LIMIT 5;` を実行してみましょう

  8. 3-8データを更新・削除する

    UPDATE 文でデータを更新し、DELETE 文でデータを削除します。WHERE 句を付けないと全件が対象になるため非常に危険です。本番環境での操作前には必ず SELECT で対象を確認してから実行しましょう。

    ゴール

    1. UPDATE ... SET で特定のデータを更新できる
    2. DELETE FROM で特定のデータを削除できる
    3. WHERE 句なしの UPDATE/DELETE の危険性を説明できる
    ヒント1(調べる方向)

    「MySQL UPDATE DELETE WHERE 使い方」で検索してみましょう

    ヒント2(具体化)

    UPDATE users SET name = '新しい名前' WHERE id = 1; / DELETE FROM users WHERE id = 1;

    ヒント3(答えに近い)

    更新前に `SELECT * FROM users WHERE id = 1;` で対象を確認 → `UPDATE users SET name = '田中一郎' WHERE id = 1;` → `SELECT * FROM users WHERE id = 1;` で確認

    注意 WHERE句なしのUPDATE/DELETEは全件対象になります。必ずWHERE条件を確認してから実行してください。実行前にSELECTで対象件数を確認する習慣をつけましょう。

  9. 3-9JOINを使う

    INNER JOIN を使うと複数のテーブルのデータを結合して取得できます。ON 句で結合条件(主キーと外部キーの対応)を指定します。関連するデータを1つのクエリで取得できるため、N+1問題を回避できます。

    ゴール

    1. 2つのテーブルを INNER JOIN で結合できる
    2. ON 句で結合条件を正しく指定できる
    3. 結合後のデータを SELECT で確認できる
    ヒント1(調べる方向)

    「MySQL INNER JOIN ON 使い方」で検索してみましょう

    ヒント2(具体化)

    SELECT * FROM orders INNER JOIN users ON orders.user_id = users.id; のように結合します

    ヒント3(答えに近い)

    まず `CREATE TABLE posts (id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, title VARCHAR(255));` → データ挿入 → `SELECT users.name, posts.title FROM posts INNER JOIN users ON posts.user_id = users.id;`

  10. 3-10MySQLユーザーを作成して権限を付与する

    アプリケーション専用のMySQLユーザーを作成し、必要なデータベースへの権限だけを付与するのがセキュリティの基本です。rootユーザーをアプリから直接使うのは避けましょう。GRANT 文で特定のデータベースのみへの権限を設定します。

    ゴール

    1. CREATE USER で新しいMySQLユーザーを作成できる
    2. GRANT で特定データベースへの権限を付与できる
    3. SHOW GRANTS FOR ユーザー名; で権限を確認できる
    ヒント1(調べる方向)

    「MySQL CREATE USER GRANT 権限付与」で検索してみましょう

    ヒント2(具体化)

    CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'password'; → GRANT ALL PRIVILEGES ON lamp_app.* TO 'appuser'@'localhost'; → FLUSH PRIVILEGES;

    ヒント3(答えに近い)

    `CREATE USER 'lamp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';` → `GRANT SELECT, INSERT, UPDATE, DELETE ON lamp_app.* TO 'lamp_user'@'localhost';` → `FLUSH PRIVILEGES;` → `SHOW GRANTS FOR 'lamp_user'@'localhost';`

  11. 3-11データベースをバックアップ・復元する

    mysqldump コマンドでデータベース全体をSQLファイルとしてエクスポートできます。バックアップファイルを mysql コマンドに渡すことで元の状態に復元できます。定期バックアップは本番運用の必須要件です。

    ゴール

    1. mysqldump でバックアップファイルを作成できる
    2. バックアップファイルの内容(CREATE TABLE / INSERT文)を確認できる
    3. mysql コマンドでデータを別のDBに復元できる
    ヒント1(調べる方向)

    「mysqldump 使い方 バックアップ 復元」で検索してみましょう

    ヒント2(具体化)

    mysqldump -u root -p データベース名 > backup.sql でバックアップ / mysql -u root -p 新DB名 < backup.sql で復元

    ヒント3(答えに近い)

    `mysqldump -u root -p lamp_app > ~/lamp_app_backup.sql` → `head -30 ~/lamp_app_backup.sql` で内容確認 → `mysql -u root -p -e "CREATE DATABASE lamp_app_restore;"` → `mysql -u root -p lamp_app_restore < ~/lamp_app_backup.sql`

Phase 4 · 14ステップ

PHP

PHPの基礎からPDOによるDB操作・セッション管理・セキュリティ実装まで習得します。

  1. 4-1PHPをインストールしてApacheと連携する

    PHPはサーバーサイドのスクリプト言語で、Apacheと連携することで動的なWebページを生成できます。php-mysql(php-mysqlnd)モジュールをインストールすることでPHPからMySQLに接続できるようになります。

    ゴール

    1. PHPをインストールできる
    2. php --version でPHPのバージョンを確認できる
    3. phpinfo()を含むPHPファイルをブラウザで表示できる
    ヒント1(調べる方向)

    「PHP インストール Apache 連携 Ubuntu」で検索してみましょう

    ヒント2(具体化)

    Ubuntu: sudo apt install php php-mysql libapache2-mod-php / AlmaLinux: sudo dnf install php php-mysqlnd。インストール後Apacheを再起動

    ヒント3(答えに近い)

    インストール後 `echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php` → ブラウザで http://サーバーIP/info.php にアクセスして確認

    OS別 Ubuntu: `sudo apt install php php-mysql libapache2-mod-php` / AlmaLinux: `sudo dnf install php php-mysqlnd`

    注意 phpinfo()は本番環境では必ず削除してください。サーバーの詳細情報が外部から丸見えになってしまいます。

  2. 4-2PHPファイルを作成して実行する

    PHPファイルは <?php で始まり、echo 文で文字列や変数の値をHTMLとして出力します。変数は $ から始まる名前で宣言し、文字列の結合には . 演算子を使います。

    ゴール

    1. .phpファイルを作成してApacheで実行できる
    2. echoで文字列を出力できる
    3. 変数に値を代入してブラウザに表示できる
    ヒント1(調べる方向)

    「PHP echo 変数 基本」で検索してみましょう

    ヒント2(具体化)

    <?php $name = "LAMP"; echo "<h1>Hello, " . $name . "!</h1>"; ?> というPHPの基本構造を覚えましょう

    ヒント3(答えに近い)

    `sudo nano /var/www/html/hello.php` でファイルを作成し、PHPコードを書いてブラウザで http://サーバーIP/hello.php にアクセスしてみましょう

  3. 4-3フォームからデータを受け取る

    HTMLフォームのmethod="post"で送信されたデータは、PHP の $_POST スーパーグローバル変数で受け取れます。XSS攻撃を防ぐためユーザー入力は必ず htmlspecialchars() でエスケープしてから表示します。

    ゴール

    1. HTMLのformタグにaction属性とmethod="post"を設定できる
    2. $_POST['name'] でフォームの入力値を取得できる
    3. htmlspecialchars() でXSS対策ができる
    ヒント1(調べる方向)

    「PHP $_POST フォーム 受け取り」で検索してみましょう

    ヒント2(具体化)

    <form action="process.php" method="post"> → PHP側で $name = htmlspecialchars($_POST['name']); で安全に取得

    ヒント3(答えに近い)

    `form.html` にフォームを作成し、`process.php` で `echo htmlspecialchars($_POST['message']);` で表示するシンプルな例から始めましょう

    注意 ユーザーから受け取った入力は必ずhtmlspecialchars()でエスケープしてください。エスケープしないとXSS(クロスサイトスクリプティング)攻撃を受ける可能性があります。

  4. 4-4aHTML基礎を学ぶ任意

    HTMLはWebページの構造を定義するマークアップ言語です。タグで要素を囲むことでコンテンツの意味を表現します。セマンティックHTMLを書くことで、検索エンジンやスクリーンリーダーが正しく解釈できるページを作れます。

    ゴール

    1. DOCTYPE宣言・html・head・bodyの基本構造を理解する
    2. 見出し(h1-h6)・段落(p)・リスト(ul/ol/li)・リンク(a)を使える
    3. フォーム(form・input・button)を作成できる
    ヒント1(調べる方向)

    「HTML 基本構造 タグ 一覧」で検索してみましょう

    ヒント2(具体化)

    <!DOCTYPE html><html><head><title>ページタイトル</title></head><body><h1>見出し</h1><p>本文</p></body></html> が最小構成です

    ヒント3(答えに近い)

    `nano ~/practice.html` でHTMLファイルを作成し、見出し・段落・リンク・フォームを含む1ページを作ってブラウザで開いてみましょう

  5. 4-4bCSS基礎を学ぶ任意

    CSSはHTMLの見た目(色・フォント・余白・配置)を指定するスタイルシート言語です。セレクタで対象要素を指定し、プロパティと値でスタイルを定義します。クラスセレクタ(.class)を使うことでスタイルを再利用できます。

    ゴール

    1. セレクタ(element / .class / #id)を使い分けられる
    2. color・font-size・margin・paddingを設定できる
    3. テキストの整形(太字・中央揃え・行間)ができる
    ヒント1(調べる方向)

    「CSS セレクタ プロパティ 入門」で検索してみましょう

    ヒント2(具体化)

    body { font-family: sans-serif; } h1 { color: #333; } .highlight { background-color: yellow; } のように書きます

    ヒント3(答えに近い)

    HTMLファイルの<head>内に<style>タグを追加し、背景色・文字色・余白を変えてブラウザで確認しましょう

  6. 4-4cFlexboxとGridを使う任意

    FlexboxとCSS Gridはモダンなレイアウトを実現するCSS機能です。Flexboxは1次元(行または列)のレイアウトに、Gridは2次元(行と列)のレイアウトに適しています。ナビゲーションバーにはFlexbox、カードレイアウトにはGridが便利です。

    ゴール

    1. display: flex で要素を横並びにできる
    2. justify-content と align-items で配置を制御できる
    3. display: grid で2カラムのカードレイアウトを作れる
    ヒント1(調べる方向)

    「CSS Flexbox 使い方」「CSS Grid レイアウト」で検索してみましょう

    ヒント2(具体化)

    ナビ: nav { display: flex; justify-content: space-between; align-items: center; } / カード: .grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }

    ヒント3(答えに近い)

    ナビゲーションバー(横並びリンク)とカードグリッド(2列)を含むHTMLを作成し、Flexbox/Gridを適用してみましょう

  7. 4-4変数・条件分岐・ループを使う

    PHPの変数型(string・int・array)、if-else による条件分岐、foreach ループを組み合わせることで動的なページを作れます。配列は複数の値をまとめて扱うデータ構造で、foreachで各要素を処理できます。

    ゴール

    1. 変数の型(string / int / array)を使い分けられる
    2. if-else で条件分岐を実装できる
    3. foreach で配列を繰り返し処理できる
    ヒント1(調べる方向)

    「PHP 変数 配列 if foreach 使い方」で検索してみましょう

    ヒント2(具体化)

    $items = ['りんご', 'みかん', 'ぶどう']; foreach ($items as $item) { echo "<li>$item</li>"; } でリストを出力

    ヒント3(答えに近い)

    $score = 75; if ($score >= 80) { echo "合格"; } elseif ($score >= 60) { echo "再試験"; } else { echo "不合格"; } を試しましょう

  8. 4-5MySQLをPHPから操作する(PDO)

    PDO(PHP Data Objects)はPHPからデータベースに接続するための標準インターフェースです。Prepared Statement を使うことでSQLインジェクション攻撃を防ぎながら安全にデータを操作できます。

    ゴール

    1. PDOを使ってMySQLに接続できる
    2. Prepared Statementでデータを取得してHTMLに表示できる
    3. SQLインジェクション対策としてPrepared Statementを使う理由を説明できる
    ヒント1(調べる方向)

    「PHP PDO MySQL 接続 Prepared Statement」で検索してみましょう

    ヒント2(具体化)

    $pdo = new PDO("mysql:host=localhost;dbname=lamp_app;charset=utf8mb4", $user, $pass); → $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); → $stmt->execute([$id]);

    ヒント3(答えに近い)

    new PDO() で接続 → prepare() でSQL準備 → execute() でパラメータを渡して実行 → fetchAll() で結果取得 の4ステップを覚えましょう

    注意 文字列結合でSQLを作ることは絶対に避けてください。必ずPrepared Statementを使ってください。

  9. 4-6セッションとクッキーを使う

    HTTPはステートレスなプロトコルなので、ページをまたいでデータを保持するにはセッションを使います。session_start() でセッションを開始し、$_SESSION にデータを保存することでログイン状態を維持できます。

    ゴール

    1. session_start() でセッションを開始できる
    2. $_SESSION に値を保存・取得できる
    3. session_destroy() でセッションを破棄してログアウトできる
    ヒント1(調べる方向)

    「PHP session_start $_SESSION 使い方」で検索してみましょう

    ヒント2(具体化)

    <?php session_start(); $_SESSION['user_id'] = 1; ?> でセッション保存 / $_SESSION['user_id'] で読み出し / session_destroy() でログアウト

    ヒント3(答えに近い)

    login.php でセッションに user_id を保存 → mypage.php で $_SESSION['user_id'] を確認 → logout.php で session_destroy() を呼ぶ流れを実装しましょう

  10. 4-7エラーハンドリングを実装する

    try-catch ブロックでPDOの例外を捕捉し、error_log() でサーバーのログファイルにエラーを記録します。本番環境では display_errors = Off に設定して、エラー詳細をユーザーに見せないようにします。

    ゴール

    1. try-catch で PDOException を捕捉できる
    2. error_log() でエラーをPHPログファイルに記録できる
    3. 本番環境での display_errors = Off の意味を理解する
    ヒント1(調べる方向)

    「PHP try catch PDOException error_log」で検索してみましょう

    ヒント2(具体化)

    try { $pdo = new PDO(...); } catch (PDOException $e) { error_log($e->getMessage()); echo "エラーが発生しました"; }

    ヒント3(答えに近い)

    php.ini または .htaccess で `display_errors = Off` / `log_errors = On` / `error_log = /var/log/php/error.log` を設定しましょう

  11. 4-8ファイルの読み書きを行う

    file_get_contents() でファイルを一括読み込み、file_put_contents() で一括書き込みができます。fopen/fwrite/fclose を使うと大きなファイルを少しずつ処理できます。file_exists() でファイルの存在確認も行えます。

    ゴール

    1. file_get_contents() でテキストファイルを読み込める
    2. file_put_contents() でファイルにデータを書き込める
    3. file_exists() でファイルの存在確認ができる
    ヒント1(調べる方向)

    「PHP file_get_contents file_put_contents 使い方」で検索してみましょう

    ヒント2(具体化)

    $content = file_get_contents('/path/to/file.txt'); / file_put_contents('/path/to/file.txt', $content, FILE_APPEND); でファイル末尾に追記

    ヒント3(答えに近い)

    `file_put_contents('/tmp/log.txt', date('Y-m-d H:i:s') . " - アクセスあり ", FILE_APPEND);` で簡易ログを実装してみましょう

    注意 Webから直接アクセスできないディレクトリ(/tmp や /var/data など /var/www/html 外)にデータファイルを保存してください。

  12. 4-9セキュリティの基本を実装する

    Webアプリケーションの主要な脆弱性はXSS・SQLインジェクション・CSRFです。XSSは htmlspecialchars() で、SQLインジェクションは Prepared Statement で防ぎます。CSRFはフォームにトークンを埋め込んで検証することで対策できます。

    ゴール

    1. htmlspecialchars() でXSSを防ぐ実装ができる
    2. Prepared Statement で SQLインジェクションを防ぐ実装ができる
    3. CSRFトークンの仕組みを説明できる
    ヒント1(調べる方向)

    「PHP XSS SQLインジェクション CSRF 対策」で検索してみましょう

    ヒント2(具体化)

    CSRF対策: session_start(); $token = bin2hex(random_bytes(32)); $_SESSION['csrf_token'] = $token; → フォームに hidden で埋め込み → POSTで検証

    ヒント3(答えに近い)

    上記3つの脆弱性対策をそれぞれ1行コメントで説明し、実際のコードで実装してみましょう

  13. 4-10簡単なWebアプリを完成させる

    ここまで学んだPHP・MySQL・HTMLを組み合わせて、データの登録・一覧表示・削除ができる簡単なWebアプリを作成します。PDOのPrepared Statement・htmlspecialchars()・セッション管理を組み合わせてセキュアに実装しましょう。

    ゴール

    1. フォームからデータを受け取りDBに登録できる
    2. 登録データをDBから取得してHTML一覧で表示できる
    3. 削除ボタンでデータを削除できる
    ヒント1(調べる方向)

    「PHP MySQL CRUD アプリ 作り方」で検索してみましょう

    ヒント2(具体化)

    index.php(一覧表示 + 削除ボタン)/ add.php(登録フォーム + 処理)の2ファイル構成から始めると整理しやすいです

    ヒント3(答えに近い)

    index.php: SELECT → foreach で表示 + 削除フォーム / add.php: $_POST受け取り → Prepared Statement で INSERT → index.php へリダイレクト

  14. 4-11PHP-FPMの設定を確認する

    PHP-FPM(FastCGI Process Manager)はApacheとPHPを連携させる高性能なプロセス管理ツールです。適切に設定されているか確認することで、PHPが期待どおりに動作していることを保証できます。

    ゴール

    1. PHP-FPMのサービスステータスを確認できる
    2. ApacheのPHP設定ファイル(モジュール設定)を確認できる
    3. phpコマンドとWebからの実行が同じバージョンであることを確認できる
    ヒント1(調べる方向)

    「PHP-FPM Apache 設定確認」で検索してみましょう

    ヒント2(具体化)

    sudo systemctl status php8.1-fpm(バージョンは環境による)でPHP-FPMの状態を確認。php --version とブラウザのphpinfo()のバージョンを照合

    ヒント3(答えに近い)

    `php --version` → `sudo systemctl status php*-fpm` → ブラウザの phpinfo() で PHP Version を確認して一致を確かめましょう

    OS別 Ubuntu: php-fpm のサービス名は php8.x-fpm / AlmaLinux: php-fpm

Phase 5 · 10ステップ

統合確認

LAMPスタック全体の統合動作確認・CRUDアプリ実装・セキュリティチェックで学習を完成させます。

  1. 5-1LAMPスタック全体の動作を確認する

    Linux・Apache・MySQL・PHP の4つすべてが正常に動作していることを一括確認します。各サービスのステータスを確認し、phpinfo()でPHP環境を確認し、ブラウザからHTTPSでアクセスできることを検証します。

    ゴール

    1. Apache・MySQL・PHP-FPMが全て Active (running) であることを確認できる
    2. phpinfo() でPHPとApacheの連携・MySQLモジュールを確認できる
    3. ブラウザでhttps://からアクセスできることを確認できる
    ヒント1(調べる方向)

    「LAMP スタック 動作確認」で検索してみましょう

    ヒント2(具体化)

    sudo systemctl status apache2 mysql php8.x-fpm でまとめて確認できます

    ヒント3(答えに近い)

    `for service in apache2 mysql php8.1-fpm; do sudo systemctl is-active $service && echo "$service: OK"; done` を実行してみましょう

  2. 5-2PHPからMySQLへの接続を確認する

    Phase 3で作成したアプリ用MySQLユーザーを使ってPDOでMySQLに接続し、データを取得してブラウザに表示できることを確認します。接続エラーが出た場合はPHPのエラーログを確認します。

    ゴール

    1. アプリ用MySQLユーザー(root以外)でPDO接続できる
    2. SELECT結果をPHPでHTMLテーブルとして表示できる
    3. 接続エラー発生時にエラーログを確認できる
    ヒント1(調べる方向)

    「PHP PDO MySQL 接続確認」で検索してみましょう

    ヒント2(具体化)

    $pdo = new PDO("mysql:host=localhost;dbname=lamp_app;charset=utf8mb4", "lamp_user", "パスワード"); でアプリユーザーで接続

    ヒント3(答えに近い)

    db_test.php を作成し、PDO接続 → SELECT * FROM users → foreach でHTML表示を実装してブラウザで確認しましょう

  3. 5-3CRUDアプリを実装する

    CRUD(Create・Read・Update・Delete)の4操作を実装することでWebアプリの基本が完成します。フォームからデータを受け取り、PDO Prepared Statementでデータを操作し、結果を一覧表示するフローを実装します。

    ゴール

    1. データの新規登録(Create)ができる
    2. 一覧表示(Read)ができる
    3. 更新(Update)・削除(Delete)ができる
    ヒント1(調べる方向)

    「PHP MySQL CRUD 実装 入門」で検索してみましょう

    ヒント2(具体化)

    index.php(一覧+削除) / create.php(登録) / edit.php(編集) の3ファイル構成が基本です

    ヒント3(答えに近い)

    まず Read(SELECT→表示)と Create(INSERT)を実装して動作確認 → その後 Update(UPDATE)と Delete(DELETE)を追加する順序で進めましょう

    注意 全ての入力値にバリデーションとhtmlspecialchars()エスケープを必ず実装してください。

  4. 5-4フォームバリデーションを実装する

    サーバーサイドバリデーションにより、不正なデータがDBに保存されるのを防ぎます。必須チェック・文字数チェック・メールアドレス形式チェックなどを実装し、エラーがある場合はフォームに戻って入力値を保持したまま表示します。

    ゴール

    1. 必須入力チェックを実装できる
    2. 入力値の型・長さを検証できる
    3. バリデーションエラーをユーザーにわかりやすく表示できる
    ヒント1(調べる方向)

    「PHP バリデーション 入力検証 実装」で検索してみましょう

    ヒント2(具体化)

    empty($_POST['name']) で必須チェック / mb_strlen($str) > 100 で文字数チェック / filter_var($email, FILTER_VALIDATE_EMAIL) でメール形式チェック

    ヒント3(答えに近い)

    $errors = []; if (empty($_POST['name'])) { $errors[] = "名前は必須です"; } if (!empty($errors)) { /* フォームに戻る */ } else { /* DB登録 */ } のパターンで実装しましょう

  5. 5-5セッション管理でログイン機能を実装する

    ユーザーがメールアドレスとパスワードを入力するとDBで照合し、一致した場合はセッションにユーザー情報を保存します。認証が必要なページは冒頭でセッションの有無を確認し、未認証ならログインページにリダイレクトします。

    ゴール

    1. ログイン認証(DBのパスワードハッシュ照合)を実装できる
    2. セッションで認証状態を維持できる
    3. 未認証ユーザーをログインページにリダイレクトできる
    ヒント1(調べる方向)

    「PHP セッション ログイン 認証 実装」で検索してみましょう

    ヒント2(具体化)

    password_verify($input, $hash) でハッシュ照合 / $_SESSION['user_id'] = $user['id'] でセッション保存 / header("Location: /login.php") でリダイレクト

    ヒント3(答えに近い)

    login.php: フォーム表示+処理 / auth_check.php: セッション確認+リダイレクト(requireで読み込む)/ logout.php: session_destroy()+リダイレクト の3ファイル構成で実装しましょう

    注意 パスワードはpassword_hash()でハッシュ化してDBに保存してください。平文保存は絶対に禁止です。

  6. 5-6HTTPSで全機能の動作を確認する

    HTTPS環境でアプリ全体が正常に動作することを確認します。フォーム送信・ログイン・データ操作がすべてHTTPS経由で行われていること、そして証明書が有効であることを最終確認します。

    ゴール

    1. ブラウザでhttps://からアプリにアクセスできる
    2. フォーム送信がHTTPS上で正常に機能する
    3. 証明書の有効期限が十分残っていることを確認できる
    ヒント1(調べる方向)

    「HTTPS 動作確認 SSL証明書 確認」で検索してみましょう

    ヒント2(具体化)

    ブラウザの鍵マークをクリック → 証明書の詳細を確認。curl -I https://your-domain.com でHTTPSレスポンスを確認

    ヒント3(答えに近い)

    `curl -v https://your-domain.com 2>&1 | grep -E "SSL|certificate|expire"` でSSL情報を確認してみましょう

  7. 5-7エラーログを分析する

    ApacheとPHPのエラーログを読み解き、潜在的な問題を発見します。エラーログにはアクセスエラー・PHPの警告・データベース接続エラーなどが記録されています。定期的にログを確認する習慣がシステムの安定運用につながります。

    ゴール

    1. Apacheエラーログを確認してエラーを特定できる
    2. PHPエラーログを確認できる
    3. ログからバグを特定して修正できる
    ヒント1(調べる方向)

    「Apache エラーログ PHP エラーログ 確認」で検索してみましょう

    ヒント2(具体化)

    sudo tail -100 /var/log/apache2/error.log でApacheエラーを確認。PHPのエラーは php.ini の error_log で設定したパスを確認

    ヒント3(答えに近い)

    `sudo grep -i "error|warn|crit" /var/log/apache2/error.log | tail -20` でエラー行だけを抽出して確認しましょう

    OS別 Ubuntu: /var/log/apache2/error.log / AlmaLinux: /var/log/httpd/error_log

  8. 5-8セキュリティチェックリストを確認する

    本番公開前に最低限のセキュリティポイントを確認します。phpinfo()の削除・エラー表示のオフ・ファイルパーミッションの確認・不要なサービスの停止などをチェックリスト形式で確認していきます。

    ゴール

    1. phpinfo()を削除または保護したことを確認できる
    2. php.ini でdisplay_errorsがOffになっていることを確認できる
    3. ドキュメントルート以下のファイルパーミッションが適切であることを確認できる
    ヒント1(調べる方向)

    「PHP 本番環境 セキュリティ設定 チェックリスト」で検索してみましょう

    ヒント2(具体化)

    `ls /var/www/html/info.php` で phpinfo()ファイルが残っていないか確認 / `php -r "echo ini_get('display_errors');"` でエラー表示設定を確認

    ヒント3(答えに近い)

    `find /var/www/html -name "*.php" -perm /o+w` で世界書き込み可能なPHPファイルを探し、0件であることを確認しましょう

    注意 このチェックリストは最低限のものです。本番環境では追加的なセキュリティ設定(ModSecurity・fail2ban等)を常に検討してください。

  9. 5-9パフォーマンスを確認する

    curlの `-w` オプションでHTTPレスポンスタイムを計測できます。Apacheのアクセスログには各リクエストの処理時間が記録されています。ページ表示が遅い場合はDBクエリの最適化・キャッシュの活用・画像の最適化などを検討します。

    ゴール

    1. curlでレスポンスタイムを計測できる
    2. Apacheアクセスログでリクエスト処理時間を確認できる
    3. キャッシュ(OPcache)の基本概念を理解する
    ヒント1(調べる方向)

    「curl レスポンスタイム 計測」「Apache OPcache」で検索してみましょう

    ヒント2(具体化)

    curl -o /dev/null -s -w "total: %{time_total}s " https://your-domain.com でレスポンスタイムを計測できます

    ヒント3(答えに近い)

    `curl -o /dev/null -s -w "dns: %{time_namelookup}s, connect: %{time_connect}s, total: %{time_total}s " https://your-domain.com` を実行してみましょう

  10. 5-10最終成果物を提出する

    LAMPスタックの学習を完了しました。作成したWebアプリのスクリーンショットを撮影し、URLと合わせて提出します。何を学び何ができるようになったかを振り返ることで、学習内容が定着します。

    ゴール

    1. 完成したWebアプリのスクリーンショットを撮影できる
    2. アプリがHTTPS・ログイン・CRUD全機能で正常に動作することを確認できる
    3. 学習の振り返り(できるようになったことのまとめ)を記録できる
    ヒント1(調べる方向)

    ブラウザのスクリーンショット機能または OS のスクリーンショットショートカットを使いましょう

    ヒント2(具体化)

    スクリーンショットには URL バーが写るように撮影すると、HTTPS と動作を同時に証明できます

    ヒント3(答えに近い)

    一覧ページ・登録ページ・ログインページの3枚をスクリーンショットして提出しましょう