ウェブサイト検索

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. ステップ1 - ファイアウォールを設定する
  3. ステップ2 - PHPをインストールする
  4. ステップ3 - MariaDBをインストールする
  5. ステップ4 - MariaDBの設定
  6. ステップ5 - Nginxをインストールする
  7. ステップ6 - PHP-FPMを設定する
  8. ステップ7 - phpMyAdminをインストールする
  9. ステップ8 - phpMyAdminを設定する
  10. ステップ9 - Opcacheを設定する
  11. ステップ10 - SSL用のCertbotをインストールする
  12. ステップ11 - デモサイトをテストする

    1. サイトを作成する
    2. SSL証明書を作成する
    3. Nginxを設定する
  13. 結論

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スタックを設定し、デモサイトを作成する方法を学んだチュートリアルは終了です。質問がある場合は、以下のコメントで投稿してください。

関連記事: