🚀

いちから伝えるwebシステム開発④ 環境構築編(PHPとかMySQLとか)

2023/03/06に公開

前回記事の続きです。
いちから伝えるwebシステム開発③ 環境構築編(仮想環境とかSSHとか)

ハンズオンの取り組みに対する考え方について

今一度前回記事を読み返しつつ、引き続き環境構築作業をやっていきましょう💪

今回も新たな用語・概念がたくさん出てくると思いますが細かいことは気にせず、まずは手を動かしてみて何をするとどうなるのかを体感してみましょう。
詳細な理解は追々でも構いませんし、気になるポイントは自分で調べてみるのも良いでしょう🔍

今回の目標

  • PHP8.2.3 , Apache2.4.54の導入
  • MySQLの導入・初期設定

これで必要最低限の環境構築が完了します。あと一息、がんばりましょう。
また、今回の作業の前にあらかじめrootにユーザーを切り替えておきましょう。

本記事ではちょっとした目玉企画として、Debianに現時点(2023年2月現在)で最新のPHP8.2.3の導入手順も記載していこうと思います。
(後述しますがDebianでインストール可能な標準バージョンと実際の最新バージョンにはズレがあります)

PHPのインストール

PHPのバージョンのこと

結論から先に書いてしまうと、下記コマンドでPHPのインストールが完了します。

apt install -y php

が、PHP公式サイトによれば、2023年2月時点でPHPの最新バージョンは 8.2.3 となっています。
https://www.php.net/archive/2023.php#2023-02-14-2

次に下記コマンドでDebian11に標準インストールされるPHPのバージョンを見てみましょう。

apt show php


Version: 2:7.4+76、とあります。つまりこのまま apt install -y php するとPHP7.4がインストールされることになります(想像以上に古いですね。8.0くらいかなと思ってましたが)

今回の新規環境構築では敢えてPHP7.4を使用する理由は特にないので、
ひと手間加えて最新のPHP8.2をインストールしていきます。

PPAを使って最新のPHP8.2を入れる

PPAとは
"Personal Package Archives"の略
各Linuxディストリビューションが公式で定めている標準バージョンとは異なるバージョンの環境を作りたい場合に、公開されているパッケージを利用することで手軽に好きなバージョンのPHPを導入することができます。

↓はUbuntuのPPAですが、PHPに限らず様々なバージョンのパッケージが公開されています。
https://launchpad.net/ubuntu/+ppas

Debianでも同様のことが実現可能です。早速やってみましょう。

apt install -y apt-transport-https lsb-release ca-certificates wget
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

🙄 何してるの?
"ondrej/php"というPPAパッケージを、ソフトウェアリポジトリとして追加しています。これがあれば好きなバージョンのPHPをインストールすることができるようになります。
https://launchpad.net/~ondrej/+archive/ubuntu/php
1つ目のコマンドはPPAパッケージ追加の前準備です。wgetなど、あらかじめ必要なものをインストールしています。
2つ目で"ondrej/php"を追加しています。wgetとかgpgとか、正体が気になる方は調べてみてください(説明割愛🙇)
3つ目はシェルスクリプトを実行しています。/etc/apt/sources.list.d/ 配下にphp.listというファイルを作ってPPAパッケージの情報を書き込んで保存しています。


apt update
apt upgrade

🙄 何してるの?
最新のPHPをインストールする前に、ここまでに追加したパッケージの依存関係をチェック・更新を行なっています。
複数存在するパッケージはお互いに内容を参照しあったり、パッケージを入れるにあたって前提として入れていなければならない他のパッケージが必要だったりします。
もしパッケージ同士で依存関係があって互いのバージョンの噛み合わせがズレていたりすると、思わぬ不具合の原因になってしまいます。
そういったパッケージ間の関係の整合性をとる作業を人間が手動で全て行うのは大変です(面倒ですし)
そのためここでupdate, upgradeを行って依存関係解決が必要であればよしなに更新してくれます。特に問題なければ何も起こりません。


apt install php8.2 php8.2-cli php8.2-{bz2,curl,mbstring,intl}

🙄 何してるの?
PHP8.2のインストールと、PHPの基本モジュールには含まれない機能の拡張モジュールをインストールしています。
拡張モジュールの一覧はこちら。php.netの公式情報です↓
https://www.php.net/manual/en/extensions.alphabetical.php


apt install php8.2-fpm
a2enconf php8.2-fpm

🙄 何してるの? FPMって何?
FPM(FastCGI Process Manager)はwebサーバー(今回ならApache)上でPHPを動作させるための仕組みです。
https://www.php.net/manual/ja/install.fpm.php

↓FPM・CGI・FastCGIに関する記事があったので紹介しておきます。私も記事執筆しつつ勉強させていただきました🙇
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc


ここまでの作業が完了したら、想定通りPHP本体と拡張モジュールがインストールされたかを確認してみましょう。
バージョン確認します↓

php -v

PHP 8.2.3 (cli) (built: Feb 14 2023 16:53:07) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.3, Copyright (c), by Zend Technologies

最新のPHP8.2.3が入っています👍

続いてPHPのインストール済みモジュール一覧を確認します↓

php -m

[PHP Modules]
bz2
calendar
Core
ctype
curl

(中略)

intl
json
libxml
mbstring
openssl

(中略)

zlib

[Zend Modules]
Zend OPcache

たくさんあるので一部中略しましたが、標準モジュールに加えてcurlやmbstringなど、拡張モジュールもインストールすることができました!

また、この時点でApacheもインストールが完了しています。
Apacheの状態を確認してみましょう。

systemctl status apache2

