CentOS6 or 7 + Apache2系のインストール手順

## 概要
CentOS6もしくは7にApache2系インストールする手順。

## 環境
### CentOS6系

- CentOS 6.7
- Apache 2.2.15

### CentOS7系

- CentOS 7.1
- Apache 2.4.6

## Apacheのインストール

```
$ sudo yum install -y httpd
```

## 起動と自動起動設定

### CentOS6系の場合

```
$ sudo /etc/init.d/httpd start
$ sudo chkconfig httpd on
```

インストールされるバージョン

```
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Mar 22 2017 06:52:55
```

### CentOS7系の場合

```
$ sudo systemctl restart httpd
$ sudo systemctl enable httpd
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
```


インストールされるバージョン

```
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28
```

## ServerNameを設定
/etc/httpd/conf/httpd.confで、
ServerNameの項目を探し、ドメインを設定する。
ドメインが存在しない場合、適当な文字列でも動きます。

```
$ sudo vi /etc/httpd/conf/httpd.conf
```

```ini:/etc/httpd/conf/httpd.conf
# **snip**

ServerName www.example.com:80

# **snip**
```

参考：[Apacheでhttpd: Could not reliably determine the server's fully qualified domain nameと言われる解決方法](http://qiita.com/pugiemonn/items/41d4bebf48437eed3f4c)

## Virtualhostの設定
`/etc/httpd/conf/httpd.conf` とは別に `/etc/httpd/conf.d` の下に、
各virtualhostごとの設定ファイルを作成する。
DocumentRootは、`/var/www/html/sample_project/public`とする。

```
$ sudo vi /etc/httpd/conf.d/sample_project.conf
```

```ini:/etc/httpd/conf.d/sample_project.conf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName sample_project_web.com
    ServerAlias www.sample_project_web.com

    DirectoryIndex index.html index.php
    DocumentRoot "/var/www/html/sample_project/public/"

    <Directory "/var/www/html/sample_project/public">
        Options FollowSymLinks
        AllowOverride All
        # Apache2.4未満の場合は不要
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/sample_project/error.log
    CustomLog /var/log/httpd/sample_project/access.log combined
    # E_ALL & ~E_NOTICE
    php_value error_reporting 6135
</VirtualHost>
```

Apache2.4未満の場合、`Require all granted`の記述があると、
`configuration error:  couldn't perform authentication. AuthType not set!: /`
このようなエラーが出てしまうので、記述しないようにする。
CentOS6系では、Apache2.4未満がインストールされるようなので注意。

参考記事：[http://stackoverflow.com](http://stackoverflow.com/questions/21265191/apache-authtype-not-set-500-error)

## httpへのアクセスをすべてhttpsにリダイレクトする設定
以下は、Apache/2.4.8以前の場合の設定。
`SSLCertificateFile`は、Apache/2.4.8以降や、nginxでは使用しません。

```conf
<VirtualHost *:80>
  ServerName sample_project_web.com:80

  RewriteEngine On
  LogLevel alert rewrite:trace3
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName sample_project_web.com
    ServerAlias www.sample_project_web.com

    DirectoryIndex index.html index.php
    DocumentRoot "/var/www/html/sample_project/public"

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCertificateKeyFile   /etc/pki/tls/private/sample_project.key
    SSLCertificateChainFile /etc/pki/tls/private/sample_project.crt_and_key
    SSLCertificateFile      /etc/pki/tls/certs/sample_project.crt

    SetEnv ENV development

    <Directory "/var/www/html/sample_project/public">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/sample_project/error.log
    CustomLog /var/log/httpd/sample_project/access.log combined
    # E_ALL & ~E_NOTICE
    php_value error_reporting 6135
</VirtualHost>
```

## アプリケーションファイルの設置ディレクトリの権限を適切にする
アプリケーションファイルが設置されている場所を、apacheの実行ユーザーがreadできる権限を持つ必要がある。

/var/www/htmlを、アプリケーションファイルの所有者に変更する。
下記はvagrantユーザーを使用している例。

```
$ sudo chown vagrant:vagrant /var/www/html
```

ディレクトリのパーミッションが755であることを確認する。

```
$ ll /var/www

drwxr-xr-x 3 root root 27  5月 18 21:03 html
```

参考：[Webサーバーのパーミッションの設定〜ユーザー権限の考え方](http://itstudio.co/2015/08/20/4616/)

## Virtualhostのログ出力用ディレクトリを作成

```
$ sudo mkdir /var/log/httpd/sample_project
```

## Apacheの再起動

### confの文法チェック
apacheを再起動する前に、書きコマンドでconfの文法チェックを行う。

```
$ sudo apachectl configtest
Syntax OK
```

### Apacheの再起動

```
$ sudo apachectl restart
```

もしくは

#### CentOS6系の場合

```
$ sudo /etc/init.d/httpd restart
```

#### CentOS7系の場合

```
$ sudo systemctl restart httpd
```

## Firewall設定
CentOS7の場合は、firewallの、80番 (http) と 443番 (https)のポートを開ける必要あり。CentOS6では不要。

```
$ sudo firewall-cmd --permanent --zone=public --add-service=http 
$ sudo firewall-cmd --permanent --zone=public --add-service=https
$ sudo firewall-cmd --reload
```

## Basic認証のかけ方
### htpasswdの作成

```shell-session
$ htpasswd -c -b /etc/httpd/conf/.htpasswd ユーザ名 パスワード
```

### confの編集
httpd.confか、conf.d/sample.confに以下を追記。
`Require all granted`は削除する。

```diff
    <Directory "/var/www/html/sample_project/public">
        Options FollowSymLinks
        AllowOverride All
-       Require all granted

+       AuthUserFile /etc/httpd/conf/.htpasswd
+       AuthGroupFile /dev/null
+       AuthName "Basic Auth"
+       AuthType Basic
+       Require valid-user
    </Directory>
```

以上