====== Apache2.4 Windows版の基本設定 ======
Version 2.4.41
--- //[[http://www.y2sunlight.com|y2sunlight]] 2019-10-07//
[[apache:top|Apacheに戻る]]
関連記事
* Apache2.4 Windows版の基本設定
* [[apache:2.4:httpd.conf|Apache2.4 httpd.confの編集]]
Appendix
* [[apache:2.4:auth|Apache2.4 基本認証とダイジェスト認証]]
* [[apache:2.4:acd|Apache2.4 アクセス制御ディレクティブ]]
----
===== Apacheの設定ファイル =====
Apacheのメインの設定ファイルは **httpd.conf** です。XAMPPのhttpd.conf は以下に配置されています。
{XAMPP Install folder}\apache\conf\*httpd.conf
httpd.conf はUNIX版とWindows版で記述方法や基本的な設定内容は同じです。httpd.conf は、テキストファイルなので、「メモ帳」などのテキストエディターで編集できます。編集後はApacheを再起動して下さい。
httpd.confの文法チェックは、コマンドプロンプトから以下のコマンドで実行できます。
**httpd.conf の文法チェック**
D:\>cd usr\xampp7.2.22\apache\bin
D:\usr\xampp7.2.22\apache\bin>httpd -t
Syntax OK
\\
===== Apacheの基本構造 =====
{{ :apache:2.4:setting01.png?nolink|Apacheの基本構造}}Apacheを設定する前に少しApacheについて復習しておきましょう。まず、基本的なApacheの構造です。Apache の前身はNCSAが開発したWeb サーバ( NCSA httpd )です。従って、構造や設定などは NCSA httpd を基本としたものになっています。
簡単に説明するとApache は右図のような構造となっています。システムの核(コア)となるモジュールと、機能別のモジュールから構成されています。Apache では NCSA httpd の基本構造を踏襲しつつ、徹底的な機能のモジュール化により、様々な拡張が行われてきました。サーバの管理者は必要とするモジュールを選択し、サーバに組み込んで機能拡張をする事ができます。
>NCSA(米国立スーパーコンピュータ応用研究所):\\ 世界初のCGIによるWebブラウザ Mosaicを開発した組織として有名。Mosaic開発チームは、その後、Silicon Graphics社の創業者Jim Clark氏とNetscape Communications社を設立した。
インストール直後に httpd.conf でロード指定があるモジュールを挙げておきます。(XAMPP7.2.77/Apache2.4.41)
== インストール時にロードされているモジュール ==
| mod_access_compat | クライアントリクエストに基づいたアクセス制御 |
| mod_actions | メディアタイプやリクエストメソッドに応じてCGI スクリプトを実行する機能 |
| mod_alias | ホストファイルシステム上のいろいろな場所を ドキュメントツリーにマップする機能と、URL のリダイレクトを行なう |
| mod_allowmethods| HTTPメソッドの利用制限 |
| mod_asis | 自分用の HTTP ヘッダの書かれているファイルを送信する機能 |
| mod_auth_basic| 基本認証 |
| mod_authn_core| 認証モジュールに共通なコアディレクティブ |
| mod_authn_file| テキストファイルを用いたユーザ認証 |
| mod_authz_core| 承認モジュールに共通なコアディレクティブ |
| mod_authz_groupfile| プレーンテキストファイルを用いたグループ承認 |
| mod_authz_host| ホスト名(またはIP)ベースのグループ承認 |
| mod_authz_user| ユーザ承認 |
| mod_autoindex | ディレクトリインデックスを生成する機能 |
| mod_cgi | CGI スクリプトの実行 |
| mod_dav_lock| mod_dav 用の汎用ロックモジュール |
| mod_dir |「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能 |
| mod_env | CGI スクリプト及びSSI ページに渡される環境変数を変更する機能 |
| mod_headers | HTTP リクエストのヘッダと応答のヘッダのカスタマイズ |
| mod_include | サーバがパースする html ドキュメント(SSI:Server Side Includes) |
| mod_info| サーバの設定の包括的な概観を提供する |
| mod_isapi | Apache Windows版のためのISAPIエクステンション |
| mod_log_config | サーバへのリクエストのロギング |
| mod_cache_disk | URI をキーにしたコンテンツキャッシュストレージ管理 |
| mod_mime | リクエストされたファイルの拡張子と、ファイルの振る舞い(ハンドラとフィルタ)及び内容 (MIME タイプ、言語、文字セット、エンコーディング) とを関連付ける機能 |
| mod_negotiation | コンテントネゴシエーション機能 |
| mod_proxy | HTTP/1.1 プロキシ/ゲートウェイサーバ |
| mod_proxy_ajp | mod_proxy で AJP をサポートするためのモジュール |
| mod_rewrite | オンザフライでURLをリライトする為のルールベースエンジン |
| mod_setenvif | リクエストの特徴に基づいた環境変数の設定を可能にする機能 |
| mod_socache_shmcb | 共有オブジェクト・キャッシュ・プロバイダ|
| mod_ssl | SSLとTLSを使用した強力な暗号化モジュール |
| mod_status | サーバの活動状況と性能に関する情報を提供する |
\\
===== ディレクティブ =====
Apacheの設定は「ディレクティブ」を設定ファイル **httpd.conf** に記述する事により行います。Apache は起動時にのみ httpd.conf の変更を認識します。Apache は MIMEドキュメントタイプを含んでいるファイルも読み込みます。このファイル名は TypesConfig ディレクティブで設定され、デフォルトでは **conf/mime.types** になっています。
httpd.conf の各ディレクティブはいろいろなモジュールに作用します。Apacheのコアモジュールには基本的な機能だけが含まれ、その他の拡張機能はモジュールとして利用可能です。サーバが動的ロードモジュールを使うようにコンパイルされている場合、モジュールを別にコンパイルして、いつでも LoadModule ディレクティブを使って追加できます。設定ディレクティブは ブロックに入れることで特定のモジュールが存在するときだけ httpd.conf に含まれるようにすることができます。
\\
==== ディレクティブの適用範囲 ====
httpd.conf にあるディレクティブはサーバ全体に適用されます。 サーバの一部分の設定だけを変更したい場合は 、 または ブロックの中にディレクティブを記述します。これらの記述はXMLに似ており・・・と書きます。
| ・・・ | ホストファイルシステムの特定のディレクトリTargetに適用 |
| ・・・ | ホストファイルシステムの特定のファイルTarget に適用 |
| ・・・ | 特定の URLパス Target に適用 |
上記のTargetにはワイルドカードが使用できます。 "*" は任意の文字列にマッチし、"?" は任意の 1 文字にマッチし、 "[abc]" はabc の任意の文字にマッチします。但し、"/" はどのワイルドカードにもマッチしないので、明示的に指定する必要があります。(Perl5互換の)正規表現によるマッチングを望む場合は、、 、 と記述します。 の代わりに と書く事もできます。同様に 、と書くこともできます。
とを両方使ってより詳細な設定を行う事ができます。
例:ワイルドカードにマッチしたディレクトリ内の特定の拡張子のファイルを全てアクセス拒否にする
Require all granted
Apache は同時に多くの違うウェブサイトを扱う能力があります。 これは バーチャルホスト と呼ばれています。 特定のウェブサイトにのみ適用されるようにするために、 ディレクティブはブロックの中に置くことでも適用範囲を変えることができます。
\\
==== アクセス制御ファイル( .htaccess ) ====
Apacheでは公開用のドキュメントツリー中に置かれた特別なファイルを使って httpd.conf の設定内容の一部を上書きする事ができます。そのファイルは**アクセス制御ファイル**と呼ばれ、デフォルトでは**.htaccess** という名前ですが、AccessFileName ディレクティブを使って変更する事もできます。また、AllowOverride ディレクティブを使って、.htaccessによる設定の上書きを制御することもできます。
.htaccess中のディレクティブはこのファイルを置いたディレクトリと全てのサブディレクトリに適用されます。.htaccess はクライアントからのリクエスト時で読み込まれるので、変更はすぐに反映されます。
例:基本認証
# ユーザ認証を基本認証に指定
AuthType Basic
# ブラウザのユーザ認証ダイアログに表示するメッセージ
AuthName "Password Required"
# パスワードファイル名
AuthUserFile /www/passwords/password.file
# パスワードファイル内でアクセスを許可するユーザの羅列
# require user UserName --- UserName だけに許可
# require valid-user --- 全てのユーザに許可
Require valid-user
\\
===== ドキュメントディレクトリのマッピング =====
一般にWebサーバでは、物理的なホストファイルシステムと仮想的なフォルダ(公開するされるURLパス)をマッピングする機能を提供しています。Apacheではこの仮想的なフォルダの事を**ドキュメントディレクトリ**と呼び、先頭のドキュメントディレクトリをドキュメントルート( **DocummentRoot** )と呼びます。
\\
==== DocumentRoot ====
大雑把に言うと、Apacheは、HTTPリクエストに含まれるURLパスを DocummentRoot の最後に追加して、レスポンスとして返すファイルを決定します。従って、ブラウザからは DocumentRoot の下のディレクトリやファイルが木構造をしているように見えます。Apache にはバーチャルホストの機能もあります。この場合、それぞれのバーチャルホストに対してDocumentRoot を指定することができます。
\\
==== エイリアス(Alias) ====
DocumentRoot の外にあるディレクトリを公開する方法は、Alias ディレクティブを使う事です。Alias ディレクティブを使えば、ホストファイルシステムの任意の部分をドキュメントディレクトリにマッピングできます。また、ScriptAlias ディレクティブも Alias と同様ですが、対象となっているURLパスが CGIの実行を許可するという追加効果があります。
例えば、
Alias /icons/ "D:/usr/xampp7.2.8/apache/icons/" ------- (1)
ScriptAlias /cgi-bin/ "D:/usr/xampp7.2.22/cgi-bin/" ---- (2)
(1)の例は、URLパス /icons をファイルシステム "C:/usr/Apache Group/Apache2/icons/" にマッピングしています。このエイリアスは、ディレクトリインデックス表示のアイコン画像用にApacheがインストール時に設定したものです。
(2)の例は、URLパス /cgi-bin をファイルシステム "C:/usr/Apache2/cgi-bin" にマッピングしています。このエイリアスは、セキュリティ上の理由により、CGIの実行できるドキュメントディレクトリを限定するためにApacheがインストール時に設定したものです。
また、AliasMatch や ScriptAliasMatch ディレクティブ を使えば正規表現に基づいた強力なエイリアス設定を行なうことができます。
\\
==== ユーザディレクトリ(UserDir) ====
Unixシステムではユーザ user のホームディレクトリを ~user/ として参照できます。mod_userdir モジュールはこの考えをドキュメントディレクトリに対して拡張しました。mod_userdir モジュールを使用する場合は、以下のようにしてuserdir_moduleを有効にします。
LoadModule userdir_module modules/mod_userdir.so
userdir_module はユーザのホームディレクトリのファイルを以下のようなURLを使ってアクセスできるようにします。
http://localhost/~user/index.html
この設定には UserDir ディレクティブを使用します。セキュリティ面から言えば、Webからユーザのホームディレクトリへの直接アクセスは避けるべきです。従って、 UserDir ディレクティブではユーザのホームディレクトリの下のWebファイルの置かれているディレクトリを指定します。尚、Unix ではホームディレクトリを/etc/passwdファイルで指定しています。
Apache Windows版についてもユーザディレクトリを設定できます。Windows10でのユーザのホームディレクトリは既定では "C:/Users/{ユーザ名}" です。Apacheインストール時の設定では、
UserDir "My Documents/My Website"
従って、上のURLは以下のファイルにマッピングされます。
"C:/Users/{ユーザ名}/My Documents/My Website/index.html"
ユーザのホームディレクトリを既定の場所以外に設定するには、ドライブ文字から始まる絶対パスで指定します。この場合、ユーザ名に変換される部分にアスタリスク(*)を使用します。
UserDir "D:/Apatch Users/*/My Website"
実験で分かった事ですが、UserDirで既定のホームディレクトリ以外を指定した場合、*で変換される部分は実際に存在するユーザ名である必要がありません。ApacheはURLパスに含まれるユーザ名がWindowsユーザである事の確認をしていないようです。
特定のユーザにのみディレクトリを使用させる場合は、disabledとenabledキーワードを使います。ApatcheはUserDirの引数がenabledでもdisabledでもない場合のみファイル名パターンとして扱います。
例:指定のユーザのみユーザディレクトリへのアクセスを許可する
UserDir "D:/Apatch Users/*/My Website"
UserDir disabled
UserDir enabled user1 user2 user3
\\
==== シンボリックリンク ====
Unixシステムでは、シンボリックリンク機能を使って、DocumentRoot外にあるディレクトリをDocumentRootの下に持ってくることができます。Aliasやユーザディレクトリの場合も、同様です。但し、セキュリティ上の理由により、Options ディレクティブに FollowSymLinks か SymLinksIfOwnerMatch がある場合に限られます。
例:Apacheインストール時のDocumentRootのOptionsディレクティブの設定
Options Indexes FollowSymLinks Includes ExecCGI
さて、Windowsのシンボリックリンクとは何を指すのでしょうか?ショートカットは拡張子が.lnkのファイルで、中にリンク先が書かれているだけです。明らかにシンボリックリンクではありません。Windows7以降、**mklink コマンド**によりシンボリックリンクを作ることが出来ます。シンボリックリンクは、ディレクトへのリンクもファイルへのリンクも可能です。筆者の実験では、Apacheは、WindowsのシンボリックリンクをUNIXのシンボリックリンクと同様に扱い、FollowSymLinks でのアクセス制御ができました。但し、シンボリックリンクの作成には**管理者権限**が必要となります。
ディレクトリのシンボリックリンクの作成
mklink /D {リンク} {ターゲット}
※ファイルのシンボリックリンクでは /D が不要です。
また、Winodwsでは、シンボリックリンクに良く似た、**ジャンクション**と言われるソフトウェアリンクの機能があります。これは、NTFSにシンボリックリンクよりも古くから実装されていたソフトウェアリンクで、ApacheでもUNIXのシンボリックリンクと同様に扱えます。ジャンクションの作成はディレクトへのリンクだけですが、管理者権限の無い一般ユーザでも可能です。
ジャンクションの作成
mklink /J {リンク} {ターゲット}
ソフトウェアリンク( シンボリックリンク と ジャンクション )にはリンク元とリンク先があり、リンク元が消えるとリンク先も無くなります。一方、WindowsのNTFSには**ハードリンク**機能もあります、ハードリンクは1つのファイルに複数のディレクトリエントリを作成でき、リンク元/リンク先という関係ではなく対等の関係があります。全てのハードリンクが消えないとファイルは無くなりません。従って通常のファイルはハードリンク数が1という事になります。ハードリンクはシンボリックリンクではなく、通常のファイルと同じです。Apacheでも勿論、FollowSymLinksの影響を受けません。
ハードリンクはソフトウェアリンクと異なり、以下の制限があります。
* フォルダのハードリンクは作れない
* 異なったドライブ間でハードリンクは作れない
* ネットワーク共有フォルダへのリンクは作れない
Windowsでハードリンクを作るには、シンボリックリンクと同様に、mklinkコマンドを使います。
ハードリンクの作成
mklink -H {リンク} {ターゲット}
WindowsのGUI(エクスプローラなど)では、シンボリックリンクとジャンクションはショートカットと同じく表す矢印のマークが付きます。一方、ハードリンクでは「一見して別のファイルが、実は同じファイルだった」という事が度々起きますので、リンクの管理が大変難しく、乱用は避けるべきでしょう。
尚、リンクを削除する場合は rmdir または del コマンドを使います。
リンクの削除
rmdir {リンク} --- ディレクトリへのリンクの削除 (ジャンクション/ディレクトリへのシンボリックリンク)
del {リンク} ----- ファイルへのリンクの削除 (ハードリンク/ファイルへのシンボリックリンク)
また、WindowsのNTFSには**リパースポイント**という機能もあります。これはソフトウェアリンクをさらに発展させた機能で、フォルダをリパースポイントにしてドライブをマウントする事ができます。Windows10では[マイコンピュータ][管理]から[記憶域][ディスクの管理]でドライブを選択し、右クリックで[ドライブ文字とパスの変更]を選択すると、そのドライブを空のフォルダにマウントする事ができます。リパースポイントも「シンボリックリンク」として扱われFollowSymLinksとしてアクセス制御ができます。
Apache Windows版の「シンボリックリンクのようなもの」をまとめると以下のようになります。
| ショートカット | リンク先の格納されている単なるファイル(拡張子は.lnk) |
| ジャンクション | UNIXのシンボリックリンクと同じ扱い。\\ ディレクトリへのリンクのみ(管理者権限不要) |
| シンボリックリンク | UNIXのシンボリックリンクと同じ扱い。\\ ディレクトリまたはファイルへのリンクが可能(管理者権限必要)|
| ハードリンク | 通常ファイルと同じ扱い\\ (ファイルシステム上でリンク先/リンク元の関係がない) |
| リパースポイント | UNIXのシンボリックリンクと同じ扱い。\\ ドライブを空のフォルダにマウントできる |
以上、Apache Windows版の基本設定について簡単に説明しました。アクセス制御については、[[apache:2.4:acd|アクセス制御ディレクティブ]]に簡単にまとめてあります。Webサーバを公開する場合は、インデックス表示、ファイルタイプ、ユーザ認証、バーチャルホスト、ログファイルなどの設定も必要になります。より詳しい事は「Apache HTTP サーバ バージョン 2.4 ドキュメント( http://httpd.apache.org/docs-2.4/ )」を参照して下さい。
\\