Apache

Apache httpd.confの場所と設定方法|Directory・VirtualHost・Aliasを解説

Apache 2.4のhttpd.conf・apache2.confの場所と確認方法を解説します。ServerRoot、Listen、DocumentRoot、Directory、Require、AllowOverride、IfModule、Include、VirtualHost、Alias、構文確認、再読み込みまで安全な設定例で確認できます。

この記事の目次
  1. httpd.confの場所を確実に確認する
  2. よくある設定ファイルの例
  3. httpd.confとDocumentRootは別の場所
  4. 設定ファイルの基本構文
  5. ServerRoot・Listen・ServerName・DocumentRoot
  6. Directoryでfilesystemへのaccessを設定する
  7. Apache 2.2のOrder・Allowを混ぜない
  8. AllowOverrideと.htaccessの関係
  9. Directory・Files・Locationの違い
  10. IfModuleの正しい使い方
  11. Include・IncludeOptionalで設定を分割する
  12. VirtualHostで複数siteを設定する
  13. AliasでDocumentRoot外を公開する
  14. 末尾slashを両側で揃える
  15. specificなAliasを先に書く
  16. 設定変更前に構文を確認する
  17. 停止せずに設定を再読み込みする
  18. よくあるエラーと原因
  19. AH00526 Syntax error
  20. AH01630 client denied by server configuration
  21. Invalid command
  22. VirtualHostが別siteを表示する
  23. 設定を変えても反映されない
  24. 安全なhttpd.conf設定チェックリスト
  25. まとめ

Apache HTTP Serverは、通常httpd.confapache2.confを入口に、複数の設定ファイルを読み込みます。設定ファイル名・場所はOS名だけで決めつけず、実行中のhttpdが使うHTTPD_ROOTSERVER_CONFIG_FILEを確認するのが確実です。

安全な作業順は次のとおりです。

  1. 実際に使われる設定ファイルを特定する
  2. 変更前のファイルをbackupする
  3. directiveのcontextを確認して最小範囲へ設定する
  4. apachectl -tなどで構文を検証する
  5. 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.confmods-enabledconf-enabledsites-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名 .envprivate.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まで確認してください。