PC買い替えたから、XAMPP使わないでWSL (Windows Subsystem for Linux) のUbuntuで開発環境を作ってみた。

[ Windows 10 (64bit) / Ubuntu 18.04.4 LTS / MariaDB (MySQL) 15.1 ]

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

  1. 準備
  2. Apacheをインストール
  3. PHPをインストール
  4. ApacheにPHPを乗せる
  5. Composerをインストール
  6. MariaDBをインストール
  7. MariaDBに開発用ユーザー作成
  8. MariaDBにデータベース作成
  9. 自動起動設定

準備

sudo apt update

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

起動してないらしいので起動する。

sudo service apache2 start
結果
 * Starting Apache httpd web server apache2                                                             [Sat Apr 04 14:32:20.262214 2020] [core:warn] [pid 1295:tid 140014090062784] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT

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

この警告については別に記事を書いたので、詳しくはこちらを参照。警告への対処として、/etc/apache2/apache2.conf の末尾に以下を追記。

/etc/apache2/apache2.conf
AcceptFilter http none
AcceptFilter https none

念のためApache再起動。

sudo service apache2 restart

PHPをインストール

基本的には以下の記事を参考にPHP7.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

なお、php7.2-sqlite3 php7.2-curl php7.2-gd php7.2-xml は使いたかったので追加した。

最後に以下のメッセージが表示されたけど、開発環境だし、FPMは無効のままで構わないので無視。(FPMを有効にすると、Apache上でPHPがCGIモードで動くようになる)

結果 (抜粋)
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.29-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Mar 20 2020 13:54:39) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.29-1+ubuntu18.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が動くか確認したい。以下コマンド実行してから、httpp://localhost/phpinfo.php を開いてみる。

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

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

Composerをインストール

PHPを使うからにはComposerも入れたい。

Composerのインストール方法は概ね公式サイト通り。ここでは /usr/local/bincomposer という名前でインストールして、グローバルで composer コマンドを使えるようにする。

2行目のやたら長いのは、ファイルのハッシュ値を確認してるらしい。Installer verified と表示されれば正しい。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer --version
結果
Composer version 1.10.1 2020-03-13 20:34:27

MariaDBをインストール

基本的には以下の記事を参考にインストール。

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

初期設定は mysql_secure_installation で行う……

sudo mysql_secure_installation
結果 (抜粋)
Enter current password for root (enter for none):
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

……と思ったら、MariaDBのrootユーザーのパスワードを入力するところで上記のエラー。

そもそも……

service mysql status
結果
 * MariaDB is stopped.

サービスが起動してなかった。起動する。

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 で抜けられる。

なお mysql コマンドに sudo をつけ忘れると、パスワードを入力したところで以下のエラーが出るので注意。

結果
Enter password:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

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が自動起動するように設定する。

以下の記事を参考に……

sudo systemctl enable apache2
sudo systemctl enable mysql

……と設定したのだけど、自動で起動してくれない。なぜ?

以下の記事によると、どうやらWSLでは systemctl enable が使えないらしい。

なので「WSL側で .bashrc でサービスを起動 + Windowsの起動時にWSLをこっそり起動させる」という仕掛けをしているらしい。

他にもいくつか調べてみたけど、このような感じでWSL側とWindows側の両方に仕掛けをするものが多かった。

仕掛けしてるの忘れて何かやらかしたら嫌だなーと思ってたら、以下の記事を発見。

wsl コマンドでWSL側のコマンドを実行するbatファイルを作って、Windows側のスタートアップで実行させる方法。Windows側に仕掛けをするだけでよくて簡単だから、これにしよう。

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

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

一応、ディストリビューションの指定も入れてみた。

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

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

副次的だけど、黒窓が出るから存在を忘れなさそうなのも嬉しい。(鳥頭)

ちなみに

これで構築した環境にこのブログ (Laravel5.6) を置いて動かしてみたところ、ログファイルの所有者は www-data じゃなくて、環境構築時に使っていたデフォルトユーザーになった。

でもApacheの起動ユーザーの設定が違うのかと思って /etc/apache2/envvarsAPACHE_RUN_USER を見たら、普通に www-data だった。WSL特有の挙動かもだから、本物のUbuntuにデプロイする時はパーミッションに気を付けた方がよさそう。

別のユーザーで環境構築した場合でも、同様にデフォルトユーザーでApacheが動くのかは不明。

以上

あとはNode.jsとかPythonも入れなきゃなので、入れたらまた何か書くと思う。