11.

Apacheの設定エラー確認方法|configtestとhttpd -Sでvhostを検証

編集
この記事の要点
  • Apacheの設定ファイル(httpd.conf や vhost)の構文エラーは、反映前に apachectl configtest(=httpd -t)で必ずチェックする。出力が Syntax OK なら構文上の問題はない。
  • バーチャルホストの一覧と適用優先順位は httpd -S(=apachectl -Sで確認する。どの設定行がどのホストに対応しているかがファイル名:行番号付きで表示される。
  • 構文テストに通ってから apachectl graceful で再読み込みする。テストを省いて reload すると、設定ミスで Apache が起動できずサービス全体が落ちる
  • コマンド名はディストリで異なる。RHEL系は httpd、Debian/Ubuntu系は apache2ctl(または apachectl)を使う。

 

Apacheの設定ファイル(httpd.conf や個別の vhost ファイル)に構文エラーがないかを確認する最も確実な方法は、apachectl configtest(内部的には httpd -t と同じ)を実行することです。これは設定ファイルを実際に読み込んでパースし、文法エラーや指示子(ディレクティブ)の記述ミスを検出します。さらに、バーチャルホストがどう解釈され、どのリクエストにどの <VirtualHost> ブロックが適用されるかは httpd -S で一覧確認できます。この記事では、これら2つのコマンドの使い方と出力の読み方、安全な反映手順、ディストリ差、典型的なエラー例までをまとめます。

 

構文エラーの有無を確認する:apachectl configtest(httpd -t)

設定ファイルの構文チェックは、次のいずれかのコマンドで行います。どちらも同じ処理です(configtest-t を呼び出すラッパー)。

# RHEL / CentOS / Rocky / AlmaLinux 系

$ sudo apachectl configtest

# これと同じ意味(短い形式)

$ sudo httpd -t

# Debian / Ubuntu 系

$ sudo apache2ctl configtest

 

構文に問題がなければ、次のように Syntax OK と表示されます。

$ sudo apachectl configtest

Syntax OK

 

Syntax OK は「設定ファイルが文法的に正しく読み込めた」という意味であり、サイトが意図通り動くことまでは保証しません。たとえば DocumentRoot に指定したディレクトリが存在しない、証明書ファイルのパスが間違っている、といった「文法は正しいが運用上おかしい」問題は Syntax OK でも検出されないことがあります。あくまで「構文と基本的な整合性のチェック」と捉えてください。

エラーがある場合は、問題のファイル名と行番号、エラー内容が表示されます。次は </VirtualHost> の閉じタグが抜けている例です。

$ sudo apachectl configtest

AH00526: Syntax error on line 12 of /etc/httpd/conf.d/example.conf:

<VirtualHost> was not closed.

 

このようにエラーは「どのファイルの何行目で、何が問題か」を示してくれるため、表示された行番号を起点に該当ファイルを直していきます。

 

バーチャルホストの一覧と優先順位を確認する:httpd -S

定義済みのバーチャルホストの一覧と、どのIP:ポートにどのホストが割り当てられているかは httpd -S(Debian/Ubuntu系では apache2ctl -S)で確認します。-S-D DUMP_VHOSTS -D DUMP_RUN_CFG を有効にした構文チェックで、内部的には設定の読み込みも行うため、構文エラーがあればここでも報告されます。

$ sudo httpd -S

VirtualHost configuration:
*:80         is a NameVirtualHost
        default server www.example.com (/etc/httpd/conf.d/example.conf:1)
        port 80 namevhost www.example.com (/etc/httpd/conf.d/example.conf:1)
        port 80 namevhost blog.example.com (/etc/httpd/conf.d/blog.conf:1)
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=48
Group: name="apache" id=48

 

この出力の読み方は次のとおりです。

行の見出し 意味
*:80 is a NameVirtualHost このIP:ポートで名前ベースのバーチャルホスト(同一ポートを ServerName で振り分け)が有効になっている。
default server … そのIP:ポートで最初にマッチした vhost。どの ServerName にも一致しないリクエストはここに振られる。ファイル先頭側の定義が既定になりやすい。
port 80 namevhost … 個々のバーチャルホスト。末尾の (ファイル:行番号) がその定義の場所を示す。
Main DocumentRoot <VirtualHost> の外側(グローバル)で設定された既定の公開ディレクトリ。

 

意図したホストが一覧に出てこない、または default server が想定と違う場合は、設定の読み込み漏れや定義順の問題を疑います。とくに「アクセスすると別サイトが表示される」トラブルは、default server として拾われている vhost を httpd -S で特定すると原因に早くたどり着けます。

 

テストしてから安全に反映する:graceful

設定を変更したら、必ず構文チェックに通してから再読み込みします。テストせずに restartreload を実行すると、設定ミスがあった場合に Apache が起動に失敗し、稼働中のサイトごと停止してしまう恐れがあります。次の順序を習慣にしてください。

# 1. まず構文チェック

$ sudo apachectl configtest

# 2. Syntax OK を確認できたら、無停止で再読み込み

$ sudo apachectl graceful

 

graceful は、処理中のリクエストを中断せずに完了させたうえで、子プロセスを順次入れ替えて設定を反映します。そのため 無停止で設定を反映できるのが利点です。なお graceful 自体も再読み込み前に設定を検査し、構文エラーがあれば反映を行わず現行設定のまま稼働を続けます。とはいえ事前の configtest で内容をはっきり確認してから実行するのが安全です。

サービスマネージャ(systemd)経由で運用している場合は、次のように reload を使う方法もあります(多くの環境で内部的に graceful 相当の動作になります)。

# RHEL系

$ sudo systemctl reload httpd

# Debian / Ubuntu系

$ sudo systemctl reload apache2

 

ディストリビューションによるコマンドの違い

Apacheの管理コマンドは、ディストリビューションによって名前や標準のパス・設定ファイルの場所が異なります。やりたいことが同じでも、環境に合わせてコマンド名を読み替えてください。

やりたいこと RHEL系(CentOS / Rocky / Alma) Debian / Ubuntu系
構文チェック apachectl configtest / httpd -t apache2ctl configtest / apachectl configtest
vhost 一覧 httpd -S / apachectl -S apache2ctl -S / apachectl -S
無停止リロード apachectl graceful apache2ctl graceful
メイン設定ファイル /etc/httpd/conf/httpd.conf /etc/apache2/apache2.conf
vhost 配置場所 /etc/httpd/conf.d/ /etc/apache2/sites-available/a2ensite で有効化)

 