問題がなければ Active: active(running) と表示され、既にwebサーバーが立ち上がっています。

サーバーが立ち上がっているらしいのでブラウザからアクセスして確認すると、

このようにブラウザからも、Debian上でApacheが動いていることがわかります。

逆に言えばwebサーバーが停止しているならばこの画面は表示されないはずです。
ついでに確認してみましょう。

まずApacheを停止します。

systemctl stop apache2

ステータスを確認します。

systemctl status apache2

Active: inactive(dead) となっています。
ブラウザの表示はどうでしょうか?

想定通りサーバー接続に失敗しました。
これでなんとなくApache(webサーバー)の基本的な役割が見えてきたような気がします👀
Apacheの役目は他にも色々とあるのですが、それは次の機会に説明しますね。

なお、Apacheを起動するときは

systemctl start apache2

これで起動できます。

MySQLのインストール

最後にデータベース(DB)を用意します。DBには様々な種類がありますが今回はMySQLを採用します。

今回の課題制作ではDBにユーザーなどのデータをDB内のテーブルごとに保管・管理する必要があります。
アカウントの登録や更新・削除が出来るようMySQLを用意しましょう。

前準備

ここまでで色々インストールしてきたので前準備としてupdate, upgradeを行います。

apt update
apt upgrade

MySQLのインストールに必要なパッケージを追加でインストールします。

apt install -y software-properties-common gnupg2

GPGキーのインポートを行います。

wget -O- http://repo.mysql.com/RPM-GPG-KEY-mysql-2022 | gpg --dearmor | sudo tee /usr/share/keyrings/mysql.gpg

🙄 何してるの?
MySQLのインストールには、追加リポジトリのインポートが必要になります。
なぜかというと、DebianにはPHPのように標準インストール可能なMySQLリポジトリが含まれていないためです。
追加リポジトリのインポートにはキーによるセキュリティ認証が必要なので、ここでGPGキーというものを先にインポートしています。

追加リポジトリのインポートと、インポート履歴のファイル作成・編集を行います。

echo 'deb [signed-by=/usr/share/keyrings/mysql.gpg] http://repo.mysql.com/apt/debian bullseye mysql-8.0' | tee /etc/apt/sources.list.d/mysql.list

🙄 何してるの?
一つ前の手順で取得したGPGキーを利用して、MySQLインストールに必要なリポジトリを取得しています。
tee 以降はインポート履歴の作成です。

ここらで一旦updateをかけましょう。MySQLインストール前の最後の前準備です。

apt update

インストールと初期設定〜諸々確認

いよいよMySQLのインストールです。やることが多くてうんざりしますがもうちょっとです。

apt install -y mysql-community-server

ここから先はTUI画面での初期設定をいくつか行います。

  1. MySQLのrootパスワードを設定します(Debianのrootとは別)
    今回はわかりやすく secret とでもしておきましょう。本番環境ではちゃんと半角英数記号の組み合わせ、かつそれなりの文字列長で設定しましょう🔐
    確認のため2回入力を求められます。

  2. MySQL8から導入された新しい認証システムについての説明が表示されます。OKを選択します。
    (※検証用の別環境で作業を行った際は↑の表示が出たのですが、同じ環境で再度行った際は表示されず次の認証プラグインの選択画面に進みました。謎です)

  3. 認証プラグインをデフォルト設定にするかどうかの選択肢が表示されます。 RECOMMENDED されているデフォルトを選択します。

MySQLのインストール確認

ここまで正常に手順が進んでいれば、インストールに成功していると思いますのでその確認をしていきましょう。

  1. policyコマンドを使ってインストールしたmysql-community-serverの情報を見てみましょう。
apt policy mysql-community-server

mysql-community-server:
  インストールされているバージョン: 8.0.32-1debian11
  候補:               8.0.32-1debian11
  バージョンテーブル:
 *** 8.0.32-1debian11 500
        500 http://repo.mysql.com/apt/debian bullseye/mysql-8.0 amd64 Packages
        100 /var/lib/dpkg/status

↑このようにインストールされたバージョンの情報やどのパッケージを利用してインストールしたかを確認できればOKです。

  1. 動作ステータス確認をしてみます。
systemctl status mysql

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-03-05 18:52:25 JST; 11min ago
       Docs: man:mysqld(8)
             http://dev.mysql.com/doc/refman/en/using-systemd.html
   Main PID: 4414 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 1114)
     Memory: 387.9M
        CPU: 7.874s
     CGroup: /system.slice/mysql.service
             └─4414 /usr/sbin/mysqld

Active: active(running)となっていれば起動状態です。Apacheの時と同じですね👀

  1. バージョン確認するときはこちら↓
mysql --version
mysql  Ver 8.0.32 for Linux on x86_64 (MySQL Community Server - GPL)

MySQLにログインしてみる

rootユーザーでログインしてみましょう。
下記コマンドを実行するとパスワードを求められるので、先ほど設定した secret を入力します。

mysql -u root -p

-u はログインユーザの指定・ -p はパスワード認証でログインしますよ、という意味のオプションです。

Enter password: (ここでパスワード入力)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

↑このように表示されていればログイン成功です。これでDB上でSQLコマンドの実行が可能になっています。

例えば、

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

こんな感じで実行結果が表示されます。SQL文は大文字でも小文字でも大丈夫です。
ログアウトする時は exit です。

次回予告

ここまでの環境構築作業、大変お疲れ様でした!
これで書いたコードをブラウザで実行することができるようになりました⭕️

次回は、開発を進める上で必須となるツールを導入しつつ、実際に課題に取り組んでいきましょう👍

↓次回導入するもの

  • composer
  • node.js, npm
  • Git

Discussion