Web 毎週1回Apacheのmoduleについて調べて書くコーナー

  1. what
  2. which
  3. how
  4. when
  5. where
  6. why

[調べる]mod_search_rast

[調べる]mod_rewrite

出来ること

  • ルールベースのリライトエンジンを使ってURLを書き換える
  • 無制限のルールで、各ルールに無制限のルールコンディションを設定することが出来る
  • サーバ変数、環境変数、HTTPヘッダー、タイムスタンプや、内部のデータベースを見てURLを書き換える事も可能

モジュールはfull URL

  1. サーバ->httpd.conf
  2. 各ディレクトリ->.htaccess

環境変数

CGI/SSL環境変数を使う リソースに対してロジカルなウェブ閲覧を行う

  1. SCRIPT_URL
  2. SCRIPT_URI

物理的なシステム閲覧を行う

  1. SCRIPT_NAME
  2. SCRIPT_FILENAME

Virtual Host

メイン設定でのVirutal Host設定には引き継がれないので、<VirtualHost?>の間に

RewriteEngine On 
RewriteOptions Inherit 

と書く必要がある。

RewriteBase?

....

フィルター関連

http://httpd.apache.org/docs/2.2/ja/mod/core.html

AddOutputFilterByType?

MIME-type に応じて出力フィルタを割り当てる。Apache 2.0.33 以降で使用可能。ただし 2.1 以降で非推奨。

AddOutputFilter?

ファイル名の拡張子をサーバからの応答を処理するフィルタに マップする

mod_actions

ディアタイプやリクエストメソッドに応じて CGI スクリプトを実行する機能を提供

Action

特定のハンドラやコンテントタイプに対して CGI を実行するように設定

# MIMEでimage/gifだった場合は/cgi-bin/images.cgiを実行する。
Action image/gif /cgi-bin/images.cgi

# 拡張子が.xyzだった場合は、/cgi-bin/program.cgiを実行する
AddHandler my-file-type .xyz
Action my-file-type /cgi-bin/program.cgi

※オプションの virtual 修飾子
リクエストされたファイルが実際に存在するかどうかを検査しないよう出来る。virtualなロケーションに使いたい場合など。

<Location /news>
SetHandler news-handler
Action news-handler /cgi-bin/news.cgi virtual
</Location>

Script

method というメソッドを使ってリクエストが行なわれたときに cgi-script を実行するという動作を追加します。(form method="post"とか)。 メソッド名は大文字小文字を区別します。メソッドを処理するリソース(PHPとか)があれば、そちらが優先される。GETはindex.html?hogeと言う感じで、引数がある時だけ呼ばれる

Script GET /cgi-bin/search
Script PUT /~bob/put.cgi

mod_dumpio

Apacheが受け取ったリクエスト、送ったレスポンスをエラーログに書き出す。データのロギングは、SSL 復号化の直後 (入力) と SSL 暗号化の直前 (出力) に行なわれる。ファイルサイズが大きいのでデバックの時だけにしましょう。

DumpIOInput(Apache 2.1.3 ~)

エラーログにすべての入力データをダンプ

 DumpIOInput On

DumpIOOutput(Apache 2.1.3 ~))

エラーログにすべての出力データをダンプ

DumpIOOutput On

mod_substitute

mod_substitute.c

出来る事

  • HTTPレスポンスのbody内を検索し、置換する
  • 正規表現、また固定文字の置換をする

Ver.

  • Apache 2.2.7 以降

設定方法

  • .htaccess/httpd.confに書く

<Location />
   AddOutputFilterByType SUBSTITUTE text/html
   Substitute s/foo/bar/ni <-s/対象パターン/置換内容/フラグ
</Location>
 <Location /html/seminar >   
   AddOutputFilterByType SUBSTITUTE text/html
   Substitute "s|<BR */?>|<br />|i" 
</Location>
 <Location /html/form/ >   
   AddOutputFilterByType SUBSTITUTE text/html
   Substitute "s| 1990 | 2008 |q" 
</Location>
<Location /nohtml>
 AddOutputFilter SUBSTITUTE .html
 AddType text/plain .html
 Substitute s/<[^>]+>//
</Location> 

フラグ

  • i : ケースセンシティブ(大文字小文字区別)にする
  • n : 通常は正規表現として挙動するが、nを付ける事で、固定文字列での扱いになる。
  • f : 同じ置換が行われる場合に置換を繰り返し行えるようにメモリに記憶させて単純化させる(ディフォルト)
  • q : 毎回置換作業を行う。この作業はより早い置換作業、メモリの使用減に繋がるが、同じ置換が二度と行われないようなファイルにたいして行うべきである。

