Apache
設定ファイルはhttpd.conf
httpd.confとは、WebサーバのプログラムであるApacheの設定ファイル。
例えば、文字コードなどの設定をできる。
ディレクティブとコンテキストの違い
ディレクティブ
ディレクティブは、Apacheサーバーの設定を定義する命令や指示です。これらはApacheの動作を制御するために使用されます。
例えば以下をhttpd.confに記載することでApacheの挙動を設定できる。
ServerName: サーバーのホスト名を設定する。
DocumentRoot: サーバーのルートディレクトリを指定する。
ErrorLog: エラーログのファイルを指定する。
コンテキスト
コンテキストは、ディレクティブが有効となる範囲や場所を示すもので、どの設定がどの部分に適用されるかを決定します。
Apacheにはいくつかの異なるコンテキストがあり、ディレクティブは特定のコンテキスト内で有効になります。
おおむねコンテキストは4つあります。
サーバーレベル (Server Context)
サーバー全体に適用される設定。httpd.conf 内のディレクティブは通常、このコンテキストに適用されます。
仮想ホスト (VirtualHost Context)
特定の仮想ホスト(ドメインやIPアドレス別)の設定。<VirtualHost> 内に書かれたディレクティブは、その仮想ホストにだけ適用されます。
ディレクトリ (Directory Context)
特定のディレクトリに対して適用される設定。<Directory> タグ内に記述されたディレクティブは、そのディレクトリとそのサブディレクトリに対して有効です。
ファイル (Files Context)
特定のファイルに対して適用される設定。<Files> タグ内に記述されたディレクティブは、指定されたファイルに対してのみ有効です。
場所 (Location Context): 特定のURLパスに対して適用される設定。<Location> タグ内に記述されたディレクティブは、指定されたパスに対してのみ有効です。
# サーバーレベルでの設定
ServerRoot "/etc/httpd"
Listen 80
# 仮想ホストの設定
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/html/example"
</VirtualHost>
# 特定のディレクトリの設定
<Directory "/var/www/html/example">
AllowOverride None
Require all granted
</Directory>
エイリアスで遷移したいURLを指定する
構文
Alias エイリアス名 ファイル(ディレクトリ)へのパス
例
Alias /apache "c:/MAMP/htdocs/"
実行結果
指定したディレクトリとサブディレクトリに対してディレクティブを設定する
構文
<Directory ディレクトリのパス>
</Directory>
例
<Directory "c:/MAMP/htdocs/">
## ディレクトリにアクセスした際に最初に表示されるファイルを指定するための設定です。
## これは、ユーザーが特定のディレクトリにアクセスしたとき、ブラウザが自動的に表示するファイルを決定するために使用されます。
DirectoryIndex dir1/test.txt
</Directory>
実行結果
.htaccess
.htaccessは.htaccessを配置したディレクトリ単位でディレクティブを指定できる。
.htaccessは非常に強力ですが、設定を誤るとウェブサイトの動作に影響を与えることもあるため、慎重に扱う必要があります。
.htaccessを使用するにはhttpd.confのAllowOverrideを設定する
設定値 | 説明 |
---|---|
None | .htaccess の設定を無視(デフォルト推奨) |
All | .htaccess で全ての設定を許可 |
AuthConfig | 認証関連の設定を許可 |
FileInfo | MIMEタイプやリライトルール (mod_rewrite) などを許可 |
Indexes | ディレクトリリストの設定を許可 |
Limit | アクセス制限(Allow、Deny、Require など)を許可 |
Options | Options ディレクティブの使用を許可 |
.htaccessを使用するには、None以外を使用する。
実際にやってみる。
httpd.confのAllowOverrideをAllにする
C:\MAMP\htdoc内に、.htaccessを作成し以下を記載する
# 指定したファイルが見つからない場合、Error.txtを表示する
ErrorDocument 404 Error.txt
Error.txtを作成すると、以下のようなディレクトリになる。
"http://localhost:8888/test1.txt"にアクセスすると、test1.txtが存在しないのでError.txtが表示される
.htaccessはApache再起動する必要なし
リダイレクトを行う
リダイレクトは、あるURLにアクセスした際に、自動的に別のURLへ転送する仕組みのことです。
構文
Redirect [status] 元のURL リダイレクトするURL
[status]は、
301 永続的なリダイレクトの設定に使用
302 一時的に引っ越したことを表す(デフォルト)
実際にやってみる。
以下のような、test.txtとredirect-test/redirect.txtを用意する
例
Redirect /test.txt /redirect-test/redirect.txt
実行結果
外部のサイトもリダイレクト可能
Redirect /test.txt https://google.com
ページ単位のリダイレクト
Redirect /test.txt /redirect-test/redirect.txt
ディレクトリ単位のリダイレクト
Redirect /old-folder/ https://example.com/new-folder/
ドメイン全体のリダイレクト
Redirect 301 / https://newdomain.com/
301と302のキャッシュについて
301は、ブラウザがリダイレクトをキャッシュする。
302は、ブラウザがリダイレクトをキャッシュしない。
もしWebサーバ側でリダイレクトのURLを変えた場合、
302の場合は、変更したリダイレクトのURLが反映されるが、
301の場合は、Webブラウザのキャッシュを変更しない限り変更したリダイレクトのURLが反映されない。
ログの設定
エラーログのレベルを設定する
構文
LogLevel レベル
例
LogLevel error
レベル | 説明 |
---|---|
emerg | 緊急 |
alert | 致命的な状態 |
crit | 認証関連の設定を許可 |
error | エラー |
warn | 警告(デフォルト) |
notice | 普通だが、重要な情報 |
info | 追加情報 |
debug | デバッグメッセージ |
エラーログのファイルパスを指定する
構文
ErrorLog ファイルパス
例
ErrorLog "C:/MAMP/logs/apache_error.log"
ログのフォーマットを指定する
構文
LogFormat "フォーマット文字列" ログフォーマット名
ログフォーマット名:CustomLogディレクティブで使用する名前(省略可能)
基本的に、CustomLogと一緒に使用する。
例
LogFormat "%h %l %u %t \"%r\" %>s %b" common
詳しい詳細は、以下を参照する。
RewriteRuleとRewriteCondでURLのリダイレクトや書き換えを行う
RewriteRuleとRewriteCondで以下のようなことができる。
URLを別のファイルにリダイレクト
拡張子なしURLの対応
クエリパラメータをフレンドリーURLに変換
HTTPSへリダイレクト
wwwあり/なしの統一
IPアドレスによるアクセス制限
モバイルユーザーを専用ページにリダイレクト
特定のMIMEタイプのコンテンツをgzip圧縮し、クライアントに転送する際のデータ量を削減する
構文
AddOutputFilterByType DEFLATE <MIMEタイプ>
例
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
</IfModule>
実際にやってみた。
AddOutputFilterByType DEFLATEありだと、Sizeが小さくなっていることがわかる。
またステータスコードは、キャッシュ利用を利用する304である。
AddOutputFilterByType DEFLATE適用なし
AddOutputFilterByType DEFLATE適用あり
なお、Disable catcheを有効にするとキャッシュが適当されない
ETagを生成し、不要なデータ転送の削減できる
ETgaとは
ETgaは、HTTPプロトコルにおけるキャッシュの管理やリソースの変更検出に使用されるヘッダーの一つです。
これは、サーバーが特定のリソース(Webページや画像、JSONデータなど)に対して発行する識別子であり、リソースが変更されたかどうかを判別するために使用されます。
これを使用すると、304レスポンスによる不要なデータ転送の削減できる
実際にやってみる
構文
FileETag ETagの生成方法
生成方法は、
None→ETag を無効化(ETag ヘッダーを送信しない)
MTime→最終更新時刻 (mtime) を使用
Size→ファイルサイズ (size) を使用
INode→i-node 番号 (inode) を使用
例
ファイルの更新日時を参照して、ETagを生成する。
ファイルが更新されていればETagを生成する。
FileETag MTime
実際にやってみる
初めのリクエストでレスポンスヘッダーにサーバー側で生成したEtagを格納する。
2回目以降のリクエストだと、リクエストヘッダーのif-none-matchに一回目で生成したEtagを送り、サーバ側でEtagと一致していれば304返し、キャッシュを使用する。
キャッシュの有効期限を設定する
構文
ExpiresActive On
ExpiresDefault 有効期限
例
<IfModule mod_expires.c>
ExpiresActive On
# 有効期限のファイルを指定する
<FilesMatch "\.(png|jpe?g|gif|css|js|html|txt)$">
ExpiresDefault "access plus 2 week"
</FilesMatch>
</IfModule>
実際にやってみる
Cache-Controlにmax-ageにキャッシュの有効期限を設定できている。
KeepAliveで、TCP接続する際の、接続の確立と切断にかかるオーバーヘッドを削減する
構文
KeepAlive 有無
MaxKeepAliveRequests 最大リクエスト数
KeepAliveTimeout タイムアウト秒数
有無には
・On にすると、クライアントとの持続的な接続を許可します。
・Off にすると、リクエストごとにTCP接続を閉じる(非効率になるが、リソース消費が抑えられる)。
最大リクエスト数には、
・1つの持続的接続で処理できる最大リクエスト数。
・0 にすると無制限。
・ただし、大きすぎるとメモリ消費が増えるため適切な値を設定する。
タイムアウト秒数には、
・クライアントが新しいリクエストを送るのを待つ最大秒数。
・短すぎると再接続が頻発し、長すぎるとリソースを浪費する。
例
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 1
実際にやってみる。
ResponseHeaderに、keep-aliveにtimeout=1, max=100設定されていることが分かる。
メリット・デメリット、規模に応じた適切な設定、HTTP/2(Apache 2.4.17以降)を利用するとKeepAliveの設定は不要になることが多い。
Discussion