Debian 10にLinux、Apache、MariaDB、PHP(LAMP)スタックをインストールする方法
はじめに
LAMPスタックは、通常一緒にインストールされるオープンソースソフトウェアのグループで、サーバーが動的なウェブサイトやウェブアプリをホストできるようにするものです。この用語は、Linuxオペレーティングシステムを表すアクロニムであり、Apacheウェブサーバーと共に使用されます。サイトのデータはMariaDBデータベースに保存され、動的なコンテンツはPHPで処理されます。
通常、このソフトウェアスタックにはデータベース管理システムとしてMySQLが含まれていますが、Debianなどの一部のLinuxディストリビューションではMySQLの代わりにMariaDBがドロップインとして使用されています。
このガイドでは、Debian 10サーバーにLAMPスタックをインストールし、データベース管理システムとしてMariaDBを使用します。
前提条件
このチュートリアルを実行するためには、Debian 10 サーバーが必要です。そのサーバーには、非ルート sudo 有効ユーザーアカウントと基本的なファイアウォールが設定されている必要があります。この構成は、Debian 10 の初期サーバー設定ガイドを使って行うことができます。
ステップ1:Apacheのインストールとファイアウォールの更新
世界でも最も人気のあるWebサーバーの一つ、Apacheウェブサーバー。十分にドキュメント化され、ウェブの歴史の大部分で広く使用されているため、ウェブサイトをホスティングする際の優れたデフォルトの選択肢と言えます。
最初にパッケージマネージャのキャッシュを更新します。セッション内で初めてsudoを使用する場合、システムパッケージを管理するための適切な権限を持っていることを確認するために、ユーザーのパスワードの入力が求められます。
- sudo apt update
次の手順でApacheをインストールしてください。
- sudo apt install apache2
このコマンドは、Apacheのインストールを確認するためのプロンプトが表示されます。Yキーを押してENTERキーを押すことで確認してください。インストールが完了したら、ファイアウォールの設定を調整する必要があります。最初のサーバーのセットアップ手順に従ってUFWファイアウォールをインストールと有効化したと仮定して、ファイアウォールがHTTPおよびHTTPSトラフィックを許可するようにしてください。
Debian 10では、UFWにはアプリケーションプロファイルがロードされており、ファイアウォールの設定を調整するために使用できます。アプリケーションプロファイルの完全なリストを表示するには、次のコマンドを実行してください。
- sudo ufw app list
WWWプロファイルは、ウェブサーバーによって使用されるポートを管理するために使用されます。
Available applications: . . . WWW WWW Cache WWW Full WWW Secure . . .
WWWのフルプロファイルを調査すると、ポート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 10 Apacheウェブページが表示されます。
もしもあなたのブラウザがこのページを表示した場合、あなたのウェブサーバーは正しくインストールされ、ファイアウォールを経由してアクセス可能になっています。
サーバーの公開 IP アドレスを見つける方法
もしサーバーの公開IPアドレスがわからない場合は、いくつかの方法で見つけることができます。通常、これはSSH経由でサーバーに接続する際に使用するアドレスです。
コマンドラインからこれを行うためにいくつかの異なる方法があります。まず、iproute2ツールを使用して次のコマンドを実行してIPアドレスを取得することができます。
- ip addr show eth0 | grep inet | awk ‘{ print $2; }’ | sed ‘s/\/.*$//’
これにより、2行または3行前に戻ります。すべて正しいアドレスですが、お使いのコンピューターは1つしか使用できない場合がありますので、それぞれ試してみてください。
別の方法は、curlユーティリティを使用して外部の機関に接触し、サーバーがどのように表示されているかを教えてもらうことです。次のコマンドを実行し、特定のサーバーに自分のIPアドレスを尋ねることができます。
Debian 10では、デフォルトでcurlがインストールされていないため、最初にインストールする必要があります。
- sudo apt install curl
その後、次のコマンドを実行し、特定のサーバーに自分のIPアドレスを尋ねてください。
- curl http://icanhazip.com
どの方法を使用しても、Webブラウザに自分のIPアドレスを入力して、サーバーがデフォルトのApacheページで稼働していることを確認してください。
ステップ2 — MariaDBのインストール
ウェブサーバーを立ち上げたので、サイトのデータを保存して管理するためにデータベースシステムをインストールする必要があります。
デビアン10では、従来MySQLサーバーをインストールするために使用されていたメタパッケージであるmysql-serverは、default-mysql-serverによって置き換えられました。このメタパッケージは、Oracleによる元のMySQLサーバーのコミュニティフォークであるMariaDBを参照しており、現在、デビアンベースのパッケージマネージャーリポジトリで利用可能なデフォルトのMySQL互換データベースサーバーです。
長期の互換性を考えると、metapackageを使用する代わりに、実際のパッケージであるmariadb-serverを使ってMariaDBをインストールすることがおすすめです。
MariaDBソフトウェアをインストールするには、次を実行してください:
- sudo apt install mariadb-server
インストールが終了したら、MariaDBには事前にインストールされているセキュリティスクリプトを実行することをおすすめします。このスクリプトはいくつかの安全ではないデフォルト設定を削除し、データベースシステムへのアクセスを制限します。インタラクティブなスクリプトを実行するには、次のコマンドを実行してください。
- sudo mysql_secure_installation
このスクリプトでは、MariaDBのセットアップにいくつかの変更を加えるための一連のプロンプトを表示します。最初のプロンプトでは、現在のデータベースのルートパスワードを入力するように求められます。このパスワードはシステムのルートと混同しないでください。データベースのルートユーザーは、データベースシステム全体に完全な権限を持つ管理ユーザーです。最近MariaDBをインストールしたばかりで、まだ構成の変更を行っていないため、このパスワードは空白のままで、プロンプトでENTERキーを押してください。
次のプロンプトでは、データベースのルートパスワードの設定を希望するかどうかを尋ねます。MariaDBでは、通常のパスワードよりも安全な特別な認証方法を使用するため、今は設定する必要はありません。Nキーを押してからENTERキーを押してください。
それから、すべての後続の質問に対してデフォルトの設定を受け入れるために、Yを押してからENTERキーを押すことができます。これにより、匿名ユーザーとテストデータベースが削除され、リモートルートログインが無効にされ、これらの新しいルールがロードされるため、MariaDBはすぐにあなたが行った変更を反映します。
終わったら、MariaDBコンソールにログインしてください。
- sudo mariadb
このコマンドを実行することで、管理データベースユーザーであるrootでMariaDBサーバーに接続されます。sudoを使用してこのコマンドを実行するため、以下の出力が表示されるはずです。
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 42 Server version: 10.3.36-MariaDB-0+deb10u2 Debian 10 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)]>
管理者のMariaDBユーザーのデフォルト認証方法はパスワードではなく、unix_socketであるため、ルートユーザーとして接続する際にパスワードを提供する必要がないことに気づきます。最初はセキュリティ上の懸念のように思えるかもしれませんが、これによりデータベースサーバーはより安全になります。ルートのMariaDBユーザーとしてログインできるのは、コンソールから接続するsudo特権を持つシステムユーザーまたは同じ特権で動作しているアプリケーションからのみです。具体的には、PHPアプリケーションから管理用のデータベースルートユーザーを使用して接続することはできません。
セキュリティを向上させるためには、特に複数のデータベースをサーバーにホストする予定がある場合、各データベースに専用のユーザーアカウントを設定し、特権を緩やかにすることが最善です。
以下の方法でMariaDBのコンソールを終了することができます。
- exit
MariaDBサーバーのインストールとセキュリティ設定が完了しました。次に、LAMPスタックの最終コンポーネントであるPHPをインストールします。
ステップ3:PHPのインストール
あなたは、コンテンツを提供するためにApacheをインストールし、データを保存・管理するためにMariaDBをインストールしています。PHPは、セットアップのコンポーネントであり、コードを処理してダイナミックなコンテンツを最終ユーザーに表示します。PHPはスクリプトを実行し、情報を取得するためにMariaDBデータベースに接続し、処理されたコンテンツをウェブサーバーに渡して表示します。
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.3.31-1~deb10u2 (cli) (built: Dec 15 2022 09:39:10) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.31, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.31-1~deb10u2, Copyright (c) 1999-2018, by Zend Technologies
ほとんどの場合、Apacheがファイルを提供する方法を変更したいと思うでしょう。現在、ユーザーがサーバーからディレクトリをリクエストした場合、Apacheは最初にindex.htmlというファイルを検索します。他のファイルよりもPHPファイルを優先させるようにウェブサーバーに指示するためには、Apacheを最初にindex.phpファイルを検索するように設定することができます。
これを行うには、以下のコマンドを実行してdir.confファイルを好みのテキストエディタでルート権限で開きます。この例では、nanoを使用しています。
- sudo nano /etc/apache2/mods-enabled/dir.conf
以下の内容になります:
以下は日本語での再表現です:
「/etc/apache2/mods-enabled/dir.conf」
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>
以下のように、DirectoryIndex指定の後ろにPHPのインデックスファイルを最初の位置に移動してください。
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
作業が終わったら、ファイルを保存して閉じてください。もしnanoを使っている場合は、CTRL+Xを押してから、Y、ENTERを押して確認してください。
今、Apacheの設定を再読み込みしてください。
- sudo systemctl reload apache2
systemctl statusコマンドを使用して、apache2サービスの状態を確認できます。
- sudo systemctl status apache2
● apache2.service – The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: Active: active (running) since Fri 2023-01-20 22:21:24 UTC; 2min 12s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 13076 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCC Process: 13097 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/ Main PID: 13080 (apache2) Tasks: 6 (limit: 4915) Memory: 13.7M CGroup: /system.slice/apache2.service ├─13080 /usr/sbin/apache2 -k start ├─13101 /usr/sbin/apache2 -k start ├─13102 /usr/sbin/apache2 -k start ├─13103 /usr/sbin/apache2 -k start ├─13104 /usr/sbin/apache2 -k start └─13105 /usr/sbin/apache2 -k start
この時点で、あなたのLAMPスタックは完全に稼働していますが、PHPスクリプトでセットアップをテストする前に、ウェブサイトのファイルとフォルダを保持するための適切なApache仮想ホストを設定することが最善です。次のステップでこれを設定します。
ステップ4 – ウェブサイトのための仮想ホストを作成します。
Apacheウェブサーバーを使用する際には、1つのサーバーから複数のドメインをホストするために、設定の詳細をカプセル化するための仮想ホスト(Nginxのサーバーブロックに似たもの)を作成することができます。このセクションでは、your_domainというドメインを設定しますが、ご自身のドメイン名に置き換えてください。
Note
デフォルトでは、Apacheは/var/www/htmlにあるディレクトリからコンテンツを提供し、/etc/apache2/sites-available/000-default.confに含まれる設定を使用します。デフォルトのウェブサイトの設定ファイルを変更する代わりに、PHP環境のテスト用に新しい仮想ホストを作成します。仮想ホストを使用すると、複数のウェブサイトを1つのApacheサーバーでホストすることができます。また、your_domainサイトのために/var/www内にディレクトリ構造も作成し、クライアントのリクエストが他のサイトと一致しない場合はデフォルトのディレクトリである/var/www/htmlを提供します。
次に、あなたのドメインのルートウェブディレクトリを以下のように作成してください。
- 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>
この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 ー WebサーバーでのPHP処理のテスト
ウェブサイトのファイルとフォルダをホストするための独自の場所を持った今、ApacheがPHPファイルのリクエストを処理できるかどうかを確認するために、PHPのテストスクリプトを作成してください。
カスタムのウェブルートフォルダ内に「info.php」という名前の新しいファイルを作成してください。
- nano /var/www/your_domain/info.php
これにより、空白のファイルが開かれます。次に、有効なPHPコードである以下のテキストをファイル内に追加してください。
/var/www/your_domain/info.phpを日本語で言い換えると:
/バー/WWW/あなたの_ドメイン/情報.php
<?php
phpinfo();
作業が終わったら、ファイルを保存して閉じてください。
以下のように、日本語で自然な文に言い直してみましょう:
スクリプトをテストするために、ウェブブラウザを開き、サーバーのドメイン名またはIPアドレスにアクセスし、その後にスクリプト名を入力します。この場合、スクリプト名はinfo.phpです。
http://your_domain/info.php
こちらはデフォルトのPHPウェブページの例です。 (Kochira ha deforuto no PHP u~ebu pe–ji no rei desu.)
このページはPHPの観点から、サーバーに関する基本的な情報を提供します。デバッグや設定が正しく適用されているかを確認するのに役立ちます。
もしブラウザでこのページを表示しているなら、PHPのインストールが正常に動作しています。
そのページを通じてPHPサーバーに関する関連情報を確認した後は、PHP環境とDebianサーバーに関する機密情報が含まれているため、作成したファイルを削除するのがベストです。削除するには「rm」コマンドを使用できます。
- sudo rm /var/www/your_domain/info.php
必要ならば、後で再び情報にアクセスするためにいつでもこのページを再作成することができます。
ステップ6 — PHPからデータベース接続のテスト(オプション)
PHPがMariaDBに接続し、データベースのクエリを実行できるかどうかをテストしたい場合は、テストデータとともにテストテーブルを作成し、PHPスクリプトからその内容をクエリすることができます。その前に、データベースを作成し、適切に構成された新しいMariaDBユーザーを作成してアクセスできるようにする必要があります。
最初に、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_database データベースの管理権限を持つ example_user ユーザーに与えられますが、このユーザーが他のデータベースを作成または変更することをサーバーで防止します。
次に、特権をフラッシュして保存され、現在のセッションで利用可能にしてください。
- FLUSH PRIVILEGES;
これに続いて、MariaDBシェルを終了してください。
- exit
新しいユーザーが適切な権限を持っているかテストするために、MariaDBコンソールに再びログインして、今度はカスタムユーザーの資格情報を使用してください。
- mariadb -u example_user -p
MariaDBコンソールにログインした後、例示ユーザーを作成する際に使用したパスワードを入力するためのこのコマンドの「-p」フラグに注意してください。例示データベースへのアクセスができるかどうかを確認してください。
- SHOW DATABASES;
以下の出力が得られます。
+——————–+ | 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を使用しています。
- nano /var/www/your_domain/todo_list.php
以下のPHPスクリプトは、MariaDBデータベースに接続し、todo_listテーブルの内容をクエリして、結果をリスト形式で表示します。データベース接続に問題がある場合は、例外が発生します。
自分自身の例のユーザー名とパスワードの値に置き換えることを忘れずに、このコンテンツをtodo_list.phpスクリプトに追加してください。
<?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をWebサーバー、MariaDBをデータベースシステムとして使用して、訪問者にPHPウェブサイトやアプリケーションを提供するための柔軟な基盤を構築しました。
次の具体的なステップとして、ウェブサーバーへの接続をHTTPS経由で安全にするようにしてください。それを実現するために、Let’s Encryptを使用することができます。また、PHPの依存関係とパッケージ管理のためのComposerのインストールと使用方法についてのガイドも読むことができます。