Debian/Ubuntu系では、apache2ctl が標準のラッパーで、apachectl はその別名(シンボリックリンク)として提供されることが多いです。どちらを使っても同じ結果になりますが、環境変数を読み込むため apache2ctl(または apachectl)を使うのが推奨され、httpd バイナリを直接叩く運用は基本的に RHEL系のものと考えて差し支えありません。

 

典型的なエラー例と対処

よくある落とし穴
  • ポートの重複(Address already in use):同じIP:ポートを別プロセスが使用中、または vhost を二重定義している。configtest は通っても起動時に失敗する典型例。ss -ltnpsudo lsof -i :80 で使用中プロセスを確認する。
  • ServerName 未設定の警告(AH00558)Could not reliably determine the server's fully qualified domain name はエラーではなく警告。動作はするが、グローバル設定に ServerName www.example.com:80 を追加すると解消できる。
  • 閉じタグ漏れ(<VirtualHost> was not closed)<VirtualHost><Directory> の開始タグに対応する終了タグがない。表示された行番号付近の対応関係を確認する。
  • モジュール未ロード(Invalid command)SSLEngineRewriteEngine などのディレクティブが「無効なコマンド」と言われる場合、対応モジュール(mod_ssl / mod_rewrite)が読み込まれていない。Debian系なら a2enmod rewrite 等で有効化する。

 

よくある質問

Q. apachectl configtesthttpd -t は何が違いますか?
A. 実質的に同じです。apachectlhttpd バイナリのラッパースクリプトで、configtest サブコマンドは内部で httpd -t を呼び出します。apachectl 側は環境変数の読み込みなどを面倒見てくれるため、通常は apachectl configtest を使うほうが安全です。

Q. Syntax OK なのにサイトが正しく表示されません。
A. Syntax OK は構文と基本整合性の確認であって、実際の表示結果までは保証しません。httpd -S で意図した vhost が想定どおりのIP:ポートに割り当たっているか、DocumentRoot のパスやパーミッション、ServerName / ServerAlias の指定を確認してください。エラーログ(RHEL系 /etc/httpd/logs/error_log、Debian系 /var/log/apache2/error.log)も合わせて確認すると原因を絞り込めます。

Q. 設定変更を反映するのに restartgraceful のどちらを使うべきですか?
A. 稼働中のサービスであれば、処理中のリクエストを切らずに反映できる graceful(または systemctl reload)が基本です。restart は Apache を一度停止してから起動し直すため瞬間的な接続断が起き、設定ミスがあると再起動に失敗してサービスが落ちます。いずれの場合も、事前に apachectl configtestSyntax OK を確認してから実行してください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法(Ubuntu)
  2. Apache HTTP Server のインストール方法(CentOS / RHEL)
  3. ディレクトリ構造
  4. httpd.conf(設定ファイル)
  5. ドキュメントルートの変更方法
  6. .htaccess
  7. コマンド一覧
  8. エラー一覧
  9. VPSへの導入例(CentOS編)
  10. SSLの設定
  11. httpd.conf系のバーチャルホストの設定エラー有無確認方法
  12. .htaccess でベーシック認証
  13. configの文法チェック

最近更新/作成されたページ