PHP
MySQL
Apache
WSL
ubuntu18.04

WSLにLAMPを構築する(2018秋)

前置き

この記事は、2018年10月初旬時点でのWindows10環境へのWSL(ubuntu 18.04 LTS)のインストールと、LAMP環境構築の作業メモです。
個人の作業メモであること、特にWSLは現在進行形で進化中であるので、参照される場合はあくまで参考にとどめてください。m(_ _)m

環境

もの バージョン
ホストOS Windows10 Home
バージョン:1803
OSビルド:17134.320
WSL OS ubuntu 18.04 LTS
(L)AMP apache2:Apache/2.4.29 (Ubuntu)
MySQL:mysql Ver 8.0.12
php:PHP 7.2.10-0ubuntu0.18.04.1

やりたかったこと

以下のようなことをWindows上のcygwinで実現しており、これらをWSLへ置き換える

  • Linuxサーバへのsshログイン、sshプロトコルを利用した作業(scp、sftpなど)
  • その他Linuxコマンドを利用した作業や動作確認、特にネットワーク系(ping, traceroute, mtr, wget, curlでのAPIのレスポンス確認など)
  • gitコマンドの利用。
  • bashスクリプトを利用したWindows上でのテキスト処理(cat, grep, sed, awk, cut, tr, などそういうの)
  • jsonを目視したいときのパース(jq/jo コマンドを使ってる)
  • phpやpythonのちょっとした動作確認(本格的な開発ではない)
  • goやc++のコンパイル(本格的な開発ではないよ!)

これらのちょっとした作業をなんとなくcygwin上でいろいろつけたしつけたし実現してたが、そろそろWSLが本格的に使えそうってのもありインストールを試してみた。+ついでにLAMP構築までやってみた、というのがこの記事の趣旨です。

前提(およびこの記事で補足しないこと)

  • Windows側のWSLの機能としての有効化は作業済み。
  • WLS上での作業は、ちょっとした動作確認用途レベルなので、Linuxユーザはrootのみですべて作業する。
  • Linuxとしての初期作業。apt upgradeとか、.bashrcの設定とか。
  • 日本語化(locale関連)。そもそもぼくはLinuxを英語のまま使ってます。
  • パスワードやセキュリティ関連の設定は省く。
  • ドメインの設定も省く。WSL上で起動するWEBサーバへは localhost でアクセス。

やったこと

WSL(ubuntu18.04)インストール

MicrosoftStoreからさくっとインストール。

MSStore.png

ForzaHorizonやりたいですが、ぐっとこらえてubuntu 18.04 LTS をインストールします。
インストールしたらそのまま起動。DoS窓が開いて勝手にいろいろ準備してくれるのでしばし待ちましょう。
しばらくすると、Linuxユーザ作成してねってなりますが、ここで無視してCtrl+Cで終了。
参考にした記事:WSL でユーザーを作らずに root で作業する

これで、Windowsへインストールされたubuntu18.04LTSを起動すると、rootでログインできるようになります。

wsl-terminalのインストール

今回一番よかったのはコレ。インストール簡単、めんどい設定不要でそこそこキレイ(個人的に一番重要なとこ。UIやデザインやフォント、そこまでこだわらないけどDoS窓はさすがに無理)。
参考にした記事:windows10で快適なCUI環境を構築する
GitHub:Terminal emulator for Windows Subsystem for Linux (WSL)

wsl-terminalのzipをDLしてきて、適当なところへ展開して、展開したところから実行すれば終わり。ちょーらくちん。
UI周り(ウィンドウサイズ、フォント、フォントサイズ、テーマなど)は、cygwinで設定してたとき同様の設定がそのまま右クリック→オプションでてきとうにぽちぽち。

起動後のカレントディレクトリが起動時のカレントディレクトリになる件の問題だけ残るが、以下の場当たり的解決で終わり。
自分の場合は、Windowsにマウントしている追加ドライブ配下のtoolsディレクトリで起動するが(\D\tools\wsl-terminal)、WSLの/root/.bashrcに以下を1行足してcdさせればそれでおk。

 # cat .bashrc
---
cd /root
---

ログイン後に cd - したら、 \mnt\d\tools\wsl-terminal に戻る。

これで、Windows上で動くLinux(WSL)と、簡単にインストールできてそこそこキレイなターミナル環境が整った。
wsl-terminlaはWindowsのスタートメニューへ登録。これでスタートメニューから一発でWSL起動、wsl-terminal起動、ログインして作業開始までできる。

LAMP構築

自分は普段RedHat系OSで作業してるので、ubuntuやaptにはあまり詳しくない。
調べつつ雰囲気で構築。まぁ別にそんな難しくない。

php

apt install php

で、特に何も指定せずともphp7.2.10と関連モジュールがインストールされた。
php-mysqlとかはあとで。

 # php -v
PHP 7.2.10-0ubuntu0.18.04.1 (cli) (built: Sep 13 2018 13:45:02) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.10-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies

apache2

こちらも同様。ただしphpモジュールを忘れずに。

