LAMP/Rails on Windows

Windows 10 Creators Update がリリースされました。
このアップデートでBash on Windowsもアップデートされましたので、最新版にアップデートするとともに、LAMP環境、すなわちApache、MySQL、PHP、これに加えRuby On Rails5.02環境を構築してみます。

Bash on Ubuntu on Windowsのアップデート

Anniversary Update版のBashが既にインストールされている場合は、インストール済みのBashをアンインストール後に、改めてCreators Update版のBashをインストールする必要があるということです。開発用アプリケーションやデータなどは事前にバックアップしておきます。
それでは、コマンドプロンプトを開いて、アンインストールを実行します。

lxrun /uninstall /full

今回は/fullオプションを付けてユーザーデータを含めすべてのデータを削除します。

続いてインストールを実行します。

lxrun /install

Windows ストアからダウンロードしています…が表示され、数分後にインストールが完了します。

Bash on Ubuntu on Windowsを開き、前回と同じ手順でSSHサーバーを立ち上げてみましたが、以下のエラーが表示されました。SSHのホストキーが自動生成されないようです。
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

手動生成して再スタート

sudo ssh-keygen -A
sudo service ssh restart

正常起動しました。前回表示されていた接続拒否メッセージは今回は出ていません。

Rails 5.0.2 環境構築

まず前回と同じ手順でRails環境を構築しておきます。
今回のバージョンはRuby2.4.1、Rails5.0.2

MySQL 環境構築

最新版のMySQL 5.7 をインストールします。こちらでUbuntu / Debian (Architecture Independent), DEB Packageを確認して最新バージョンをダウンロード

wget http://dev.mysql.com/get/mysql-apt-config_0.8.4-1_all.deb

ダウンロードしたdebパッケージをインストール

sudo dpkg -i mysql-apt-config_0.8.4-1_all.deb

MySQL Server & Cluster (Currently selected: mysql-5.7)) を選択してEnter

mysql-5.7 を選択してEnter

Ok を選択してEnter

sudo apt-get update
sudo apt-get install mysql-server

MySQLをスタートします。

sudo service mysql start

おまじないです。通常はMySQLをアップデートしたときに、最新との互換性のチェックや修正を行うものです。

sudo mysql_upgrade -u root
mysql -u root

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.18 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>

データベースを作成しローカル接続アカウントを追加します。

create database db1 default character set utf8;
grant all privileges on db1.* to user1@'localhost' identified by 'パスワード';

Apache 環境構築

Apache2をインストールします。

sudo apt-get install apache2

Apache2をスタートします。

sudo service apache2 start

ブラウザから確認してみます。http://localhost

続いてPassengerをインストールします。

gem install passenger

Apacheモジュールのビルドとインストール

sudo chmod o+x "/root"
passenger-install-apache2-module

出力メッセージに従って以下をインストール

sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install apache2-dev
sudo apt-get install libapr1-dev
sudo apt-get install libaprutil1-dev

Apacheのconfigに記述する情報を出力しておきます。

passenger-install-apache2-module --snippet

上記で出力されたPassengerの設定情報とRailsサンプルアプリの設定情報を記述します。

vim /etc/apache2/sites-available/passenger.conf
LoadModule passenger_module /root/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
 PassengerRoot /root/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.2
 PassengerDefaultRuby /root/.rbenv/versions/2.4.1/bin/ruby
</IfModule>

<VirtualHost *:80>
 RailsEnv development
 PassengerEnabled on
 DocumentRoot /var/www/html/sample/public
</VirtualHost>

AcceptFilter http none
AcceptFilter https none

passenger.conf を有効にして再起動します。

sudo a2dissite 000-default.conf
sudo a2ensite passenger.conf
sudo service apache2 restart

ブラウザから確認してみます。http://localhost

Passengerがエラーを吐きました。こんなエラーメッセージが出力されています。

Address already in use – listen(2) (Errno::EADDRINUSE)
/root/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.2/src/ruby_supportlib/phusion_passenger/request_handler.rb:303:in `listen’

そのソースコードを見ると

300: socket_address = "#{socket_dir}/#{socket_prefix}.#{generate_random_id(:base64)}"
301: socket_address = socket_address.slice(0, unix_path_max - 10)
302: socket = UNIXServer.new(socket_address)
303: socket.listen(BACKLOG_SIZE)

なぜ “Address already in use” ?

こちらを参考に環境変数を設定してみました。

vim /var/www/html/sample/config/environment.rb
........
ENV['_PASSENGER_FORCE_HTTP_SESSION']="true"

再起動して再度確認

sudo service apache2 restart

http://localhost


今度は正常に動きました。

PHP 環境構築

PHP7.1をインストールします。

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.1
php -v

PHP 7.1.4-1+deb.sury.org~xenial+1 (cli) (built: Apr 11 2017 22:12:32) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.4-1+deb.sury.org~xenial+1, Copyright (c) 1999-2017, by Zend Technologies

passenger.conf を無効にしてデフォルトに戻し再起動します。

sudo a2dissite passenger.conf
sudo a2ensite 000-default.conf
sudo service apache2 restart

動作確認をしてみましょう。

vim /var/www/html/phpinfo.php
<?php phpinfo(); ?>

ブラウザから確認してみます。http://localhost/phpinfo.php

これで Bash on Ubuntu on Windows が本当に使える開発環境となりました。