WSLのUbuntu18で Apache 2.4 + PHP 7.2 + MariaDB 15.1 の開発環境作るメモ
PC買い替えたから、XAMPP使わないでWSL (Windows Subsystem for Linux) のUbuntuで開発環境を作ってみた。
※Ubuntuのコマンドは、基本的にはすべて一般ユーザーで実行しています。
準備
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
の末尾に以下を追記。
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 '<?php'; ?> echo phpinfo();' > /var/www/html/phpinfo.php
exit
phpinfoの表が表示されればOK。
Composerをインストール
PHPを使うからにはComposerも入れたい。
Composerのインストール方法は概ね公式サイト通り。ここでは /usr/local/bin
に composer
という名前でインストールして、グローバルで 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をインストール
基本的には以下の記事を参考にインストール。
Ubuntu 18.04 LTS : MariaDB : インストール : Server World
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にログインして以下実行。
CREATE USER mydevuser@localhost;
GRANT ALL PRIVILEGES ON *.* TO mydevuser@localhost IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
作成したら、ユーザーテーブルを確認してみる。
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にログインして以下実行。
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が自動起動するように設定する。
以下の記事を参考に……
Ubuntu 18.04 systemctlによるサービス自動起動の有効化・無効化 - Symfoware
sudo systemctl enable apache2
sudo systemctl enable mysql
……と設定したのだけど、自動で起動してくれない。なぜ?
以下の記事によると、どうやらWSLでは systemctl enable
が使えないらしい。
WSLのApache/MySQL(MariaDB)をWindows起動時に自動起動させる [WSL/Ubuntu環境]
なので「WSL側で .bashrc
でサービスを起動 + Windowsの起動時にWSLをこっそり起動させる」という仕掛けをしているらしい。
他にもいくつか調べてみたけど、このような感じでWSL側とWindows側の両方に仕掛けをするものが多かった。
仕掛けしてるの忘れて何かやらかしたら嫌だなーと思ってたら、以下の記事を発見。
Windows10のWSL上にあるServiceを簡単に自動起動させる - Qiita
wsl
コマンドでWSL側のコマンドを実行するbatファイルを作って、Windows側のスタートアップで実行させる方法。Windows側に仕掛けをするだけでよくて簡単だから、これにしよう。
『ファイル名を指定して実行』に shell:startup
を入力して、ログインユーザーのスタートアップのフォルダ (C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\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/envvars
の APACHE_RUN_USER
を見たら、普通に www-data
だった。WSL特有の挙動かもだから、本物のUbuntuにデプロイする時はパーミッションに気を付けた方がよさそう。
別のユーザーで環境構築した場合でも、同様にデフォルトユーザーでApacheが動くのかは不明。
以上
あとはNode.jsとかPythonも入れなきゃなので、入れたらまた何か書くと思う。