RaspbianにおけるApache2の設定

Raspberry Pi 3にApache2とPHPをインストールしたときの設定メモです。
ラズパイのOSはRaspbianでDebian系なので、DebianやUbuntuで検索すれば大抵の解決策はヒットします。

# インストール
```bash
$ sudo apt-get install apache2
```

# Apacheの起動・停止・再起動
```bash
# 起動
$ sudo service apache2 start
# 停止
$ sudo service apache2 stop
# 再起動
$ sudo service apache2 restart
```

**設定ファイル変更して、変更を反映させるには必ず再起動が必要。**


# 設定ファイルについて

```/etc/apache2/``` ディレクトリに設定ファイルが作成される。

最初に```/etc/apache2/apache2.conf```の設定ファイルが読み込まれる。

次に```/etc/apache2/conf.d```以下の設定ファイルが追加で読み込まれる。

仮想ホストの設定は```/etc/apache2/sites-available```ディレクトリにあるファイル

モジュールの設定は```/etc/apache2/mods-available```ディレクトリにあるファイル

仮想ホストやモジュールの設定は、実際に読み込まれるのは```*-available```ではなく```*-enabled```ディレクトリにあるシンボリックリンクであり、有効にしたい設定のシンボリックリンクを作るという感じで設定を有効にする。

## 設定ファイルの構造
一行ごとに```ディレクティブ```と呼ばれる設定内容を記述する。```セクションコンテナ```内に書いた設定は、セクションコンテナ内だけ有効の設定となる。

```conf:/etc/apache2/apache2.conf
<Directory "/var/www/html">  # セクションコンテナ
        #Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>
```

# ポート番号の設定

Apacheが待ち受けるポート番号の設定は次のように設定する。

```conf:/etc/apache2/ports.conf
Listen 80  # Apacheが待ち受けるポート番号

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>
```

```conf:/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    # (略)
</VirtualHost>

```

# 管理者のメールアドレスの設定

```conf:/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    ServerAdmin hoge@gmail.com
    # (略)
</VirtualHost>
```

# サーバ名の設定

　```/etc/apache2/conf.d```ディレクトリに新しく```servername```というサーバ名専用の設定ファイルを新しく作成する。

```conf:/etc/apache2/conf.d/servername
ServerName www.hoge.jp:80  # エラー時に表示されるサーバ名とポート番号
UseCanonicalName On        # Onにするとサーバ名としてServerNameの値を使う
```

作成した設定ファイルを読み込ませる設定を書く。

```conf:/etc/apache2/apache2.conf
Include conf.d/servername
```

# ドキュメントルートの設定

WEBサーバは独自にルートディレクトリを持っており、そこにHTMLファイルなどを置く。このWEBサーバのルートディレクトリを```ドキュメントルート```と呼ぶ。

```/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        # /var/www/htmlディレクトリをドキュメントルートとする設定
        DocumentRoot /var/www/html  
</VirtualHost>
```

# エラーログの設定

Apache2系のエラーはデフォルトで```/var/log/apache2/error.log```に出力される。
ファイル名等を変更したい場合は以下の設定を変更する。

```conf:/etc/apache2/apache2.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
```

${APACHE_LOG_DIR}の設定は```/etc/apache2/envvars```に書いてある。

# インデックスファイルの設定

WEBブラウザのURL欄にディレクトリを指定してページを開いたとき、あらかじめ設定されたファイルを開きたい。

たとえば、index.htmlを開くようにするには次のようなディレクティブを追記する。

```conf:/etc/apache2/apache2.conf
DirectoryIndex index.html index.htm  # 左のものが優先される
```

# ファイル一覧を表示しないようにする

WEBブラウザのURL欄にディレクトリを指定してページを開くと、ファイルの一覧が開く。これを無効化したい。

たとえば、```/var/www/html```がルートディレクトリのとき、ルートディレクトリ以下すべてのページでこれをしたい場合、次のディレクティブを追記する。

```conf:/etc/apache2/apache2.conf
<Directory /var/www/html>
        Options Indexes FollowSymLinks
</Directory>
```

# エラーページの設定

404エラーが発生したとき、専用の特別なページを表示したい。次のようにディレクティブを追記する。

```conf:/etc/apache2/apache2.conf
<Directory /var/www/html>
        # 404エラーのとき、/error/404.htmlを表示する
        ErrorDocument 404 /error/404.html
        ErrorDocument 403 /error/403.html
<Directory>
```

# ルートディレクトリ以外の場所のファイルを参照したい

すべてのファイルをルートディレクトリに設置したくない。このようなとき、エイリアスを設定することでディレクトリをルートディレクトリに存在するように見せることができる。

```conf:/etc/apache2/apache2.conf
# /etc/jquery/ディレクトリを、/jquery/と書いてアクセスできる。
Alias /jquery/ "/etc/jquery/"
<Directory /etc/jquery/>
        Require all granted
</Directory>
```

こうすることで、htmlファイルに次のように書くことができるようになる。

```html
<script type="text/javascript" src="/jquery/jquery-3.1.1.min.js"></script>
```

# ダイジェスト認証の設定

まず、htdigestコマンドでダイジェストファイルを作成する。

ファイル名：.htdigest
レルム名（AuthName）：RealmName
ユーザ名：Aoba
パスワード：zoizoizoi
とすると、

```shell
$ sudo htdigest -c /var/www/html/.htdigest 'RealmName' Aoba
Adding password for Aoba in realm RealmName.
New password:zoizoizoi
Re-type new password:zoizoizoi
```

次に、ダイジェスト認証モジュールを有効にする。

```shell
$ sudo a2enmod auth_digest  # 有効化する
$ sudo a2dismod auth_digest # 無効化する
```

ダイジェスト認証を有効にしたいディレクトリの設定を書く。

```conf:/etc/apache2/apache2.conf
<Directory /var/www/html>
        AuthType Digest
        AuthName "RealmName"  # レルム名
        AuthUserFile /var/www/html/.htdigest
        Require valid-user
</Directory>
```

# 文字コードの設定

どの文字コードでデコードされるべきかはHTTPリクエストとレスポンスのヘッダ情報に従うのが通常であり、文字化けの原因になるのでApacheの設定で指定しないほうが良い。

```conf:/etc/apache2/conf-available/charset.conf
# AddDefaultCharset UTF-8  # コメントアウトするか
AddDefaultCharset off      # offにする
```