mod_speling

/httpd-2.2.10/modules/mappers/mod_spelling.c

作成者: Alexei Kosut

出来ること

  • ユーザーが入力した URLファイル名がない場合、入力内容を既存ファイルと比較して、ほぼ合っているファイルへリダイレクトする
  • 許してくれる間違い:大文字、小文字での間違い
  • 許してくれる間違い:1文字までのミススペル

リクエストしているディレクトリ配下のファイルに対して比較を行う

ミススペルの定義

  1. 文字が1文字多い
  2. 省略
  3. 違う場所に文字がある、文字そのものが間違っている
  1. how
  • ディレクトリ以下を探し、比較などを行ってもなかった場合は、page not foundを返す
  • ほぼ合っているファイルがあればredirectとして返す
  • ほぼ合っているファイルが2つ以上あれば、リストとしてクライアントに返し、選んでもらう
<IfModule mod_speling.c>
CheckSpelling On
</IfModule>

CheckCaseOnly?

大文字小文字のチェックをするかどうかの設定

CheckCaseOnly on|off (default)

CheckSpelling?

スペルチェックを行うかどうかの設定

CheckSpelling on|off(default)

要注意点

  • ミススペルチェックを行うことでサーバに負荷がかかるのは否めない
  • 秘密にしたいファイルなどは検索対象のディレクトリに置かないようにする
  • userdirがonになっている場合でも、ユーザー名を検索する事は出来ない
  • DAVがあるディレクトリでは使用しない

mod_status

  • サーバの活動状況と性能に関する情報を提供するモジュール
  • 現時点でのサーバの統計情報をHTMLで表示する(自動的にリフレッシュも可能)

出来る事

default

  • リクエストを扱っているワーカーの数
  • アイドル (訳注: リクエストを扱っていない) ワーカーの数
  • サーバが起動もしくは再起動された時刻と動作している時間

httpd.confでオプションExtendedStatus? Onにした場合

  • 各ワーカーの状態、ワーカーが扱ったリクエストの数、 ワーカーが送った総バイト数
  • 総アクセス数と総バイト数
  • 平均の 1 秒あたりのリクエスト数、1 秒あたりの送られたバイト数、 リクエストあたりのバイト数
  • 各ワーカーと Apache 全体で使用されている CPU の割合
  • 現時点のホストと処理されているリクエスト

設定方法

<Location /server-status>
SetHandler server-status

Order Deny,Allow
Deny from all
Allow from .foo.com
</Location>

アクセスURI

http://your.server.name/server-status

リフレッシュ機能
ブラウザがリフレッシュ機能をサポートしていたら

http://your.server.name/server-status?refresh=N

でN 秒毎に更新する事が出来る

mod_proxy

  • Apacheのプロキシ/ゲートウェイ機能を実装
  • AJP13(Apache JServer Protocol ver.1.3), FTP, CONNECT(SSL用), HTTP/0.9, HTTP/1.0, HTTP/1.1のプロキシ機能を実装

拡張機能

mod_proxy +

  • mod_proxy_http
  • mod_proxy_ftp
  • mod_proxy_ajp
  • mod_proxy_balancer
  • mod_proxy_connect

その他拡張機能

  • キャッシュ->mod_cache ( +関連モジュール )
  • SSL/TLSで遠隔サーバに接続する機能 -> mod_ssl(SSLProxy* ディレクティブで 対応)

フォワードプロキシ

Client -- Proxy Server -- Origin Server

流れ

  1. client -> 行き先Origin Server/リクエストProxy Server
  2. Proxy Server -> コンテンツリクエストOrigin Server
  3. Proxy Server -> コンテンツが取得出来たらClientに返す

使われ方

  • ファイアウォールによって制限されている内部のクライアントに対してのイン ターネットへのアクセスを提供する
  • ネットワークの使用量を減らす為にキャッシュ機能を用いる事も可能

備考
承認されたクライアントのみがプロキシにアクセス出来るようにしたほうがよい 俗語で串を通すとか言ったりする

設定の例

ProxyRequests On
ProxyVia On

<Proxy *>
Order deny,allow
Deny from all
Allow from internal.example.com
</Proxy>

リバースプロキシ

Client -- Proxy Server -- Origin Server
  1. client -> 行き先/リクエストProxy Server
  2. Proxy Server -> リクエストごとにOther Serverに割り振る
  3. Proxy Server -> コンテンツが取得出来たらClientに返す

使われ方
インターネットユーザーに-ファイアウォールの中にあるサーバにアクセスを与 える場合
複数のバックエンドサーバに負荷分散をするロードバランサーの役割を与える事 が出来る

設定の例

