2026年6月27日
2026年6月27日
Apacheの設定ファイルの文法チェック方法(configtestのエラーの読み方と反映前の手順)
Apacheの設定ファイルの文法は、apachectl configtest(短く書くと apachectl -t)で確認できます。Syntax OK と表示されれば、Apacheはその設定を読み込めます。この記事では、ディストリビューションごとのコマンドの違い、エラーメッセージから問題の行を特定する読み方、文法チェックでは見つからない問題、そして設定変更を安全に反映するための手順を説明します。
基本のコマンド
設定を変更したら、反映する前に次のコマンドを実行します。
# Ubuntu・Debian
sudo apache2ctl configtest
# RHEL系(AlmaLinux・Rocky Linuxなど)
sudo apachectl configtest
Ubuntuでは apachectl も apache2ctl と同じものとして使えます。configtest と -t は同じ意味です。問題がなければ、最後に次の1行が表示されます。
Syntax OK
UbuntuやDebianで、apache2 -t のようにApacheの本体を直接実行すると、Config variable ${APACHE_RUN_DIR} is not defined といったエラーが出ることがあります。これは設定の誤りではなく、Debian系のApacheが /etc/apache2/envvars で定義する環境変数を読み込んでいないためです。Debian系では apache2ctl 経由で実行してください。RHEL系では httpd -t を直接実行しても同じように確認できます。
エラーメッセージの読み方
文法チェックで問題が見つかると、Apacheは最初に見つかった1件だけを表示して終了します。表示されるメッセージには、問題のファイルと行番号が含まれています。
AH00526: Syntax error on line 14 of /etc/apache2/sites-enabled/example.com.conf:
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
この例では、example.com.conf の14行目にある RewriteEngine が認識されていません。読むときは次の3点を確かめます。
- どのファイルの何行目か:
Includeで読み込まれたファイルも、実際のパスで表示されます。 - 何が問題か: 2行目が理由です。
- 1件直したら再実行する: 最初のエラーで止まるため、直すたびに
configtestをやり直し、Syntax OKが出るまで繰り返します。
よく見かけるメッセージと、考えられる原因は次のとおりです。
- **
Invalid command '...', perhaps misspelled or defined by a module not included**: ディレクティブの綴りの誤りか、そのディレクティブを提供するモジュールが読み込まれていません。RewriteEngineなら mod_rewrite、SSLEngineなら mod_ssl、Headerなら mod_headers です。Debian系ではsudo a2enmod rewriteのように有効にします。 - **
... directive missing closing '>'や</VirtualHost> without matching <VirtualHost> section**:<VirtualHost>や<Directory>の開始と終了の数が合っていません。コピーして貼り付けた設定で、閉じタグが抜けたり重複したりしていないかを見ます。 - **
SSLCertificateFile: file '...' does not exist or is empty**: 証明書ファイルのパスが誤っているか、ファイルがありません。Let's Encryptの証明書なら/etc/letsencrypt/live/以下のパスを指定しているかを確認します。 - **
Warning: DocumentRoot [...] does not exist**: 指定したディレクトリがありません。これは警告なので、そのあとにSyntax OKが続きます。見落とすとサイトが表示されない原因になるため、Syntax OKだけでなく、その前の行も読むようにします。
次の警告もよく目にします。
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
これはエラーではなく、全体の設定に ServerName がないことを知らせる警告です。動作に支障はありませんが、ほかのメッセージを見落とさないように、全体の設定(Debian系なら /etc/apache2/conf-available/ に置いて a2enconf で有効にするなど)に ServerName を書いて消しておくとよいでしょう。
設定の全体像を確認するオプション
文法が正しくても、「どの設定が実際に使われているか」が想定と違うことがあります。次のオプションで、Apacheが読み込んだ結果を確認できます。
sudo apache2ctl -S # バーチャルホストの一覧と既定のサイト
sudo apache2ctl -M # 読み込まれているモジュールの一覧
sudo apache2ctl -t -D DUMP_INCLUDES # 読み込まれた設定ファイルの一覧と順番
-S の出力では、ポートごとにどのバーチャルホストが既定(default server)になっているかが分かります。新しく追加したサイトにアクセスすると別のサイトが表示される、という問題は、ServerName の誤りや読み込み順が原因であることが多く、この出力で見つけられます。DUMP_INCLUDES は、編集したファイルがそもそも読み込まれているかを確かめるのに便利です。Debian系では、sites-available に置いただけで a2ensite を実行していないファイルは読み込まれません。
文法チェックでは見つからない問題
Syntax OK は「Apacheが設定を読み込める」という意味で、「意図どおりに動く」ことまでは保証しません。次のような問題は、文法チェックを通っても起こります。
- **
.htaccessの誤り**:.htaccessはリクエストのたびに読み込まれるため、configtestの対象になりません。WordPressの.htaccessに誤った記述があると、アクセスしたときに 500 エラーになり、エラーログに.htaccess: Invalid command ...のような記録が残ります。.htaccessを編集したら、サイトを表示してエラーログを確認します。 - ポートの競合: 別のソフトウェアが80番や443番を使っていると、起動時に
Address already in useで失敗します。sudo ss -ltnp | grep -E ':80|:443'で確認できます。 - ロジックの誤り: リダイレクトのループ、意図しないアクセス制限、
DocumentRootの指定違いなどは、文法としては正しいため見つかりません。 - 権限やSELinux: RHEL系では、SELinuxのラベルが合わないファイルをApacheが読めず、起動や表示に失敗することがあります。
安全に反映するための手順
本番サーバーでは、「バックアップ → 編集 → 文法チェック → 再読み込み → 動作確認」の順番を毎回同じように行うことが、事故を防ぐ一番の方法です。
# 1. 編集前にバックアップ
sudo cp -a /etc/apache2 /root/apache2-backup-$(date +%Y%m%d-%H%M)
# 2. 編集後、文法チェックが通ったときだけ再読み込み
sudo apache2ctl configtest && sudo systemctl reload apache2
# 3. エラーログと表示を確認
sudo tail -n 30 /var/log/apache2/error.log
curl -sI https://example.com/ | head -n 1
&& でつなぐと、configtest が失敗したときに再読み込みが実行されません。設定に誤りがある状態で再読み込みや再起動を行うと、Apacheが停止してサイトが表示されなくなるおそれがあるため、この順番を習慣にしておきます。
apachectl graceful や apachectl restart は、実行前に自動で文法チェックを行う作りになっています。一方、systemctl reload や systemctl restart が内部で何を実行するかはディストリビューションによって異なるため、どの方法で反映する場合でも、自分で configtest を先に実行しておくほうが確かです(2026年10月現在)。
複数の人が設定を触るサーバーや、設定変更が多いサーバーでは、/etc/apache2 をGitで管理し、変更の履歴を残しておくと、問題が起きたときに直前の状態へ戻しやすくなります。証明書の秘密鍵など、リポジトリに入れてはいけないファイルは除外してください。
まとめ
- 文法チェックは
apache2ctl configtest(RHEL系はapachectl configtest)で行い、Syntax OKが出れば読み込める設定です。 - エラーは最初の1件だけが、ファイル名と行番号付きで表示されます。1件直すたびに再実行します。
Invalid commandの多くは、綴りの誤りかモジュールの読み込み忘れです。-S・-M・-D DUMP_INCLUDESで、実際に使われているバーチャルホスト・モジュール・ファイルを確認できます。.htaccessの誤りやポートの競合は文法チェックでは見つからないため、反映後にエラーログと表示を確かめます。