Apache 2.4 設定

# はじめに
[CentOS 7 minimal インストール ～ LAMP 構築まで](http://qiita.com/wreath/items/f9d6b2128d7a5bf5a2f1)

こちらは上の記事の続きとなります。

# Apache 用ユーザーの作成
専用の Apache 実行ユーザーを作成しておきたい派なので作成します。

```
[root@localhost ~]# useradd web
[root@localhost ~]# passwd web
```

# Apache 各種設定
項目別に設定を行っていきます。
通常変更しないものはスルーします。

```
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
```

## Listen
```apache:
Listen 80
```

待受ポートの設定です。
特に理由がなければ 80 のままでいいでしょう。

## User / Group
```apache:
#User apache
#Group apache
User web
Group web
```

先程作成した web ユーザーに変更します。
また変更前のユーザーに所有権が割り振られているディレクトリも変更しておく必要があります。

```
[root@localhost ~]# chown -R root:web /var/lib/php/*
[root@localhost ~]# chown -R web:web /var/www/
```

- /var/lib/php/ 以下は php 関連の一時ファイル置き場です。
- /var/www/ 以下は Web 関連のデータ置き場です。

## ServerAdmin
```apache:
#ServerAdmin root@localhost
ServerAdmin hoge@example.com
```

サーバ管理者の連絡先です。
サーバエラーが発生した際などに表示されます。

## DocumentRoot
```apache:
DocumentRoot "/var/www/html"
```

サーバに http アクセスしたときのルートディレクトリです。
http://192.168.56.101/index.html にアクセスしたときは /var/www/html/index.html が表示されます。
このパスはお約束みたいなものなので、マウントしているストレージを DocumentRoot にしたい場合は /var/www/html 自体をシンボリックリンクにしてしまったほうがわかりやすいです。

```
[root@localhost ~]# rmdir /var/www/html
[root@localhost ~]# ln -s /mnt/hoge /var/www/html
```

## AddDefaultCharset
```apache:
#AddDefaultCharset UTF-8
```
コメントアウトすることを推奨します。
この設定は HTML の meta タグより優先されてしまうため文字化けの原因となるからです。

## Options / Allowoverride
```apache:
<Directory "/var/www/html">
#    Options Indexes FollowSymLinks
#    AllowOverride None
    AllowOverride FileInfo
    Require all granted
</Directory>
```

Options の Indexes と FollowSymLinks は常に ON である必要性がないので OFF にしておきます。
Allowoverride は mod_rewrite で必要となる FileInfo のみ許可します。


# アクセス制御
アクセス制御の記法は 2.4 で大きく変更となり、よりプログラムチックな制御が出来るようになりました。
以下のディレクティブで細かく制御を行うことが出来ます。

- RequireAny
    - ディレクティブ内に記述されたいずれかの条件を満たしたら真となる
- RequireAll
    - ディレクティブ内に記述された全ての条件を満たしたら真となる
- RequireNone
    - ディレクティブ内に記述されたいずれか条件を満たさなかったら真となる

もしどれも記述せずいきなり *Require ...* と記述した場合、RequireAny で囲まれているものとして扱われます。

## 実例
### すべてのアクセスを許可

```apache:
<Directory "/var/www/html">
  # いきなり Require を書いているので <RequireAny> で囲まれていると判断される
  # <RequireAny>
    Require all granted
  # </RequireAny>
</Directory>
```

### すべてのアクセスを拒否

```apache:
<Directory "/var/www/html">
  # <RequireAny>
    Require all denied
  # </RequireAny>
</Directory>
```

### 特定の IP アドレスからのアクセスのみ許可

```apache:
<Directory "/var/www/html">
  # <RequireAny>
  Require ip 192.168.1.1
  # </RequireAny>
</Directory>
```

### 特定の IP アドレスからのアクセスを拒否

```apache:パターン1
<Directory "/var/www/html">
  <RequireAll>
    # 全て許可するが
    Require all granted
    # 192.168.1.1 は拒否
    Require not ip 192.168.1.1
  </RequireAll>
</Directory>
```


```apache:パターン2
<Directory "/var/www/html">
  <RequireAll>
    # 全て許可するが
    Require all granted
    # 192.168.1.1 は拒否
    <RequireNone>
      Require ip 192.168.1.1
    </RequireNone>
  </RequireAll>
</Directory>
```

# LDAP 認証
```apache:基本パターン
<Directory "/var/www/html">
  AuthName "LDAP"
  AuthType Basic
  AuthBasicProvider ldap
  AuthLDAPURL ldap://ldaphost/o=yourorg

  # 認証が通れば誰でもアクセス許可
  Require valid-user
</Directory>
```

```apache:ちょっと複雑
<Directory "/var/www/html">
  AuthName "LDAP"
  AuthType Basic
  AuthBasicProvider ldap
  AuthLDAPURL ldap://ldaphost/o=yourorg

  <RequireAll>
    <RequireAny>
      # campany.local ドメインの development 組織にある team1 に所属していれば許可
      Require ldap-group  cn=team1,ou=development,dc=campany,dc=local

      # もしくは team2 に所属しており IP が 192.168.10.0/24 なら許可
      <RequireAll>
        Require ldap-group  cn=team2,ou=development,dc=campany,dc=local
        Require ip 192.168.10.
      </RequireAll>
    </RequireAny>
  </RequireAll>
</Directory>
```

# 小ネタ

**設定ファイルの分散**

```apache:
IncludeOptional conf.d/*.conf
```

httpd.conf の末尾には上記のような記述がされており、conf.d 以下にある全ての conf ファイルを自動でロードするようになっています。
そのためアプリケーション設定などは conf.d 以下にまとめて記述しておくと管理が楽になります。