Alpine Linux の Vagrant Box に PHP をインストールする


概要
---

Alpine Linux での PHP 開発環境構築に取り組みました。パッケージ管理ツールの apk の練習も兼ねています。

Alpine Linux は 5MB の軽量のディストリビューションです。Alpine Linux の開発チームのメンバーは Docker 社に雇用されており、公式イメージの対応が少しずつ進められています。

2016年3月に Docker for Mac and Windows が公開され、VirtualBox を使わずに xhyve Virtual Machine (Mac OS X) もしくは Hyper-V VM で Docker が利用できるようにするツールが開発されています。しかしながら、招待を申請してトークンをメールで受理した人しか使えません。


Vagrant プラグインを導入する
-------------------------

`vagrant plugin` サブコマンドでセットアップを支援してくれるプラグインを導入します。

```bash
vagrant plugin install vagrant-alpine
```

Vagrant Box をセットアップする
---------------------------

次のコマンドを実行します。利用できるバージョンは [README](https://github.com/maier/vagrant-alpine) をご参照ください。

```bash
vagrant init maier/alpine-3.3.1-x86_64
```

Vagrant Box にアクセスします。

```bash
vagrant up
vagrant ssh
```

ホストマシンのブラウザーから HTTP サーバーにアクセスできるようにポートフォワードの設定を Vagrantfile に追加します。

```bash:Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 3000
```

Guest Additions のインストールが毎回失敗するので、無効にします。

```bash:Vagrantfile
config.vbguest.auto_update = false
config.vbguest.no_remote = true
```

上記の設定を利用するために vagrant-vbguest をインストールしておきます。

```bash
vagrant plugin install vagrant-vbguest
```

合わせて共有フォルダーを無効にしました。

```bash:Vagrantfile
config.vm.synced_folder '.', '/vagrant', disabled: true
```

再起動します。

```
vagrant reload
```

リポジトリを追加する
----------------

PHP 7.0 を利用するために edge/testing リポジトリを追加します。`/etc/apk/repositories` を開き、コメント行を解除して次の URL を追加します。

```bash
#/media/cdrom/apks
http://repos.dfw.lax-noc.com/alpine/v3.3/main
http://repos.dfw.lax-noc.com/alpine/edge/main
http://repos.dfw.lax-noc.com/alpine/edge/testing
```

リポジトリのインデックスを更新します。

```bash
sudo apk update
```

PHP のコマンドツールをインストールする
---------------------------------

PHP 7.0 をインストールしてみましょう。ツールの名前は php7 になっています。

```bash
sudo apk add php7
```

オプションの `--update` を指定することで、リポジトリのインデックス更新と同時にパッケージを導入することができます。

```bash
sudo apk add --update php7
```

バージョンを確認します。

```bash
php7 --version
```

PHP のプログラムを用意する。

```bash
echo "<?php phpinfo();" > index.php
```

PHP のビルトインサーバーを起動させてみよう。

```bash
sudo php7 -S 0.0.0.0:80
```

Apache と mod_php をインストールする
---------------------------------

今度は Apache と mod_php をインストールします。

```bash
sudo apk add apache2 php7-apache2
```

`/var/www/localhost/htdocs` に PHP スクリプトを設置します。

サービスを起動させてみましょう。

```bash
sudo service apache2 start
```

サービスを停止させるには次のコマンドを実行します。

```bash
sudo service apache2 stop
```

OS 起動時にサービスを自動起動させるには次のコマンドを実行します。

```bash
sudo rc-update add apache2
```

nginx と php-fpm をインストールする
--------------------------------

PHP 7.0 の FPM (FastCGI Process Manager) をインストールして起動させます。

```bash
sudo apk add php-fpm7
sudo service php-fpm7 start
```

次に nginx をインストールして起動させます。

```bash
sudo apk add nginx
sudo service nginx start
```

FPM 対応のために /etc/nginx/nginx.conf を編集します。

```bash:nginx.conf
location ~ \.php$ {
    root           /path/to/www;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
```

nginx を再起動します。

```bash
sudo service nginx restart
```

h2o (HTTP サーバー) をインストールする
----------------------------------

HTTP サーバーの h2o をインストールして起動させてみよう。

```bash
sudo apk add h2o
sudo service h2o start
```


php-fpm を利用するために `/etc/h2o.conf` を修正しよう。

```bash:h2o.conf
user: h2o
pid-file: /var/run/h2o.pid
error-log: /var/log/h2o/error.log
access-log: /var/log/h2o/access.log

file.custom-handler:
  extension: .php
  fastcgi.connect:
    host: 127.0.0.1
    port: 9000
    type: tcp

file.index: [ 'index.php', 'index.html' ]

hosts:
  "Default":
    listen:
      port: 80
    paths:
      /:
        file.dir: /var/www
```

h2o を再起動する。

```bash
sudo service h2o restart
```

MariaDB をインストールする
-----------------------

MariaDB とクライアントをインストールします。MySQL は MariaDB のエイリアスになっています。

```bash
sudo apk add mariadb mariadb-client
```

データベースの初期化を実行します。

```bash
sudo /etc/init.d/mariadb setup
```

サービスを起動させます。

```bash
sudo service mariadb start
```

mysql クライアントでサービスにアクセスします。

```bash
mysql -u root
> exit
```

PHP 7.0 の mysqli と pdo_mysql 拡張モジュールを導入しよう。PHP 7.0 で mysql 拡張モジュールは廃止されましたので、インストールしません。

```bash
sudo apk add php7-mysqli php7-pdo_mysql
```