Debian 12にLEMPスタック(Nginx、PHPおよびMariaDB)をインストールする方法
Debian 12にLEMPスタック(Nginx、PHPおよびMariaDB)をインストールする方法
このチュートリアルはこれらのOSバージョンのために存在します
- Debian 12 (ブックワーム)
- Debian 11 (バルセイヤ)
- Debian 9(ストレッチ)
- Debian 8 (ジェシー)
- Debian 6 (スキューズ)
- Debian 5 (Lenny)
このページで
- 前提条件
- ステップ1 - ファイアウォールを設定する
- ステップ2 - PHPをインストールする
- ステップ3 - MariaDBをインストールする
- ステップ4 - MariaDBの設定
- ステップ5 - Nginxをインストールする
- ステップ6 - PHP-FPMを設定する
- ステップ7 - phpMyAdminをインストールする
- ステップ8 - phpMyAdminを設定する
- ステップ9 - Opcacheを設定する
- ステップ10 - SSL用のCertbotをインストールする
ステップ11 - デモサイトをテストする
- サイトを作成する
- SSL証明書を作成する
- Nginxを設定する
LinuxのLEMPスタックは、ウェブアプリケーションの開発とホスティングに人気のあるソフトウェアバンドルです。これは、4つの主要なコンポーネントから構成されています:Linux、Nginx(「エンジン-X」と発音)、MySQLまたはMariaDB(リレーショナルデータベース)、およびPHP(人気のあるウェブプログラミング言語)です。この設定では、Linuxがオペレーティングシステムであり、NginxがHTTPリクエストを処理し、画像や.cssファイルなどの静的コンテンツを提供するウェブサーバーです。MySQL、または私たちのケースではMariaDBはデータベースシステムとして使用されます。PHPはウェブコンテンツを生成し、データベースと動的に相互作用するために使用されるスクリプト言語です。これらのコンポーネントは、ウェブサイトやウェブアプリケーションを構築および展開するための堅牢でスケーラブルな環境を形成します。
このガイドでは、数日前にリリースされたDebian 12(bookworm)サーバーにLEMPスタックをインストールする方法を学びます。また、phpMyAdminなどのアプリケーションをインストールする方法も学びます。
前提条件
Debian 12を実行しているサーバー。
sudo権限を持つ非ルートユーザー。
サーバーを指す完全修飾ドメイン名(FQDN)として example.com があります。
簡易ファイアウォール(UFW)が有効で実行中です。
すべてが更新されています。
sudo apt update && sudo apt upgrade
あなたのシステムに必要ないくつかのパッケージ。
sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
これらのパッケージの一部は、すでにあなたのシステムにインストールされている可能性があります。
ステップ1 - ファイアウォールを設定する
パッケージをインストールする前の最初のステップは、HTTPおよびHTTPS接続を許可するようにファイアウォールを設定することです。
ファイアウォールの状態を確認してください。
sudo ufw status
次のようなものが表示されるはずです。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
HTTPおよびHTTPSポートを許可します。
sudo ufw allow http
sudo ufw allow https
再度ステータスを確認して、確認してください。
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
ステップ2 - PHPをインストールする
Debian 12はデフォルトでPHP 8.2を搭載しています。次のコマンドを実行することでインストールできます。
sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-gd
私たちはPHPのMySQL、CLI、GD、Mbstring、およびXML拡張機能をインストールしました。必要に応じて、追加の拡張機能をインストールできます。
最新のPHPバージョンを常に使用するか、複数のPHPバージョンをインストールしたい場合は、OndřejのPHPリポジトリを追加してください。
まず、SuryのリポジトリのPHP GPGキーをインポートします。
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
Ondrej SuryのPHPリポジトリを追加してください。
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
システムのリポジトリリストを更新します。
sudo apt update
さあ、任意のバージョンのPHPをインストールできます。
sudo apt install php8.1-fpm php8.1-cli
インストールされているPHPのバージョンを確認してください。
php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
ステップ3 - MariaDBをインストールする
Debian 12にはデフォルトでMySQLが含まれておらず、公式パッケージもまだリリースされていません。そのため、MariaDBを使用します。MariaDBもDebian 12用の公式パッケージはありませんが、Debianにはそれが含まれています。したがって、以下のコマンドを使用してインストールしてください。
sudo apt install mariadb-server
MySQLのバージョンを確認してください。
mysql --version
mysql Ver 15.1 Distrib 10.11.3-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
MariaDBのセキュアインストールスクリプトを実行します。
sudo mysql_secure_installation
ルートパスワードが求められます。パスワードを設定していないので、エンターを押してください。
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
次に、Unixソケット認証方法に切り替えるかどうかを尋ねられます。unix_socketプラグインを使用すると、オペレーティングシステムの資格情報を使用してMariaDBサーバーに接続できます。保護されたルートアカウントをすでに持っているため、続行するにはnを入力してください。
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n
次に、ルートパスワードを変更するかどうか尋ねられます。Debian 12では、ルートパスワードは自動システムメンテナンスに密接に関連しているため、そのままにしておくべきです。nと入力してさらに進んでください。
... skipping.
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n
次に、MariaDBのセキュリティを向上させるために特定の質問をされます。匿名ユーザーを削除するにはYを入力し、リモートルートログインを禁止し、テストデータベースを削除し、特権テーブルを再読み込みします。
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
コマンドラインで sudo mysql または sudo mariadb と入力することで、MariaDB シェルに入ることができます。
ステップ4 - MariaDBの設定
MariaDBシェルにログインします。
sudo mysql
サンプルデータベースを作成してください。
MariaDB> CREATE DATABASE exampledb;
SQLユーザーアカウントを作成します。
MariaDB> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';
データベースのすべての特権をそのユーザーに付与します。
MariaDB> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';
ルートユーザーを変更しないため、管理タスクを実行するための別のSQLユーザーを作成し、パスワード認証を使用する必要があります。このユーザーには強力なパスワードを選んでください。
MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;
ユーザー権限を消去します。
MariaDB> FLUSH PRIVILEGES;
シェルを終了してください。
MariaDB> exit
新しく作成したユーザーを使って、もう一度MySQLシェルにログインしましょう。
sudo mysql -u exampleuser -p
テストテーブルを作成してください。
MariaDB> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );
テストデータを挿入します。
MariaDB> INSERT INTO exampledb.name_list (content) VALUES ("Navjot");
上記のコマンドを複数回繰り返して、さらにエントリを追加してください。テーブルの内容を確認するには、次のコマンドを実行してください。
MariaDB> SELECT * FROM exampledb.name_list;
次の出力を受け取ります。
+-----+---------+
| sno | content |
+-----+---------+
| 1 | Navjot |
| 2 | Adam |
| 3 | Josh |
| 4 | Peter |
+-----+---------+
4 rows in set (0.00 sec)
MySQLシェルを終了します。
MariaDB> exit
ステップ5 - Nginxをインストールする
Debian 12 には古いバージョンの Nginx が付属しています。最新バージョンをインストールするには、公式の Nginx リポジトリをダウンロードする必要があります。
Nginxの署名キーをインポートします。
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Nginxの安定版のリポジトリを追加してください。
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
システムリポジトリを更新してください。
sudo apt update
Nginxをインストールします。
sudo apt install nginx
インストールを確認してください。Debianシステムでは、次のコマンドはsudoと一緒にしか動作しません。
sudo nginx -v
nginx version: nginx/1.24.0
Nginxを起動する。
sudo systemctl start nginx
サービスの状態を確認してください。
sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-06-15 16:33:46 UTC; 1s ago
Docs: https://nginx.org/en/docs/
Process: 2257 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 2258 (nginx)
Tasks: 2 (limit: 1108)
Memory: 1.8M
CPU: 6ms
CGroup: /system.slice/nginx.service
??2258 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??2259 "nginx: worker process"
ステップ 6 - PHP-FPMの設定
php.iniを編集するために開いてください。
sudo nano /etc/php/8.2/fpm/php.ini
ファイルアップロードサイズを設定するには、upload_max_filesizeおよびpost_max_size変数の値を変更してください。
upload_max_filesize = 50M
...
post_max_size = 50M
サーバーのリソースと要件に応じて、PHPのメモリ制限を設定してください。
memory_limit = 256M
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
ファイルを開くことなく、以下のコマンドを使用して編集を行うこともできます。
sudo sed -i 's/post_max_size = 8M/post_max_size = 50M/' /etc/php/8.2/fpm/php.ini
sudo sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/' /etc/php/8.2/fpm/php.ini
sudo sed -i 's/memory_limit = 128M/memory_limit = 256M/' /etc/php/8.2/fpm/php.ini
/etc/php/8.0/fpm/pool.d/www.confファイルを開いてください。
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
PHPプロセスのUnixユーザー/グループをnginxに設定する必要があります。ファイル内でuser=www-dataとgroup=www-dataの行を見つけて、それらをnginxに変更してください。
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = nginx
group = nginx
...
また、ファイル内の listen.owner=www-data と listen.group=www-data の行を見つけて、それらを nginx に変更してください。
listen.owner = nginx
listen.group = nginx
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
PHP-fpmプロセスを再起動します。
sudo systemctl restart php8.2-fpm
ステップ7 - phpMyAdminをインストールする
phpMyAdminのアーカイブファイルを英語のためにダウンロードします。phpMyAdminのダウンロードページから最新バージョンのリンクを取得してください。
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-english.tar.gz
サイトのために公的なディレクトリを作成してください。
sudo mkdir /var/www/html/example.com -p
アーカイブを公開ディレクトリに抽出してください。
sudo tar -xzf phpMyAdmin-5.2.1-english.tar.gz -C /var/www/html/example.com
公開ディレクトリに切り替えてください。
cd /var/www/html/example.com
抽出したディレクトリの名前を不明瞭なものに変更して、セキュリティを向上させてください。
sudo mv phpMyAdmin-5.2.1-english sm175
ステップ8 - phpMyAdminを設定する
サンプル設定ファイルをコピーします。
sudo cp sm175/config.sample.inc.php sm175/config.inc.php
設定ファイルを編集のために開いてください。
sudo nano sm175/config.inc.php
次の行 $cfg['blowfish_secret']=''; を見つけて、クッキーに基づく認証用の32文字のランダム文字列を入力してください。
phpSolvedのオンラインブローフィッシュジェネレーターを使用するか、コマンドラインを介して行うことができます。
値をコピーして、表示されている通りに貼り付けてください。
$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
サイトとphpMyAdminの所有権をNginxサーバーに変更します。
sudo chown -R nginx:nginx /var/www/html/example.com
phpMyAdminのセットアップディレクトリを削除してください。
sudo rm -rf /var/www/html/example.com/sm175/setup
ステップ9 - Opcacheを設定する
OpcacheはPHPのキャッシュシステムです。これは、事前コンパイルされたスクリプトのバイトコードをメモリに保存することによって機能し、ユーザーがページを訪れるたびに、より速く読み込まれます。Opcacheはデフォルトでインストールされています。確認するには、PHPのバージョンをチェックしてください。
php --version
PHP 8.2.7 (cli) (built: Jun 9 2023 19:37:27) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.7, Copyright (c) Zend Technologies
with Zend OPcache v8.2.7, Copyright (c), by Zend Technologies
これはOpcacheがインストールされて利用可能であることを示しています。ここに表示されない場合は、次のコマンドを実行して手動でインストールできます。
sudo apt install php-opcache
Opcacheの設定を変更するには、ファイル/etc/php/8.2/fpm/conf.d/10-opcache.iniを編集のために開きます。
sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.ini
次の設定は、Opcacheを使用する際の出発点として役立ち、一般的に良好なパフォーマンスのために推奨されます。以下の行を下部に追加することで有効にできます。
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
PHP-FPMを再起動します。
sudo systemctl restart php8.2-fpm
ステップ10 - SSL用のCertbotをインストールする
私たちは、Let's Encryptが提供する無料のSSL証明書を生成するためにCertbotをインストールする必要があります。
CertbotはDebianのリポジトリを使用してインストールするか、Snapdツールを使用して最新バージョンを取得することができます。私たちはSnapdバージョンを使用します。
Debian 12にはSnapdがインストールされていません。Snapdパッケージをインストールしてください。
sudo apt install snapd
次のコマンドを実行して、Snapdのバージョンが最新であることを確認してください。
sudo snap install core
sudo snap refresh core
Certbotをインストールします。
sudo snap install --classic certbot
次のコマンドを使用して、Certbot コマンドが /usr/bin ディレクトリへのシンボリックリンクを作成することにより実行できることを確認してください。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Certbotが正常に機能しているか確認してください。
certbot --version
certbot 2.6.0
ステップ11 - デモサイトをテストする
サイトを作成する
テストページを作成して編集のために開いてください。
sudo nano /var/www/html/example.com/index.php
そのコードをそこに貼り付けてください。
<?php
$user = "exampleuser";
$password = "YourPassword2!";
$database = "exampledb";
$table = "name_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>Members List</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();
}
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
SSL証明書を作成する
次のコマンドを実行してSSL証明書を生成します。
sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d example.com
上記のコマンドは、サーバーの/etc/letsencrypt/live/example.comディレクトリに証明書をダウンロードします。
ディフィー・ヘルマン群証明書を生成します。
sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Certbotの更新スケジューラーサービスを確認してください。
sudo systemctl list-timers
snap.certbot.renew.serviceが実行されるようにスケジュールされたサービスの1つとして見つかります。
NEXT LEFT LAST PASSED UNIT ACTIVATES
.....
Sun 2023-02-26 06:32:00 UTC 9h left Sat 2023-02-25 18:04:05 UTC 2h 59min ago snap.certbot.renew.timer snap.certbot.renew.service
Sun 2023-02-26 06:43:20 UTC 9h left Sat 2023-02-25 10:49:23 UTC 10h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2023-02-26 09:00:06 UTC 11h left Sat 2023-02-25 20:58:06 UTC 5min ago apt-daily.timer apt-daily.service
プロセスのドライランを実行して、SSL更新が正常に動作しているか確認してください。
sudo certbot renew --dry-run
エラーが見当たらなければ、すべて準備完了です。あなたの証明書は自動的に更新されます。
Nginxを設定する
/etc/nginx/conf.d/example.confというファイルを作成して、編集のために開いてください。
sudo nano /etc/nginx/conf.d/example.conf
そのコードをそこに貼り付けてください。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
root /var/www/html/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Pass PHP Scripts To FastCGI Server
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; #depends on PHP versions
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
Ctrl + X を押してファイルを保存し、促されたらYと入力します。
ファイル /etc/nginx/nginx.conf を編集のために開いてください。
sudo nano /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;の前に次の行を追加してください。
server_names_hash_bucket_size 64;
Ctrl + X を押してファイルを保存し、プロンプトが表示されたら Y を入力します。
Nginxの設定を確認してください。
sudo nginx -t
エラーが表示されない場合、問題ありません。Nginxサーバーを起動してください。
sudo systemctl start nginx
https://example.comにアクセスしてウェブサイトを読み込むと、次のページが表示されます。
ブラウザで https://example.com/sm175 のURLにアクセスすることで、phpMyAdminのインストールにアクセスできます。ログインするには、管理者ユーザーまたは以前に作成したユーザーを入力できます。
結論
これで、Debian 12サーバーにLEMPスタックを設定し、デモサイトを作成する方法を学んだチュートリアルは終了です。質問がある場合は、以下のコメントで投稿してください。