apt install apache2 libapache2-mod-php

※mod_phpも指定してみたら、そんなのないよって怒られた。

 # service apache2 start
 * Restarting Apache httpd web server apache2
 * [Sun Oct 07 11:51:25.463027 2018] [core:warn] [pid 685] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT

起動。デフォルトのドキュメントルートは /var/www/html/
warningでてるがここでは気にしない、あとで直す。
/var/www/html/配下に、phpinfoを設置し、ブラウザでアクセスする。

 # cd /var/www/html/
 # cat phpinfo.php
<?php
phpinfo();

phpinfo.png

無事phpinfo.phpが表示された。また、 localhost:80 でWSL上のWEBサーバへアクセスできることも確認。

mysql

せっかくなので、最新のMySQL8をいれましょう。

 # pwd
/root
 # mkdir src
 # cd src
 # wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb
 # dpkg -i mysql-apt-config_0.8.10-1_all.deb
 # apt install mysql-server

8用のリポジトリを追加しないでそのまま apt install すると5.7をインストールしようとしてくるので、リポジトリを追加する。
参考記事:MySQL 8.0をUbuntu Server 18.04へインストール

 # mysql --version
mysql  Ver 8.0.12 for Linux on x86_64 (MySQL Community Server - GPL)
 # service mysql start
 # mysql_secure_installation
 => インストールして、ログインまで確認

ちょっとハマったポイント(WSLからWindowsディレクトリ上の owner:permission の操作)

自分の環境ではWindowsに \c 以外に、HDD(1T)を \d として、およびSSD(500GB)を \f としてマウントしている。
\cは極力使わずほぼブートディスクのみに、なにか作業するときは \d や \f を使うようにしているのだけれども、今回もMySQLのデータディレクトリとして \d を使おうとしたらオーナーとパーミッションでちょっと詰まった。
参考記事:Windows Subsystem for Linuxのファイルシステムにおける注意点 , Windowsファイルシステムのchmodとchown

mysqlによって勝手に作られた /var/lib/mysql* を /mnt/d/d_ExtDisk/mysql* として移動させたところ、 owner:group が root:root に置き換わってしまい、mysqlの起動に失敗。あれと思い chown で変更を試みるも、なんのエラーも吐かず、root:rootからの変更もうまくいかない。
結果的には、 \d を WSL側から drvfs として再マウントしたら解決した。
※これ、Windowsからの認識を変えずにWSLからだけのFS変えられるの、地味にすごいと思う。。。

 # umount \mnt\d
 ※ここでbusyがでた場合はつかんでるプロセスを離す lsof とか使ってがんばって調べよう

 # mount -t drvfs D: /mnt/d -o metadata

WindowsのエクスプローラからMySQLのデータディレクトリが覗ける。当たり前なんだけど、なんかスゴイ。

mysql_datadir.png

php-mysql

改めて。

 # apt install php-mysql
 # service apache2 restart

さっき表示した phpinfo.php にはいなかったmysqliやmysqlndが存在することを確認。(mysqliいらないだろうけど。。)

phpinfo2.png

関連サービスの自動起動

そもそもWSLにおける「自動起動」の理解が、WindowsOS起動後にWSLプロセスを起動したタイミングで起動、であってるよね?っていうところからなんだけども。
WSLではいろんな理由で systemctl が使えない。プロセス起動は service コマンドで実行できるが、systemctl enable XX が使えず、chkconfigも使えないので、『WSLの初回起動に合わせてapache/mysqlを起動する』にはどうしたらいいかなと10秒ぐらい考えて、以下で対処(当たり前だけど通常のLinuxサーバの運用としてこれはやってはいけない)

 # cat .bashrc
---
## start process ##
# mysql
retval=$(service mysql status >/dev/null 2>&1; echo $?)
if [ ! $retval == "0" ]; then
  echo "start mysql"
  service mysql start
fi

# apaceh2
retval=$(service apache2 status >/dev/null 2>&1; echo $?)
if [ ! $retval == "0" ]; then
  echo "start apache2"
  service apache2 start
fi
---

rootユーザでしか起動しないので、起きてなかったらそのまま起動しちゃえ作戦。今回はこれでいいや。

これにてLAMPのインストール終わり。あとは必要なものシコシコいれてけばlaravelでも動くでしょう。
かなり簡単にWindows10で動くネイティブLinux環境を手に入れられました。またWSL上のファイルにWindowsから直接触れるので、WindowsのVSCodeでコード書いて、それをWSLでコンパイル&実行もさくさくできるでしょう。
さらばcygwin。

Todo

Dockerコンテナの起動と操作。
このままだとWSL上でしか作業できず環境分離できないので、さらにここでDockerを動かして環境分離できるようにしたい。
WSL上で素のDockerを動かすのはまだ難しそうだった。。(´・ω・`)
やるのであれば、WindowsにDockerを建てて(Docker for Windowsが可能であればDocker for Windows、無理ならDocker toolkit for Windows、もしくはVirtualBox等の仮想Linux上にDocker)、WSLからそこをつつく、という方法が現実的そう。