Apache HTTP Serverは、通常httpd.confやapache2.confを入口に、複数の設定ファイルを読み込みます。設定ファイル名・場所はOS名だけで決めつけず、実行中のhttpdが使うHTTPD_ROOTとSERVER_CONFIG_FILEを確認するのが確実です。
安全な作業順は次のとおりです。
- 実際に使われる設定ファイルを特定する
- 変更前のファイルをbackupする
- directiveのcontextを確認して最小範囲へ設定する
apachectl -tなどで構文を検証する- graceful reload後にHTTP responseとerror logを確認する
この記事ではApache 2.4を前提に、Directory、Require、AllowOverride、IfModule、Include、VirtualHost、Aliasの基本を解説します。
httpd.confの場所を確実に確認する
まずApacheのbuild parameterを表示します。環境にあるcommandを使ってください。
apachectl -V
# Debian / Ubuntu系でcommand名が異なる場合
apache2ctl -V
# WindowsのApache bin directory
httpd.exe -V
出力の次の2項目を確認します。
-D HTTPD_ROOT="/usr/local/apache2"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
SERVER_CONFIG_FILEがrelative pathなら、HTTPD_ROOTを基準に解決します。この例では/usr/local/apache2/conf/httpd.confです。
commandが複数見つかる場合は、service・container・開発toolが実際に起動しているbinaryを確認します。別のApacheに対して-Vを実行すると、編集しても反映されません。
よくある設定ファイルの例
次は典型例であり、installation method・version・package設定によって変わります。
| 環境 | よくある入口 |
|---|---|
| source install | /usr/local/apache2/conf/httpd.conf |
| Debian / Ubuntu | /etc/apache2/apache2.conf |
| RHEL / Rocky / AlmaLinux系 | /etc/httpd/conf/httpd.conf |
| macOS標準Apache | /etc/apache2/httpd.conf |
| Homebrew | /opt/homebrew/etc/httpd/httpd.confなど |
| Windows / bundled tool | Apache24/conf/httpd.confなど |
Debian / Ubuntuでは入口がapache2.confで、ports.conf、mods-enabled、conf-enabled、sites-enabledを分割して読み込む構成が一般的です。「httpd.confという名前がない」こと自体は異常ではありません。
MAMP、XAMPP、Docker imageも独自のdirectory構成を使う場合があります。GUIの表示だけでなく、対象binaryまたはcontainer内で-Vを実行します。
httpd.confとDocumentRootは別の場所
設定ファイルはApacheの動作を決めるserver configurationです。DocumentRootはWebへ公開するfile treeの起点です。
DocumentRoot "/var/www/example/public"
この場合、https://example.com/assets/app.cssは基本的に/var/www/example/public/assets/app.cssへ対応します。Alias、Proxy、rewriteなどがあれば別のmappingになることもあります。
httpd.confをDocumentRoot内へ置く必要はありません。むしろserver設定やcredentialを公開directoryへ置かない構成にします。
Apache自体の役割から確認したい場合はApacheの仕組みと基本を参照してください。
設定ファイルの基本構文
Apacheの設定は、directive名に空白区切りでargumentを渡すtext形式です。#から行末まではcommentです。
# 80番portでconnectionを待ち受ける
Listen 80
# 空白を含むpathはquoteする
DocumentRoot "/var/www/example site/public"
directiveごとに書ける場所が決まっています。Apache公式docsの各directiveにある「Context」を確認します。server configだけ、VirtualHost内、Directory内、.htaccessなど、許可されたcontextは異なります。
ServerRoot・Listen・ServerName・DocumentRoot
混同しやすい主要directiveを整理します。
| directive | 役割 | 注意点 |
|---|---|---|
ServerRoot |
relative pathの基準となるserver directory | Web公開rootではない |
Listen |
待ち受けるIP address・port | OS firewallやcontainer port公開とは別 |
ServerName |
serverが自分を識別するscheme・host・port | DNS recordを自動作成しない |
DocumentRoot |
URLをfileへ対応させる基本directory | 通常は末尾slashなし |
ServerRoot "/etc/httpd"
Listen 80
ServerName example.test:80
DocumentRoot "/var/www/example/public"
ServerNameへhostnameを書くだけでは、その名前がIP addressへ解決されるようになりません。本番はDNS、local testはhosts fileなどの名前解決も別途必要です。
Directoryでfilesystemへのaccessを設定する
<Directory> sectionは、URL pathではなくfilesystem directoryへ設定を適用します。DocumentRootを公開する最小例です。
DocumentRoot "/var/www/example/public"
<Directory "/var/www/example/public">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Options -Indexes: index fileがないdirectoryのfile一覧表示を無効化+FollowSymLinks: symbolic linkをたどる機能を明示的に追加AllowOverride None: .htaccessによる上書きを無効化Require all granted: Apache 2.4のauthorizationでaccessを許可
Options Allは必要以上の機能を有効にするため、目的ごとに+・-で明示します。server全体のfilesystem rootはdenyし、公開が必要なdirectoryだけgrantする考え方が安全です。
<Directory "/">
AllowOverride None
Require all denied
</Directory>
既存packageの標準設定には同等の保護が含まれることがあります。重複・merge結果を確認してから変更します。
Apache 2.2のOrder・Allowを混ぜない
古いsampleには次の記法があります。
# Apache 2.2系の古い例
Order allow,deny
Allow from all
Apache 2.4ではRequire all grantedなどmod_authz_coreのauthorizationへ移行します。互換moduleのdirectiveと2.4のRequireを同じsectionへ混ぜると、merge結果が分かりにくくなるため避けます。
AllowOverrideと.htaccessの関係
AllowOverrideは、そのDirectory配下で.htaccessがどのdirectiveを上書きできるか制御します。
<Directory "/var/www/example/public">
AllowOverride None
Require all granted
</Directory>
main server設定を編集できるなら、通常はAllowOverride NoneにしてVirtualHostやinclude fileへ集約するほうが、requestごとの.htaccess探索を減らし管理もしやすくなります。
WordPressなどがrewrite ruleを.htaccessへ書く構成なら、必要なoverride classだけ許可します。
<Directory "/var/www/example/public">
AllowOverride FileInfo
Require all granted
</Directory>
pluginやapplicationが別のdirectiveも必要とする場合は公式要件を確認します。理由なくAllowOverride Allへ広げないようにします。詳しい適用条件は.htaccessの基本で解説しています。
Directory・Files・Locationの違い
sectionは対象が異なります。
| section | 対象 | 例 |
|---|---|---|
<Directory> |
filesystem directory | /var/www/example/public |
<Files> |
file名 | .env、private.html |
<Location> |
URL webspace | /admin、/server-status |
<VirtualHost> |
host・IP・port | *:80 |
filesystem上のfile accessを守る設定はDirectory / Filesを基本にします。Locationだけでfilesystem accessを上書きすると、sectionのmerge順により意図せず許可範囲が広がる場合があります。
directiveのcontextはApache directiveのcontextでも整理しています。
IfModuleの正しい使い方
<IfModule>は、moduleが利用可能な場合だけ内側の設定を適用します。module名の先頭に!を付けると否定です。
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
startup・restart時にmoduleの有無が評価されます。ただし、必須機能までIfModuleで囲むと、moduleがないときにerrorにならず設定が黙って無視されます。
「この設定は必ず必要」という場合はIfModuleで隠さず、moduleを有効化して構文checkで不足を検出します。複数環境でoptionalにする設定だけへ使います。
loaded moduleは次で確認できます。
apachectl -M
Include・IncludeOptionalで設定を分割する
大きなhttpd.confへすべてを書く必要はありません。Includeで別fileを読み込めます。
Include conf/extra/httpd-vhosts.conf
IncludeOptional conf.d/*.conf
Includeは対象fileがないとerrorになります。IncludeOptionalは一致するfileがなくてもerrorにしません。
relative pathはServerRoot基準です。includeされた設定は、Include directiveが置かれた位置へ展開されたものとしてmergeされます。
distributionによってsites-availableからsites-enabledへのsymbolic linkなど、package独自の管理command・directoryがあります。その仕組みを無視してmain fileへ直書きすると、更新・無効化が難しくなるため、既存layoutに合わせます。
VirtualHostで複数siteを設定する
同じIP address・portで複数hostnameを扱う基本例です。
Listen 80
<VirtualHost *:80>
ServerName example.test
ServerAlias www.example.test
DocumentRoot "/var/www/example/public"
<Directory "/var/www/example/public">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog "logs/example-error.log"
CustomLog "logs/example-access.log" combined
</VirtualHost>
ApacheはまずIP・portの組み合わせを選び、その中でrequestのHost headerをServerName / ServerAliasと比較します。一致しない場合、そのaddress・portで最初に定義されたVirtualHostがdefaultとして選ばれます。
各VirtualHostへServerNameを明示し、apachectl -Sでparse結果とdefault vhostを確認します。
apachectl -S
ServerNameを書いてもDNSは作られません。本番DNSまたはlocal hosts fileの設定が別途必要です。ErrorLog / CustomLogの詳しい設定と確認方法はApacheログの場所と設定を参照してください。
AliasでDocumentRoot外を公開する
AliasはURL pathをfilesystem pathへ対応させます。
Alias "/downloads/" "/srv/shared-downloads/"
<Directory "/srv/shared-downloads/">
Options -Indexes
AllowOverride None
Require all granted
</Directory>
Alias先がDocumentRoot外なら、対応するDirectory sectionでaccessを許可する必要があります。
末尾slashを両側で揃える
URL pathに末尾slashを付ける場合、file path側もslashを付けます。
Alias "/images/" "/srv/assets/images/"
この設定は/images/logo.svgを/srv/assets/images/logo.svgへ対応させます。URL側に末尾slashがあるAliasは、slashなしの/imagesには一致しません。
specificなAliasを先に書く
同じcontextのAliasは記述順に評価され、最初のmatchが優先されます。pathが重なる場合は具体的なものを先にします。
Alias "/assets/private" "/srv/private-assets"
Alias "/assets" "/srv/public-assets"
単純なpath mappingはAlias、query stringを含む複雑な条件分岐はmod_rewriteなど、目的に合うdirectiveを選びます。
設定変更前に構文を確認する
設定を保存したら、reload前にsyntax testを実行します。
apachectl -t
# 環境に応じた同等command
apache2ctl -t
httpd -t
httpd.exe -t
成功時はSyntax OKと終了code 0が返ります。error時はfile・line・directiveを読み、reloadしません。
用途別の確認commandです。
| command | 確認内容 |
|---|---|
apachectl -V |
version、HTTPD_ROOT、設定file |
apachectl -t |
設定fileの構文 |
apachectl -S |
VirtualHostのparse結果 |
apachectl -M |
loaded module一覧 |
停止せずに設定を再読み込みする
構文checkが成功したら、利用中のservice managerに合わせてgraceful reloadします。
apachectl graceful
# systemdのservice名はdistributionで異なる
sudo systemctl reload apache2
sudo systemctl reload httpd
gracefulは既存connectionをすぐ切らずに新設定へ切り替えるための操作です。ただしmodule・binary更新など、restartが必要な変更もあります。productionでは運用手順、health check、rollback方法に従います。
reload後は次を確認します。
- service statusがactiveか
- 対象URLが期待するstatus code・contentを返すか
- 想定したVirtualHostが選ばれているか
- error logにstartup・permission・module errorがないか
よくあるエラーと原因
AH00526 Syntax error
directive名、argument数、quote、sectionの閉じtag、許可されないcontextを確認します。error messageに出るfileとlineは、main fileではなくinclude先の場合があります。
AH01630 client denied by server configuration
対象filesystem pathへ適用されるDirectory sectionとRequireを確認します。Alias先がDocumentRoot外なのにDirectoryがない、より広いdeny設定に負けている、古いOrder / AllowとRequireを混在しているなどが代表例です。
Invalid command
directiveを提供するmoduleがloadされていない、directive名が誤っている、Apache versionと設定例が合っていない可能性があります。apachectl -Mと公式docsのModule・Compatibilityを確認します。
VirtualHostが別siteを表示する
apachectl -Sでaddress・port・ServerName・最初のdefault vhostを確認します。DNS / hostsが別IPへ向いていないか、requestのHost headerも確認します。
設定を変えても反映されない
編集したfileと実行中binaryのSERVER_CONFIG_FILEが同じか、includeされているか、syntax check後に正しいserviceをreloadしたか確認します。Dockerではhost側fileを編集してもvolume mountされていなければcontainerへ反映されません。
安全なhttpd.conf設定チェックリスト
-Vで実際の設定fileとServerRootを確認した- 既存fileをbackupし、変更理由を記録した
- packageのinclude / sites-enabled構成を尊重した
- DocumentRootは公開してよいfileだけを含むdirectoryにした
- filesystem rootはdenyし、必要なDirectoryだけgrantした
Options Allと不要なIndexesを避けた- Apache 2.2のOrder / Allowを2.4のRequireと混在させていない
- AllowOverrideは必要なclassだけ許可した
- VirtualHostごとにServerNameを明示した
- Alias先へ対応するDirectory・Requireを設定した
-t、-S、-Mで事前確認した- graceful reload後にHTTP responseとerror logを確認した
まとめ
Apacheのmain設定は通常httpd.confまたはapache2.confですが、場所とfile分割は環境によって異なります。apachectl -VでHTTPD_ROOTとSERVER_CONFIG_FILEを確認し、実際に起動しているApacheの設定を編集します。
DocumentRootとDirectoryを対応させ、Apache 2.4ではRequireでauthorizationを設定します。.htaccessはAllowOverrideで必要な範囲だけ許可し、host単位の設定はVirtualHost、DocumentRoot外のmappingはAliasとDirectoryを組み合わせます。
設定変更後は、必ずapachectl -tで構文を確認してからgraceful reloadし、HTTP response・VirtualHost・error logまで確認してください。