Apache:モジュール(データ圧縮送信、リライト、PHP、キャッシュ、リバースプロキシ等）


#モジュールの一覧表示、追加
## 組み込まれているモジュールの一覧を表示する			
```
# apachectl
$ apachectl -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
```

##モジュールの追加
モジュールの追加方法は2通りある。

- 1.DSOのモジュールをインストールする
動的共有オブジェクト(DSO:Dynamic Shared Object)としてコンパイルする

- 2.モジュールをApacheの実行ファイルに組み込む
サーバがビルドされるときにhttpdバイナリに静的に組み込む

###1.DSOのモジュールをインストールする
####インストールされているモジュールを有効にする
#####LoadModule:DSOのモジュールをApacheに追加する
```httpd.conf
# The following modules are not loaded by default:
#
LoadModule asis_module modules/mod_asis.so
```

####OSで用意されているモジュールをインストールする
```
$ yum install mod_wsgi
```

###2.モジュールをApacheの実行ファイルに組み込む

####DSOモジュールをコンパイルする場合


コンパイルして追加する

```	
## ソースのあるディレクトリに移動
$ cd ~/src/httpd-2.2.27/modules/mappers/

##コンパイルとインストールの実行処理
# /usr/local/apache2/ :apacheをインストールしたディレクトリ
# apxs :apacheを拡張するためのツール
# -cia :コンパイルとインストールの設定ファイルに追加
$ /usr/local/apache2/bin/apxs -cia mod_rewrite.c
```

モジュールのインストールを確認する

```
$ ls  /usr/local/apache2/modules
httpd.exp  mod_rewrite.so
```
設定ファイルを確認する

```
$ less /usr/local/apache2/conf/httpd.conf
```
```httpd.conf
LoadModule rewrite_module     modules/mod_rewrite.so
```

####組み込みのモジュールを指定する場合

```
# ソースのディレクトリに移動
$ cd ~/src/httpd-2.2.27
# ./configure :設定プログラムを実行する
# --enable-info :モジュールmod_infoを指定
$ ./configure --enable-suexe --with-suexec-docroot=/home--enable-info
$ make #設定処理の実行(コンパイル)
$ make install #インストール

```

#データを圧縮して送る(mod_deflate)
データを圧縮することで利用している回線に設定されている転送速度や転送量の制限に対応できる。
mod_deflateを使うと、Apacheがクライアントにデータ送信する前に自動的にデータを圧縮してから送信する。データを受け取ったWEBブラウザはヘッダー情報から判断して自動的にデータを復元する。
回線がボトルネックの場合に有効でサーバーの性能がボトルネックの場合は圧縮処理でサーバーに負荷がかかるので逆効果になる。

```
# -lz:モジュール作成時にzlibを組み込むオプション
$ cd ~/src/httpd-2.2.27/modules/filters/
$ /usr/local/apache2/bin/apxs -cia mod_deflate.c -lz
```
mod_deflateの設定を追加する 

```httpd.conf
## IFModule:モジュールが追加されている時のみ有効な設定
<IfModule mod_deflate.c>
## AddOutputFilterByType:レスポンスを処理するフィルターにMIMEタイプを割り当てる
# text/html形式にフィルターDEFLATEを当てる
AddOutputFilterByType DEFLATE text/html
</IfModule>
```

#違うURLでアクセスさせる(mod_rewrite)
mod_rewriteはユーザーがアクセスしたURLを別のURLに変換する機能を持つ。AliasやScriptAliasより高度な転送設定が可能。

```	
$ cd ~/src/httpd-2.2.27/modules/mappers/
$ /usr/local/apache2/bin/apxs -cia mod_rewrite.c
```

```httpd.conf
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/(hello|env)\.html /usr/local/apache2/htdocs/index.html
</IfModule>
```

#PHPを使う(mod_php)

##PHPをインストールする
phpをbuildするのに必要なパッケージをインストール

```
$ yum install gcc
$ yum install perl
$ yum install libxml2
$ yum install libxml2-devel
```
PHPをダウンロードしてソースからインストール

```
$ wget http://jp1.php.net/get/php-5.6.6.tar.bz2/from/this/mirror
$ mv mirror php-5.6.6.tar.bz2
$ tar xvf php-5.6.6.tar.bz2
```

ソースをシステムに合わせて設定する

```
#
$ cd /home/vagrant/src/php-5.6.6
## 設定する
# apxsを指定
# 日本語を処理できるように指定
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-iconv --enable-mbstring
# コンパイル、インストール
$ su
$ make
$ make install
```
####http.conf:.phpファイルがmod_phpを使用するようにする設定

```
vi /usr/local/apache2/conf/httpd.conf
```
```httpd.conf
# SetHandler: ハンドラをセットする
# application/x-http-php :mod_phpを利用するハンドラ
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

```

apacheを再起動して設定を反映させる

```
#
$ /usr/local/apache2/bin/apachectl restart
```

http://example.com/now.php にアクセスする

####http.conf:.phpファイルをソースコードのまま表示する場合の設定
```
# SetHandler: ハンドラをセットする
# application/x-http-php-source :ソースコードのまま表示する
<FilesMatch \.phps$>
	SetHandler application/x-httpd-php-source
</FilesMatch>
```

##PHPの動作を試す
```
$ vi /usr/local/apache2/htdocs/now.php
```

```now.php
<html>
	<head><tilte>PHP Test</title></head>
	<body>
	<p><?php echo date('D, d M Y H:i:s T',time()); ?>
	</p>
	</body>
</html>
```

Warnigが出たら、

```
$ cp /usr/share/zoneinfo/Japan localtime
```

#動的なコンテンツをキャッシュする(mod_cache)
PHPのように動的にページを生成していながらも繰り返し表示が必要な場合がある場合、ページの内容をキャッシュして保存しておく。アクセスされた時にクライアントにキャッシュの内容を表示することで高速化する。

###mod_cache
コンテンツのキャッシュを生成することができる
###mod_disk_cache
生成されたキャッシュをディスクに保存して管理できる

## モジュールを追加する

```	
$ cd ~/src/httpd-2.2.27/modules/cache/
$ /usr/local/apache2/bin/apxs -cia mod_cache.c cache_storage.c cache_util.c mod_mem_cache.c cache_cache.c cache_pqueue.c cache_hash.c
$ /usr/local/apache2/bin/apxs -cia mod_disk_cache.c
```

```	httpd.conf
# CacheEnable :方式と対象を指定してキャッシュを有効にする
# CacheRoot :キャッシュを保管するディレクトリを指定する
<IfModule mod_disk_cache.c>
	CacheEnable disk /
	CacheRoot	"/var/cache/mod_proxy"
</IfModule>
```
apacheを再起動して設定を反映させる

```
#
$ /usr/local/apache2/bin/apachectl restart
```

##スクリプトをキャッシュに対応させる
now.phpの先頭に以下の1行を追加する。

```now.php
	<?php header ('Experts: ' .gmdate('D, d M Y H:i:s T',time() + 600)); ?>
```

http://example.com/now.php にアクセスする


#リバースプロキシを立てる(mod_proxy)
リバースプロキシとは、アクセスする側から見て目的のサーバーの手前に設置して、アクセスする際には必ず経由するようにしたプロキシサーバーのこと。
用途としては、動的コンテンツのキャッシュをリバースプロキシに保存し、必要な処理だけPHPサーバーに投げる等のパフォーマンスの改善を見込む。mod_proxy_balancerと組み合わせて複数サーバーのクライアントの処理を分散させて負荷を軽減する。等。


##モジュールを追加する

```
$ cd /home/vagrant/src/httpd-2.2.27/modules/proxy/
$ /usr/local/apache2/bin/apxs -cia mod_proxy.c proxy_util.c
```

##http.confを設定する

```
# ProxyPass:自分のパスを他のサーバーに結びつける
# ProxyPassReverse:リバースプロキシしたサーバーからレスポンスを書き換えて自分に向ける
<IfModule mod_proxy.c>
ProxyPass /app http://192.168.33.10/app
ProxyPassReverse /app http://192.168.33.10/app
</IfModule>
```

クライアントからアクセスする
http://example.com/app/hello.php