Apacheの基本設定

#概要
apacheについて、色々調べたのでメモ程度にまとめてます。
インストール・設定・モジュール等について書きます。
まだ知識不足なので間違いがありましたら、ご指摘ください。

#インストール
インストールには以下2つの方法がある。
・ソースからコンパイル
・パッケージを利用する

###ソースからコンパイル
configure→make→make installの順でコンパイル

```
例)
$ ./configure --prefix=/usr/local/apache --enable-module=ssl
```
オプションの説明。
```--prefix=パス```でインストール先のディレクトリを指定。
```--enable-module=ssl```でsslという標準モジュールを組み込む。

詳細はこちらで、[Apache HTTP Server Version 2.0
コンパイルとインストール](http://www.kotobuki-p.co.jp/manual/install.html)

###パッケージを利用

RedHat系

```
# yum install httpd
```

Debian系

```
# apt-get install apache2
```


#Apacheの設定
主に設定ファイル、設定の仕方を書きます。

##設定ファイル
###ソースからコンパイル
メイン設定ファイルです。その他設定ファイルあり。
```/usr/local/apache2/conf/httpd.conf```

###RedHat系
メイン設定ファイル
```/etc/httpd/conf/httpd.conf```
補助設定ファイルを格納するディレクトリ
```/etc/httpd/conf.d```

###Debian系
メイン設定ファイル
```/etc/apache2/apache2.conf```
補助設定ファイルのディレクトリ
```/etc/apache2/```
ポートの設定
```/etc/apache2/ports.conf```

##設定方法

###書式
以下のような形で記述されている。
設定項目

```
ディレクティブ名 設定値
```

適用範囲

```
<Files ファイル名> ... </Files>
<Directory ディレクトリ名> ... </Directory>
<Location URL> ... </Location>
```

ディレクティブの設定方法は長いのでこちらを参考に。
[httpd.confの設定](http://linux.kororo.jp/cont/server/httpd_conf.php)
[httpd.confの設定ディレクティブ](https://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/s1-apache-config.html)

#Apacheの制御
CLIでのシステム制御方法について。

###SysVinit
```
# /etc/init.d/httpd start      //Debianではapache2
```

###systemd
```
# systemctl start httpd.service    //Debianではapache2
```

### apachectl
```
# apachectl start
```
以下apachectlのサブコマンド。
・start:起動
・stop:終了
・restart:再起動
・graceful:安全に再起動
・reload:設定ファイルを再読み込み
・configtest:設定ファイルの構文チェック

#モジュール
モジュールの組み込み、表示等を書いています。

###モジュール一覧
とても多いので外部サイトを参考に。
[モジュール一覧 - Apache HTTP サーバ バージョン 2.4](https://httpd.apache.org/docs/2.4/ja/mod/)

モジュールは```/usr/lib/httpd/modules```などにインストールされる。
ロードするにはhttpd.confで```LoadModule```ディレクティブを使い指定する。

```
例)
LoadModule ssl_module modules/mod_ssl.so
```
sslモジュールをロードしている。

###組み込み方
apacheのインストール後にモジュールを組み込むには、```apxs```コマンドを使う。
以下でmod_hogeモジュールをDSOとしてコンパイルし、インストールしている。
apxsはこちらを参照。[apxsのオプション](https://spirits.appirits.com/doruby/9429/)

```
$ sudo apxs -i -a -c mod_hoge.c
```
その後、httpd.confにLoadModuleディレクティブを追記。

```
LoadModule hoge_module modules/mod_hoge.so
```
apacheのコンパイル時に```--configure```オプションでモジュールを静的に組み込むことも可能。

###モジュールの表示
組み込み済みモジュール

```
# httpd -l           //RedHat

$ sudo apache2 -l    //Debian
```
一覧/有効無効

```
# httpd -M    // 組み込みモジュールとDSOモジュールの一覧。設定ファイルの文法チェック

$ sudo a2enmod  //利用可能なモジュールを表示し、対話的にモジュールを有効化する
$ sudo a2dismod //モジュールの無効化
```
変更後にはapacheの再起動が必要。

#アクセスの認証
基本認証(BASIC認証)とダイジェスト認証があり、IPアドレス・ホスト名でのアクセス制御もできる。

###基本認証
```
<Directory "/var/www/html/hoge">
    AuthType Basic
    AuthName "ダイアログに出力されるメッセージ"
    AuthUserFile /etc/httpd/conf/htpasswd
    Require valid-user
</Directory>
```
```Require valid-user```と指定するとパスワードファイルのすべてのユーザがアクセスを許可される。
ユーザ名を列挙すると指定ユーザのみが許可される。

ユーザ名とパスワードを設定するには```htpasswd```コマンドを使う。
[Manual Page: htpasswd](http://home.lu.lv/manual/programs/htpasswd.html.ja.jis)

また、グループでの認証も可能。

###ダイジェスト認証
```
<Directory "/var/www/html/digest-hoge">
    AuthType Digest
    AuthName "digest-hoge"
    AuthUserFile /etc/httpd/conf/htdigestfile
    Require valid-user
</Directory>
```

※```AuthName```は認証の領域を指定する。これが違うと認証ができない。
ダイジェスト認証のためのユーザとパスワードの設定は```htdigest```コマンドを使う。

[htdigest - manage user files for digest authentication](https://httpd.apache.org/docs/2.4/programs/htdigest.html)

###ホストベースのアクセス

Requireディレクティブを使ったアクセス制御。
```authz_host_module```モジュールで提供されています。
※```Order, Allow, Deny```によるアクセス制御は非推奨。

書式

```
Require エンティティ [値...]
```
見やすいのでapacheの公式ではないが、これを参考に。[Requireディレクティブ](https://www.javadrive.jp/apache/allow/index1.html)

#バーチャルホスト
バーチャルホストを使用すると1台のサーバで複数のwebサイトを管理できる。
名前ベースとIPベースのバーチャルホストがある。

###名前ベースのバーチャルホスト
1つのIPアドレスと複数のドメイン名を設定する。

```
//1つ目
<VirtualHost *:80>
    ServerName web.hoge.jp
    ServerAdmin web@web.hoge.jp
    DocumentRoot /var/www/hoge
</VirtualHost>

//2つ目
<VirtualHost *:80>
    ServerName www.example.net
    ServerAdmin web@example.net
    DocumentRoot /var/www/example
</VirtualHost>
```

###IPベースのバーチャルホスト
複数のIPアドレスと複数のドメイン名を設定する。
```Listen```ディレクティブでIPアドレスを指定する。

```
Listen 192.168.1.10:80
Listen 192.168.1.11:80

===省略===

//1つ目
<VirtualHost 192.168.1.10:80>
    ServerName web.hoge.jp
    ServerAdmin web@web.hoge.jp
    DocumentRoot /var/www/hoge
</VirtualHost>

//2つ目
<VirtualHost 192.168.1.11:80>
    ServerName www.example.net
    ServerAdmin web@example.net
    DocumentRoot /var/www/example
</VirtualHost>
```

#その他
###SSL/TLS
[SSL/TLS Strong Encryption](https://httpd.apache.org/docs/2.4/ja/ssl/ssl_howto.html)
[Apache2.4でHTTPS通信を行うための環境構築手順と詰まりどころ](https://qiita.com/naganao/items/fe119b2818479b730c74)

###プロキシサーバ
[Squidをリバースプロキシとして使ってみた](https://server-setting.info/centos/squid-reverse-proxy.html)