デビアン11にLinux、Apache、MariaDB、PHP(LAMP)スタックをインストールする方法。
はじめに
「LAMP」スタックは、典型的には共にインストールされるオープンソースソフトウェアのグループであり、サーバーがダイナミックなウェブサイトやウェブアプリケーションをホストできるようにします。この用語は、Linuxオペレーティングシステムを表すアクロニムであり、Apacheウェブサーバーと組み合わされます。サイトのデータはMariaDBデータベースに格納され、動的なコンテンツはPHPで処理されます。
通常、このソフトウェアスタックにはデータベース管理システムとしてMySQLが含まれていますが、Debianを含む一部のLinuxディストリビューションでは、MySQLの代替としてMariaDBが使用されています。
このガイドでは、Debian 11 サーバーに LAMP スタックをインストールし、データベース管理システムとして MariaDB を使用します。
前提条件 (Zentei jouken)
このチュートリアルに従うためには、Debian 11 サーバーと、非ルートのsudoが有効なユーザーアカウント、そして基本的なファイアウォールが必要です。Debian 11 の初期サーバーセットアップガイドを使用してこれらを設定することができます。
ステップ1 — Apacheのインストールとファイアウォールの更新
Apacheウェブサーバーは、世界で最も人気のあるウェブサーバーの一つです。十分なドキュメンテーションがあり、ユーザーの活発なコミュニティが存在し、ウェブの歴史の大部分で広く使用されてきたため、ウェブサイトのホスティングには素晴らしい選択肢です。
最初に、パッケージマネージャーキャッシュの更新から始めてください。もし今回のセッションでsudoを使用するのが初めてならば、システムパッケージをaptで管理するために必要な特権を持っていることを確認するために、ユーザーのパスワードの入力を求められます。
- sudo apt update
その後、以下の手順でApacheをインストールしてください。
- sudo apt install apache2
このコマンドは、Apacheのインストールを確認するように促します。Yと入力して、ENTERキーを押して確認してください。
インストールが完了したら、ファイアウォールの設定を調整する必要があります。初期サーバーのセットアップ手順に従ってUFWファイアウォールをインストールおよび有効化した場合、ファイアウォールがHTTPおよびHTTPSトラフィックを許可していることを確認してください。
Debian 11では、UFWにはアプリのプロファイルが搭載されており、ファイアウォールの設定を調整することができます。以下のコマンドを実行すると、アプリケーションプロファイルの完全なリストを表示できます。
- sudo ufw app list
ウェブサーバーで使用されるポートを管理するために、以下にリストされているWWWプロファイルが使用されます。
Available applications: . . . WWW WWW Cache WWW Full WWW Secure . . .
「WWWのフルプロファイルをufwアプリ情報でインスペクトすると、出力にはポート80と443へのトラフィックが有効になっていることが表示されます。」
- sudo ufw app info “WWW Full”
Profile: WWW Full Title: Web Server (HTTP,HTTPS) Description: Web Server (HTTP,HTTPS) Ports: 80,443/tcp
次に、このプロファイルに対してのHTTPおよびHTTPSの入力トラフィックを許可してください。
- sudo ufw allow in “WWW Full”
計画通りにすべて進んだかどうかを確認するために、ウェブブラウザでサーバーの公開IPアドレスにアクセスしてください。
http://your_server_ip
これにより、情報やテストの目的で提供されるデフォルトのDebian 11 Apacheウェブページが表示されます。
もしブラウザがこのページを表示しているなら、あなたのウェブサーバーは正しくインストールされ、ファイアウォールを通じてアクセスできるようになっています。
サーバーのパブリックIPアドレスを見つける方法
もしサーバーの公開IPアドレスを知らない場合は、いくつかの方法でそれを見つけることができます。通常、SSH経由でサーバーに接続するために使用するアドレスです。
コマンドラインからこれを行う方法はいくつかあります。まず、iproute2ツールを使用してIPアドレスを取得することができます。次のコマンドを実行します。
- ip addr show eth0 | grep inet | awk ‘{ print $2; }’ | sed ‘s/\/.*$//’
これによって、2行または3行戻ることができます。すべてのアドレスは正しいものですが、お使いのコンピューターが利用可能なのは1つだけかもしれませんので、それぞれを試してみてください。
日本語での言い換えは以下の通りです:
外部のパーティに接触して、あなたのサーバーがどのように見えるかを知るために、curlユーティリティを使用するのも代替手法の1つです。以下のコマンドを実行し、特定のサーバーにあなたのIPアドレスを尋ねることができます。
- curl http://icanhazip.com
好きな方法で、サーバーがデフォルトのApacheページが表示されているかどうかを確認するために、Webブラウザに自分のIPアドレスを入力してください。
ステップ2:MariaDBのインストール
ウェブサーバーが稼働しているので、サイトのデータを保管し管理するためにデータベースシステムをインストールする必要があります。
Debian 11では、従来MySQLサーバをインストールするために使用されていたメタパッケージmysql-serverが、default-mysql-serverによって置き換えられました。このメタパッケージは、オラクルによる元々のMySQLサーバのコミュニティフォークであるMariaDBを参照しており、現在はDebianベースのパッケージマネージャーリポジトリで利用可能なデフォルトのMySQL互換データベースサーバです。
長期的な互換性を確保するためには、メタパッケージの代わりに、MariaDBの本当のパッケージであるmariadb-serverを使用してインストールすることが推奨されています。
MariaDBソフトウェアをインストールするには、次のコマンドを実行してください。
- sudo apt install mariadb-server
インストールが完了したら、MariaDBに事前にインストールされているセキュリティスクリプトを実行することをおすすめします。このスクリプトにより、いくつかの安全でないデフォルト設定が削除され、データベースシステムへのアクセスが制限されます。以下のコマンドを実行して、インタラクティブスクリプトを開始してください。
- sudo mysql_secure_installation
このスクリプトでは、一連のプロンプトを通じて、MariaDBのセットアップにいくつかの変更を加えることができます。最初のプロンプトでは、現在のデータベースのルートパスワードを入力するように求められます。これはシステムのルートとは異なるものです。データベースのルートユーザーは、データベースシステムに対して完全な特権を持つ管理ユーザーです。MariaDBをインストールしたばかりでまだ構成の変更を行っていないため、このパスワードは空白ですので、プロンプトでENTERキーを押してください。
次のプロンプトは、データベースのルートパスワードを設定するかどうか尋ねます。MariaDBでは、通常パスワードを使うよりも安全な特別な認証方法をルートユーザーに使用しているため、今は設定する必要はありません。Nを押してからENTERキーを押してください。
そこから、Yを押してからENTERを押すと、その後の全ての質問に対してデフォルト値を受け入れることができます。これにより、匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効化され、さらにこれらの新しいルールがロードされます。そのため、MariaDBはすぐに変更内容を反映するようになります。
作業が終わったら、MariaDBコンソールにログインしてください。
- sudo mariadb
このコマンドを実行する際にsudoが使用されたことにより、管理データベースユーザーであるrootとしてMariaDBサーバーに接続されます。以下のような出力が表示されるはずです。
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 41 Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. MariaDB [(none)]>
Adminユーザーとして接続する際、パスワードを入力する必要がなかったことに気づいてください。このため、管理者用のMariaDBユーザーのデフォルトの認証方法はパスワードではなくunix_socketです。最初はセキュリティ上の懸念のように思えますが、これによりデータベースサーバーはより安全になります。なぜなら、root MariaDBユーザーとしてログインできるのは、コンソールから接続するsudo特権を持つシステムユーザーまたは同じ特権で実行されているアプリケーションからのみ許可されているからです。具体的には、PHPアプリケーションから管理用のデータベースrootユーザーで接続することはできないということです。
セキュリティを強化するためには、特に複数のデータベースをサーバーにホストする予定がある場合は、各データベースに専用のユーザーアカウントを設定し、権限を制限するのが最善です。
以下の方法で、MariaDBコンソールを終了することができます。
- exit
MariaDBサーバーがインストールされ、セキュリティが確保されました。次に、LAMPスタックの最終コンポーネントであるPHPをインストールします。
ステップ3 – PHPのインストール
あなたはコンテンツを提供するためにApacheをインストールし、データを保存および管理するためにMariaDBをインストールしています。PHPは、最終ユーザーに動的なコンテンツを表示するためのコードを処理するセットアップのコンポーネントです。PHPはスクリプトを実行し、情報を取得するためにMariaDBデータベースに接続し、処理されたコンテンツをWebサーバーに渡して表示します。
phpパッケージの他に、PHPがMySQLベースのデータベース(たとえばMariaDB)と通信できるようにするPHPモジュールであるphp-mysqlが必要です。また、ApacheがPHPファイルを処理できるようにするためにlibapache2-mod-phpも必要です。Core PHPパッケージは依存関係として自動的にインストールされます。
これらのパッケージをインストールするには、以下のコマンドを実行してください。
- sudo apt install php libapache2-mod-php php-mysql
インストールが完了したら、次のコマンドでPHPのバージョンを確認することができます。
- php -v
PHP 7.4.30 (cli) (built: Jul 7 2022 15:51:43) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.30, Copyright (c), by Zend Technologies
この時点では、LAMPスタックは完全に稼働していますが、PHPスクリプトでセットアップをテストする前に、ウェブサイトのファイルやフォルダを保持するために適切なApacheのバーチャルホストを設定することが最善です。
ステップ4 – ウェブサイトのための仮想ホストの作成
以下のように、Apache Webサーバーを使用する場合、仮想ホスト(Nginxのサーバーブロックに類似)を作成して、設定詳細をカプセル化し、1つのサーバーから複数のドメインをホストすることができます。このガイドでは、your_domainというドメインを設定しますが、独自のドメイン名に置き換えてください。
Note
デフォルトでは、Apacheは /var/www/html というディレクトリに配置されたコンテンツを提供し、それには /etc/apache2/sites-available/000-default.conf に含まれる設定が使用されます。/var/www/html のデフォルトのウェブサイトの設定ファイルを変更する代わりに、PHP環境をテストするために新しい仮想ホストを作成します。仮想ホストを使用すると、1つのApacheサーバー上で複数のウェブサイトをホスティングすることができます。また、/var/www/html をデフォルトのディレクトリとして残し、クライアントのリクエストが他のサイトに一致しない場合に提供されるよう、/var/www 内にある your_domain サイト用のディレクトリ構造も作成します。
あなたのドメインのルートウェブディレクトリーを作成するには、以下のように始めます。
- sudo mkdir /var/www/your_domain
次に、$USER環境変数を使用して、現在のシステムユーザーを参照するディレクトリの所有権を割り当てます。
- sudo chown -R $USER:$USER /var/www/your_domain
それでは、お好みのコマンドラインエディタを使って、Apacheのsites-availableディレクトリに新しい設定ファイルを開きましょう。ここでは、nanoを使います。
- sudo nano /etc/apache2/sites-available/your_domain.conf
これにより新しい空白ファイルが作成されます。以下の最低限の設定を自分のドメイン名で追加してください。
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
完了したら、ファイルを保存して閉じてください。nanoを使用している場合は、CTRL + X、Y、そしてENTER を押すことで保存と閉じることができます。
このVirtualHostの設定では、Apacheに/var/www/your_domainをウェブルートディレクトリとして使用してyour_domainを提供するよう指示しています。ドメイン名なしでApacheをテストしたい場合は、各オプションの行の先頭にシャープ記号(#)を追加してServerNameとServerAliasのオプションを削除またはコメントアウトできます。
今、a2ensiteを使用してこの仮想ホストを有効にしてください。
- sudo a2ensite your_domain
Apacheにはデフォルトでインストールされているウェブサイトを無効にすることをおすすめします。カスタムドメイン名を使用していない場合は、Apacheのデフォルトの設定が仮想ホストを上書きしてしまうため、これが必要です。Apacheのデフォルトのウェブサイトを無効にするには、次のコマンドを実行してください。
- sudo a2dissite 000-default
構成ファイルに構文エラーが含まれていないことを確認するために、次のコマンドを実行してください。
- sudo apache2ctl configtest
最後に、これらの変更が反映されるようにApacheを再起動してください。
- sudo systemctl reload apache2
次に、PHPが正しくインストールおよび設定されているかをテストするために、PHPスクリプトを作成します。
ステップ5—ウェブサーバー上でのPHP処理のテスト
ウェブサイトのファイルとフォルダをホストするための独自の場所が用意できたので、ApacheがPHPファイルのリクエストを処理できるかどうかを確認するためのPHPのテストスクリプトを作成してください。
まず、カスタムのウェブルートフォルダー内にinfo.phpという名前の新しいファイルを作成してください。
- nano /var/www/your_domain/info.php
これによって、空のファイルが開かれます。有効なPHPコードである以下のテキストをファイルの内部に追加してください。
「/var/www/your_domain/info.php」
<?php
phpinfo();
作業が終わったら、ファイルを保存して閉じてください。
スクリプトをテストするには、ウェブブラウザに移動して、サーバーのドメイン名またはIPアドレスにアクセスし、その後、スクリプト名(この場合はinfo.php)にアクセスしてください。
http://your_domain/info.php
これはデフォルトのPHPウェブページの例です。
このページは、PHPの観点からサーバーに関する情報を提供します。デバッグや設定が正しく適用されているか確認するために役立ちます。
もし、あなたがこのページをブラウザで見ることができれば、PHPのインストールは期待通りに動作しています。
そのページを通じて、あなたのPHPサーバーに関する関連情報を確認した後、PHP環境とDebianサーバーに関する機密情報を含んでいるため、作成したファイルを削除することが最善です。削除するためにrmコマンドを使用してください。
- sudo rm /var/www/your_domain/info.php
後でもう一度情報にアクセスする必要がある場合は、いつでもこのページを再作成できます。
ステップ6 — PHPからのデータベース接続のテスト(オプション)
PHPがMariaDBと接続し、データベースクエリを実行できるかどうかをテストしたい場合は、テストデータを持つテストテーブルを作成し、PHPスクリプトからその内容をクエリしてみることができます。それを行う前に、適切に設定されたテストデータベースと新しいMariaDBユーザーを作成する必要があります。
example_databaseというデータベースと例_userというユーザーを作成します。これらの名前は異なる値に置き換えることもできます。
最初に、rootアカウントを使用してMariaDBコンソールに接続してください。
- sudo mariadb
新しいデータベースを作成するには、MariaDBのコンソールから次のコマンドを実行してください。
- CREATE DATABASE example_database;
今度は新規ユーザーを作成し、作成した独自のデータベースに完全な権限を付与してください。
次のコマンドは、パスワードで認証する新しいユーザー「example_user」を作成します。このユーザーのパスワードは「password」と定義されていますが、安全なパスワードに自分で変更してください。
- CREATE USER ‘example_user‘@‘%’ IDENTIFIED BY ‘password‘;
次に、このユーザーにexample_databaseデータベースの権限を付与してください。
- GRANT ALL ON example_database.* TO ‘example_user‘@‘%’;
この設定により、example_userユーザーはexample_databaseデータベースに対して完全な権限を持つことができますが、他のデータベースの作成や変更はできなくなります。
次に、特権をフラッシュして、それらが保存され、現在のセッションで利用可能になることを確認してください。
- FLUSH PRIVILEGES;
これに従って、MariaDBシェルを終了してください。
- exit
新しいユーザーが適切な権限を持っているかどうかをテストするために、MariaDBコンソールに再度ログインすることで、この場合はカスタムユーザーの資格情報を使用してください。
- mariadb -u example_user -p
このコマンドの中にある -p フラグに注意してください。このフラグは、example_userユーザーを作成する際に使用したパスワードを入力するように求めます。MariaDBコンソールにログインした後、example_databaseデータベースにアクセスできることを確認してください。
- SHOW DATABASES;
これにより、次の出力が得られます。 (Kore ni yori, tsugi no shutsuryoku ga eraremasu.)
+——————–+ | Database | +——————–+ | example_database | | information_schema | +——————–+ 2 rows in set (0.000 sec)
次に、テストテーブルを作成してください。テーブル名はtodo_listです。MariaDBのコンソールから、以下のステートメントを実行してください。
- CREATE TABLE example_database.todo_list (
- item_id INT AUTO_INCREMENT,
- content VARCHAR(255),
- PRIMARY KEY(item_id)
- );
テストテーブルにいくつかの行のコンテンツを挿入してください。さまざまな値を使用して、次のコマンドを数回繰り返し、テストテーブルを埋めるようにしてください。
- INSERT INTO example_database.todo_list (content) VALUES (“My first important item“);
データが正常にテーブルに保存されたことを確認するために、次の操作を実行してください。
- SELECT * FROM example_database.todo_list;
次の出力を受け取ります。
+———+————————–+ | item_id | content | +———+————————–+ | 1 | My first important item | | 2 | My second important item | | 3 | My third important item | | 4 | and this one more thing | +———+————————–+ 4 rows in set (0.000 sec)
テストテーブルに有効なデータがあることを確認したら、MariaDBコンソールから退出することができます。
- exit
今、MariaDBに接続し、コンテンツをクエリするPHPスクリプトを作成できます。お好みのエディタを使用して、カスタムのウェブルートディレクトリに新しいPHPファイルを作成してください。
- nano /var/www/your_domain/todo_list.php
次のPHPスクリプトは、MariaDBデータベースに接続し、todo_listテーブルの内容をクエリして、結果をリストで表示します。もしデータベースの接続に問題がある場合は、例外が発生します。
以下のコンテンツをtodo_list.phpスクリプトに追加してください。ただし、example_userとpasswordの値はご自身のものに置き換えてください。
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
編集が終わったら、ファイルを保存して閉じてください。
あなたのウェブブラウザで、ウェブサイトのドメイン名またはパブリックIPアドレスに続いて/todo_list.phpを訪れることで、このページにアクセスできるようになりました。
http://your_domain/todo_list.php
このウェブページでは、テストテーブルに挿入した内容を訪問者に公開します。
それはあなたのPHP環境がMariaDBサーバーと接続し、対話する準備ができていることを意味します。
結論
このガイドでは、ウェブサーバーとしてApache、データベースシステムとしてMariaDBを使用して、PHPのウェブサイトやアプリケーションを各訪問者に提供する柔軟な基盤を構築しました。
即座に次のステップとして、ウェブサーバーへの接続がHTTPS経由で安全になるように確認する必要があります。それを達成するために、Let’s Encryptを使用することができます。また、PHPにおける依存関係とパッケージの管理にComposerをインストールして使用する方法については、当社のガイドを読むこともできます。