以前、WSL1で作っていた環境をWSL2で作り直した。

[ Windows 10 (64bit) / Ubuntu 20.04 LTS / Apache 2.4 / PHP 7.2 / MariaDB (MySQL) 15.1 ]

※Ubuntuのコマンドは、基本的にはすべて一般ユーザーで実行しています。

  1. WSL2を有効化
  2. Ubuntuをインストール
  3. 環境構築の前に
  4. 環境構築開始
  5. Apacheをインストール
  6. PHPをインストール
  7. ApacheにPHPを乗せる
  8. Composerをインストール
  9. MariaDBをインストール
  10. MariaDBに開発用ユーザー作成
  11. MariaDBにデータベース作成
  12. 自動起動設定

WSL2を有効化

以下の公式の記事を参照……

まずPowerShellで以下コマンド実行して、仮想マシンプラットフォーム機能を有効化。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

そしたらPC再起動後、『x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ』をインストール。

そしたらPowerShellで以下コマンド実行して、Linuxディストリビューションインストール時の既定のバージョンをWSL2に変更。

wsl --set-default-version 2

Ubuntuをインストール

Microsoft Storeから、ここでは『Ubuntu 20.04 LTS』をインストール。

※なぜならUbuntu無印はWSL1でインストール済みだったから。それに、WSL1ではUbuntu 20.04をインストールしたら sleep: cannot read realtime clock: Invalid argument とか言われてちゃんと動かなかったので、住み分けられると思ったから。詳しくは以下の記事を参照。

以下、WSL2のUbuntu上で環境構築を行っていく。

環境構築の前に

……と思ったが、自分の環境ではWSL1のUbuntuの方でApacheとMadiaDBが動いてたので、念のため止めておく。

※WSL1
sudo service apache2 stop
※WSL1
sudo service mysqld stop

以下、今度こそWSL2のUbuntu上で環境構築を行っていく。

環境構築開始

最初はこれ。

sudo apt update

Apacheをインストール

そしたらWSL2のUbuntuにApacheインストール。

sudo apt install apache2
apache2 -v
結果
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2020-03-13T12:26:16

サービス起動してるか確認。

service apache2 status
結果
 * apache2 is not running

WSL2になってもインストール後に自動で起動しないのは同じようなので、以下コマンドで起動する。

sudo service apache2 start
結果
 * Starting Apache httpd web server apache2
 *

無事に起動。なお、ここで Failed to enable APR_TCP_DEFER_ACCEPT とか表示される人はこちらを参照。

この時点で http://localhost を開くと、ちゃんとUbuntuのApache2のデフォルトページが表示された。


[2020-11-23追記] なんか後日確認したところ、表示されなくなってた。

あれ? 調べたところ、本当はWSL2上の localhost にWindows側から接続するには設定が必要らしい。

Windows側のユーザのフォルダに .wslconfig を作成して、中身を以下のようにする。

.wslconfig
[wsl2]
localhostForwarding=True

そしたらコマンドプロンプトからWSL2をシャットダウン。

wsl --shutdown

再度WSL2を立ち上げてApache2を起動したら、やっと http://localhost にアクセスできるようになった。

PHPをインストール

PHP7.4を……と思ったが、いまPHPで動かしてる本番環境が7.2なので7.2をインストール。

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.2 php7.2-common php7.2-cli php7.2-fpm php7.2-mysql php7.2-dev php7.2-mbstring php7.2-zip php7.2-sqlite3 php7.2-curl php7.2-gd php7.2-xml

最後に以下のメッセージが表示されたけど、開発環境だしFPMは無効のままで構わないので無視。

結果 (抜粋)
NOTICE: Not enabling PHP 7.2 FPM by default.
NOTICE: To enable PHP 7.2 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.2-fpm
NOTICE: You are seeing this message because you have apache2 package installed.

インストールできたか確認。

php -v
結果
PHP 7.2.34-8+ubuntu20.04.1+deb.sury.org+1 (cli) (built: Oct 31 2020 16:57:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.34-8+ubuntu20.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies

ApacheにPHPを乗せる

ApacheのPHP7.2モジュールをインストールして、Apacheを再起動。

sudo apt install libapache2-mod-php7.2
sudo service apache2 restart

PHPが動くか確認したい。以下コマンド実行してから、http://localhost/phpinfo.php を開いてみる。

sudo su
echo '<?php echo phpinfo();' > /var/www/html/phpinfo.php
exit

phpinfoの表が表示されればOK。

Composerをインストール

Composerも入れていく。インストール方法は概ね公式サイト通り。

まずインストーラをダウンロード。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'c31c1e292ad7be5f49291169c0ac8f683499edddcfd4e42232982d0fd193004208a58ff6f353fde0012d35fdd72bc394') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Installer verified と表示されればファイルのハッシュ値はOK。

