aws上に作成したansibleサーバーでテストサイトを構築する(5) Webサーバーの構成

# はじめに
[前回](http://qiita.com/yoshino_dd/private/a5cb5b704256d6a4d41f)は、作成したEC2インスタンスに共通の処理を適用するところまでを実装しました。
今回は、Webサーバーとしての構成を行っていきます。

- aws上に作成したansibleサーバーでテストサイトを構築する
  1. [Ansibleサーバー構築](https://qiita.com/yoshino_dd/items/1e0969fd6dab1b51e1e0)
  1. [AWSネットワーク構成](https://qiita.com/yoshino_dd/items/d9be528837803ebb4bd3)
  1. [EC2インスタンスの作成](https://qiita.com/yoshino_dd/items/4368e468c6aa5353bf3c)
  1. [サーバー共通の設定](https://qiita.com/yoshino_dd/items/3fa56fc09e9162d6ad4a)
  1. [Webサーバーの構成](https://qiita.com/yoshino_dd/items/1292d6b3beeae26433f7)
  1. [RDSの構成-1](https://qiita.com/yoshino_dd/items/8d559b60d5b9f316d8bb)
  1. [RDSの構成-2](https://qiita.com/yoshino_dd/items/1da42dc2d1446ec20526)
  1. [WordPressの設定](https://qiita.com/yoshino_dd/items/d41694d468c5c64d78a0)
  1. 参考にしたサイトなど

# Webアプリサーバー向けのPlay作成
前回作成した`wordpress.yml`に、Webアプリサーバー向けのPlayを追加します。
このPlaybookではデータベースにRDSを使用する予定で、Webアプリサーバーしか構成しないので、Playを分けなくてもよいのですがDBをRDSでなくEC2で建てる場合などにはDB用のPlayを作ることになるので分けています。
まずはnginxロールを作ります。

```yaml:wordpress.yml(追記)
 hosts: webapps
  become: true
  roles:
    - { role: nginx, tags: [nginx] }
```

# nginxのインストール

今回は、Webサーバーとしてはnginxを使用し、Wordpressを`/var/lib/wordpress`にインストールして、`http://<IPアドレス>/wordpress`でアクセスするように設定します。
nginxのトップページ、`http://<IPアドレス>/`はyumによる既定の設定のままとしておきます。

なので、nginxのインストールタスクはパッケージをインストールして起動するだけの簡単なものとなります。

```shell-session:command
> mkdir -p roles/nginx/tasks
```
```yaml:roles/nginx/tasks/main.yml
---
- name: installed nginx
  yum:
    pkg: nginx
    state: installed

- name: nginx is running
  service:
    name: nginx
    state: started
    enabled: true
```

なお、ここまでのPlaybookを実行すると、ブラウザでweb01のグローバルアドレスに接続することでNginxのデフォルトページを参照することができるようになります。

# php-fpmのインストール
wordpressはPHPで稼働するため、php-fpmのインストールを行います。

```diff:wordpress.yml(変更部分)
 hosts: webapps
   become: true
   roles:
     - { role: nginx, tags: [nginx] }
+    - { role: php-fpm, tags: [php-fpm] }
```
```shell-session:command
> mkdir -p roles/php-fpm/tasks
```

amzn-updatesリポジトリにphp71が入っていたので、yumでこちらをインストールします。[^1]

[^1]: php71にしたのは新しい方がいいだろうと思っただけで、特に意味はありません。

また、Playbookの初回実行時には関係ありませんが、修正して複数回実行することを想定して`notify`を定義しています。

```yaml:roles/php-fpm/tasks/main.yml
---
- name: php installed
  yum:
    pkg: '{{ item }}'
    state: installed
  with_items:
    - php71
    - php71-fpm
    - php71-mbstring
    - php71-mysqlnd
  notify:
    - restart php-fpm
```
```yaml:roles/php-fpm/handlers/main.yml
---
- name: restart php-fpm
  service:
    name: php-fpm
    state: restarted
```

PHPのタイムゾーンを東京に変更します。

```yaml:roles/php-fpm/tasks/main.yml(追記)
- name: timezone of php is Asia/Tokyo
  lineinfile:
    path: /etc/php.ini
    regexp: '^;date.timezone ='
    line: 'date.timezone = "Asia/Tokyo"'
    backrefs: yes
  notify:
    - restart php-fpm
```

php-fpmをrpmでインストールすると既定ではApacheで実行されるようになっているので、Nginx用に実行ユーザー等を変更します。

なお、`lineinfile`は`backrefs`オプションで動作が変わります。
`backrefs: yes`が指定されない場合、**`regexp`の条件にマッチしなければファイル末尾に`line`が追記される**動きとなります。

```yaml:roles/php-fpm/tasks/main.yml(追記)
- name: execution user definition
  lineinfile:
    path: /etc/php-fpm.d/www.conf
    regexp: '^user = apache'
    line: 'user = {{ php_fpm.user }}'
    backrefs: yes
  notify:
    - restart php-fpm

- name: execution group definition
  lineinfile:
    path: /etc/php-fpm.d/www.conf
    regexp: '^group = apache'
    line: 'group = {{ php_fpm.group }}'
    backrefs: yes
  notify:
    - restart php-fpm

- name: Set owner of session directories
  file:
    path: /var/lib/php
    recurse: yes
    owner: "{{ php_fpm.user }}"
    group: "{{ php_fpm.group }}"
  notify:
    - restart php-fpm
```
```yaml:group_vars/all.yml(追記)
php_fpm:
  user: nginx
  group: nginx
```

最後にphp-fpmのサービス起動設定を行います。

```yaml:roles/php-fpm/tasks/main.yml(追記)
- name: php-fpm is running
  service:
    name: php-fpm
    state: started
    enabled: true
```

# wordpressソースファイルの展開
PHPの実行基盤ができたので、wordpressをインストールしていきます。
まずはロールの追加から。

```diff:wordpress.yml(変更部分)
 hosts: webapps
   become: true
   roles:
     - { role: nginx, tags: [nginx] }
     - { role: php-fpm, tags: [php-fpm] }
+    - { role: wordpress, tags: [wordpress] }
```
```shell-session:command
$ mkdir -p roles/wordpress/tasks
```

Wordpressはプレイブック実行時の最新を使うことにします。
展開先は`/var/lib/`以下としていますが直接指定はせずに変数で指定しています。
また、php-fpmの実行ユーザーをディレクトリの所有者として設定しています。

なお、展開後のディレクトリパスは頻繁に参照するので`wordpress_home`としてアクセスできるよう変数に定義しておきます。

```yaml:group_vars/all.yml(追記)
wordpress:
  root: /var/lib
  alias: wordpress
  user: '{{ php_fpm.user }}'
  group: '{{ php_fpm.group }}'
```
```yaml:roles/wordpress/tasks/main.yml
---
- name: unarchived Wordpress
  unarchive:
    src: 'https://ja.wordpress.org/latest-ja.tar.gz'
    dest: '{{ wordpress.root }}'
    remote_src: true
    owner: '{{ wordpress.user }}'
    group: '{{ wordpress.group }}'

- name: set wordpress_home
  set_fact:
    wordpress_home: '{{ wordpress.root }}/{{ wordpress.alias }}'
```

WordPressを展開したら、そこにphp-fpmを使用してアクセスするよう、Nginxに設定をします。

なお、Nginxでサブディレクトリ毎にWebアプリを展開する方法については[こちらのサイト](http://variedtastefinder.jp/blog/?p=2407)がわかりやすくてとても参考になりました。

```yaml:roles/wordpress/tasks/main.yml(追加)
- name: Nginx settings for wordpress
  template:
    src: wordpress.j2.conf
    dest: /etc/nginx/default.d/wordpress.conf
    owner: root
    group: root
    mode: 0644
  notify:
    - restart nginx
```
```jinja:roles/wordpress/templates/wordpress.j2.conf
location /{{ wordpress.alias }} {
        alias {{ wordpress.root }}/{{ wordpress.alias }};
        index index.php;

        location ~ /{{ wordpress.alias }}/.*\.php$ {
                fastcgi_pass   unix:/var/run/php-fpm/www.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  {{ wordpress.root }}/$uri;
                include fastcgi_params;
        }
}
```

ここまでのPlaybookをAnsibleで実行すると、`http://<IP>/wordpress/`でWordpressのセットアップウィザードにアクセスできます。
が、まだデータベースを作っていないのでセットアップはできません。

# 次回
次回から、RDSのセットアップをしてwordpressで使用するデータベースを準備していきます。

- [aws上に作成したansibleサーバーでテストサイトを構築する(6) RDSの構成-1](https://qiita.com/yoshino_dd/items/8d559b60d5b9f316d8bb)

---
---