LEMPスタック · 7 min read · Oct 21, 2025
Debian 12にLEMPスタック(Nginx、PHP、MariaDB)をインストールする方法

LinuxのLEMPスタックは、ウェブアプリケーションの開発とホスティングに人気のあるソフトウェアバンドルです。これは、Linux、Nginx(「エンジン-X」と発音)、MySQLまたはMariaDB(リレーショナルデータベース)、PHP(人気のあるウェブプログラミング言語)の4つの主要コンポーネントで構成されています。このセットアップでは、Linuxがオペレーティングシステムであり、NginxがHTTPリクエストを処理し、画像や.cssファイルなどの静的コンテンツを提供するウェブサーバーです。MySQL、または私たちのケースではMariaDBがデータベースシステムとして使用されます。PHPは、ウェブコンテンツを生成し、データベースと動的に対話するために使用されるスクリプト言語です。これらのコンポーネントは、ウェブサイトやウェブアプリケーションを構築および展開するための堅牢でスケーラブルな環境を形成します。
このガイドでは、数日前にリリースされたDebian 12(bookworm)サーバーにLEMPスタックをインストールする方法を学びます。また、phpMyAdminなどのアプリケーションをインストールする方法も学びます。
前提条件
- Debian 12を実行しているサーバー。
- sudo権限を持つ非rootユーザー。
- サーバーを指す完全修飾ドメイン名(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バージョンをインストールしたい場合は、Ondrejの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
ルートパスワードを求められます。設定していないため、Enterを押します。
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をインストールする必要があります。
Debianのリポジトリを使用してCertbotをインストールするか、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
次のコードを貼り付けます。
メンバーリスト";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "- " . $row['content'] . "
";
}
echo "
";
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "
";
die();
}
Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。
SSL証明書を作成
次のコマンドを実行してSSL証明書を生成します。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com
上記のコマンドは、サーバーの/etc/letsencrypt/live/example.comディレクトリに証明書をダウンロードします。
Diffie-Hellmanグループ証明書を生成します。
$ 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にアクセスすることで、phpMyAdminインストールにアクセスできます。管理ユーザーまたは以前に作成したユーザーを入力してログインできます。
結論
これで、Debian 12サーバーにLEMPスタックをセットアップし、デモサイトを作成する方法を学んだチュートリアルが終了しました。質問がある場合は、下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。