そしたら以下コマンドでインストールする。ここでは /usr/local/bincomposer という名前でインストールして、グローバルで composer コマンドを使えるようにする。

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
php -r "unlink('composer-setup.php');"
composer --version
結果
Composer version 2.0.6 2020-11-07 11:21:17

MariaDBをインストール

以下コマンドでインストール。

sudo apt install mariadb-server
mysql --version
結果
mysql  Ver 15.1 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

一応、サービスがどうなってるか確認。

service mysql status
結果
 * MariaDB is stopped.

WSL1と同様に、インストール直後はサービスが起動していない。起動する。

sudo service mysql start

そしたら mysql_secure_installation で初期設定を行っていく。

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
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  # 最初はDBのrootユーザーのパスワードは無いので何も入力しない
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y  # DBのrootユーザーのパスワードをセットしたいからy
New password:  # DBのrootユーザーのパスワードを入力
Re-enter new password:  # もう一度入力
Password updated successfully!
Reloading privilege tables..
 ... Success!


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  # 匿名ユーザーでログインさせたくないから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  # リモートからrootユーザーで繋がせたくないから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  # testデータベースは不要だから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  # いま設定した権限をリロードしてほしいから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!

初期設定できたら、試しにrootユーザーで入ってみる。パスワードを訊かれたら、さっき設定したパスワードを入力する。

sudo mysql -u root -p
結果
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 32
Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

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)]>

入れたからOK。quit で抜けられる。

MariaDBに開発用ユーザー作成

開発で使うので、MariaDBに開発用ユーザーを作っておく。

ここでは仮にユーザー名は mydevuser、パスワードは mypassword とする。開発用なので接続元は localhost とする。

MariaDBにログインして以下実行。

SQL
CREATE USER mydevuser@localhost;
GRANT ALL PRIVILEGES ON *.* TO mydevuser@localhost IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

作成したら、ユーザーテーブルを確認してみる。

SQL
SELECT user, host, password FROM mysql.user;
結果
+----------------+-----------+-------------------------------------------+
| user           | host      | password                                  |
+----------------+-----------+-------------------------------------------+
| root           | localhost | ***************************************** |
| mydevuser      | localhost | ***************************************** |
+----------------+-----------+-------------------------------------------+

こんな感じになってるはず。

念のため quit で抜けて、作成したユーザーで入れるか試してみる。(※-ppassword は誤字ではない。-p の後にスペースは本当にいらない。)

sudo mysql -u mydevuser -pmypassword

入れればOK。

MariaDBにデータベース作成

ついでにデータベースも作成する。ここでは仮に mydevdb とする。

MariaDBにログインして以下実行。

SQL
CREATE DATABASE mydevdb CHARACTER SET utf8mb4;

さらに今回は手元に mysqldump で作成したダンプファイルがあるので、今作ったデータベースにリストア。

quit で抜けてから以下実行。

sudo mysql -u mydevuser -pmypassword -D mydevdb < /path/to/dumpfile.sql

実際には、ダンプファイルはWindows側に置いてあるものを /mnt/c/Users/piyopiyo/Desktop/dump.sql みたいに指定した。

自動起動設定

最後に、PC立ち上げ時にApacheとMariaDBが自動起動するように設定する。

少し調べたらWSL2でも systemctl は使えないっぽいので、WSL1と同様にWindowsのスタートアップでやることにした。

『ファイル名を指定して実行』に shell:startup を入力して、ログインユーザーのスタートアップのフォルダ (C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup) を開く。そこに好きな名前のbatファイルを作って、内容を以下の通りにする。

wsl_startup.bat
@echo off
wsl -d Ubuntu-20.04 -u root -- service apache2 start
wsl -d Ubuntu-20.04 -u root -- service mysql start

ここでは Ubuntu 20.04 をインストールしてるので、ディストリビューションの指定は Ubuntu-20.04 にしてある。インストール済みのディストリビューションの名前はコマンドプロンプトで wsl -l で確認できるよ。

これでWindowsを再起動してみると、ログイン時に一瞬だけ黒窓が出てきて以下が表示され、ApacheとMariaDBが起動される。

* Starting Apache httpd web server apache2
*
* Starting MariaDB database server mysqld

以上。