ProxyRequests Off 

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

mod_headers

  • Cache-Control:max-age=秒数 #キャッシュデータの最大有効期限(秒)
  • Cache-Control:s-maxage=秒数 #Proxyにのみ適応されるキャッシュデータの最大有効期限(秒)
  • Cache-Control:public #ブラウザ/Proxyサーバでのキャッシュを許可
  • Cache-Control:private #ブラウザのみでのキャッシュを許可
  • Cache-Control:no-cache #ブラウザ/Proxyサーバでのキャッシュを許可しない
  • Cache-Control:no-store #ブラウザ/Proxyサーバでもキャッシュデータを保存しない、キャッシュデータを一時的な場所に保存した場合使用後できるだけ早く削除する
  • Cache-Control:must-revalidate #キャッシュデータを使用する際には有効期限を必ず検証する
  • Cache-Control:proxy-revalidate #Proxyサーバのキャッシュデータを使用する際には有効期限を必ず検証する

例 (HTML)

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta http-equiv="Cache-Control" content="no-cache">
		<meta http-equiv="Pragma" content="no-cache">
		<meta http-equiv="Expires" content="Fri, 10 Oct 2008 12:00:00 GMT">
	</head>

例(httpd.conf)

#ディレクトリ単位
	<Directory "/var/www/">
		Header append Cache-Control no-cache
		#Header append Cache-Control s-maxage=900
		#900秒後に有効期限が切れるようにする
		Header append Pragma no-cache
		〜略〜
	</Directory>
#特定の拡張子のみ
	<Files *.html>
		Header append Cache-Control no-cache
		Header append Pragma no-cache
	</Files>
#複数のファイルを指定
	<FilesMatch "\.(gif|jpe?g|png)$">
		Header append Cache-Control public
	</Files>

mod_expires

キャッシュデータの有効期限を設定する

	<Directory "/var/www/">
		ExpiresActive On
			#Expires/Cache-Controlヘッダを有効にする
		ExpiresDefault "access plus 1 month"
			#アクセスの1ヵ月後に有効期限が切れる			
		ExpiresByType image/gif "access plus 15 minutes"
		ExpiresByType image/gif A900
			#アクセス15分後にキャッシュの有効期限が切れるようにする
		ExpiresByType image/jpg "modification plus 5 hours"
		ExpiresByType image/jpg M18000
			#ファイル更新日時の5時間後にキャッシュの有効期限が切れるようにする
		
		
	Expires/Pragma(HTTP/1.1未対応ブラウザ用)
		例 : <meta http-equiv="Pragma" content="no-cache" />
		例 : <meta http-equiv="Expires" content="0" />
		例 : <meta http-equiv="Expires" content="86400" /> #24時間後

mod_cache

  • ファイルI/Oを最適化し、応答性を向上させる
  • キャッシングデータを高速アクセス可能なメモリに展開する事も可能
  • Allow や Deny ディレクトリを迂回する設定も可能
  • ホスト名やアドレスや環境変数に基づいてクライアントからの アクセスを制限 したい場合は、キャッシュ機能を有効にすべきでは ありません。by Apache

mod_disk_cache

ディスクにキャッシュデータを保存する場合に使用

	<IfModule mod_cache.c>
		<IfModule mod_disk_cache.c>
			CacheRoot /var/www/cache #キャッシュデータの保管先
			CacheEnable disk / #キャッシュ対応URL
			CacheDirLevels 5 #保管するディレクトリ階層の深さ
			CacheDirLength 3 #キャッシュデータを保管するディレクトリ名の文字数
		</IfModule>
	</IfModule>

mod_mem_cache

メモリにキャッシュデータを保存する場合に使用

	<IfModule mod_cache.c>
		<IfModule mod_mem_cache.c>
			CacheEnable mem / #キャッシュ対応URL
			MCacheSize 65536 #キャッシュメモリの最大値(kbyte)
			MCacheMaxObjectCount 100 #保管されるドキュメントの最大数
			MCacheMinObjectSize 1 #保管されるドキュメントの最小サイズ
			MCacheMaxObjectSize 2048 #保管されるドキュメント1つあたりの最大サイ

ズ(byte)

		</IfModule>
	</IfModule>
# MCacheSize > MCacheMaxObject

ファイルディスクリプタだけをキャッシュする事が可能

  • パフォーマンスは落ちるが、メモリの消費量を押える事が可能
  • CacheEnable? fd 対象URL

mod_file_cache

ファイル情報をメモリに展開する

  • Apache起動時にコンテンツ情報をメモリに展開する

その他

HostnameLookups? off


Last-modified: 2012-03-12 (月) 17:06:01 (166d)