宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「httpd.confを編集したら、Apacheが起動しなくなった」
「設定ファイルを変更するたびにドキドキしながら再起動している」
設定ミスは1文字でもApacheが起動不能になる深刻な問題です。本番環境なら即サービス停止です。

この記事では、Apacheの設定ファイルを本番投入前にチェックするhttpd -tコマンドとapachectl configtestコマンドの使い方を解説します。
エラーメッセージの読み方、設定変更のベストプラクティス、本番環境での安全な反映手順まで、現場で実践できる内容をまとめました。
【この記事でわかること】
httpd -t または apachectl configtest で設定ファイルの構文を事前チェックできる
・「Syntax OK」と表示されれば文法エラーなし、エラー時は行番号が表示される
・本番環境では configtest → graceful の手順で無停止で設定を反映する
Include で読み込まれた全設定ファイル(conf.d/*.conf)もまとめてチェックされる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ設定ファイルを事前チェックするのか

Apacheは、設定ファイル(httpd.conf)に文法エラーがあると起動に失敗します

開発環境であれば起動失敗に気づいてすぐ直せますが、本番環境で夜間メンテナンス後に再起動したら起動不能になった、というケースは現場でよくあります。サービス停止の原因が設定ファイルの1文字ミスということも珍しくありません。

httpd -t(または apachectl configtest)を実行すると、Apacheを起動せずに設定ファイルの構文チェックだけを行います
エラーがあれば起動前に検知できるため、このコマンドは設定変更のたびに必ず実行する習慣をつけてください。

基本的な使い方

1. httpd -t コマンドで構文チェックする

-t(test)オプションを使います。実際に起動はせず、設定ファイルの構文チェックだけを実行します。

# 設定ファイルの構文チェックを実行する [root@web01 ~]# httpd -t Syntax OK

「Syntax OK」と表示されれば、設定ファイルに文法エラーはありません。

2. apachectl configtest コマンドで構文チェックする

apachectl configtest は、httpd -t と同じ構文チェックを実行するApache管理ツールのサブコマンドです。どちらを使っても結果は同じです。

# apachectl でも同じ構文チェックができる [root@web01 ~]# apachectl configtest Syntax OK # systemd環境(RHEL 7以降)では apachectl を経由せず直接 httpd -t でも問題ない [root@web01 ~]# /usr/sbin/httpd -t Syntax OK

3. 構文エラーがある場合の出力例

エラーがある場合は、エラーの内容・ファイル名・行番号が表示されます。

# httpd.conf の31行目に文法エラーがある場合の出力例 [root@web01 ~]# httpd -t AH00526: Syntax error on line 31 of /etc/httpd/conf/httpd.conf: Invalid command 'ServerNme', perhaps misspelled or defined by a module not included in the server configuration # conf.d 配下のインクルードファイルにエラーがある場合 [root@web01 ~]# httpd -t AH00526: Syntax error on line 5 of /etc/httpd/conf.d/vhost.conf: Invalid command 'DocumentRoot', perhaps misspelled or defined by a module not included in the server configuration

エラーメッセージには「行 XX の Invalid command 'YYY'」のように原因が示されます。
「ServerNme」のようなタイプミス(ServerNameの誤り)や、モジュールがロードされていないディレクティブの使用が典型的なエラーです。

応用・実務Tips

1. 設定ファイルが格納されている場所を確認する

httpd -t がチェックする設定ファイルの場所は、インストール方法によって異なります。

# RHEL/CentOS/Rocky Linux 系(yum/dnf インストール) /etc/httpd/conf/httpd.conf # メイン設定ファイル /etc/httpd/conf.d/*.conf # 追加設定ファイル(仮想ホスト等) /etc/httpd/conf.modules.d/*.conf # モジュール設定 # Debian/Ubuntu 系(apt インストール) /etc/apache2/apache2.conf # メイン設定ファイル /etc/apache2/sites-enabled/*.conf # 有効なバーチャルホスト設定 /etc/apache2/mods-enabled/*.conf # 有効なモジュール設定 # ソースコンパイルの場合 /usr/local/apache2/conf/httpd.conf # ServerRoot からの相対パス

設定ファイルのパスが不明な場合は、httpd.conf の ServerRoot ディレクティブを確認してください。

2. 構文チェックで確認できる範囲

httpd -t は、httpd.conf から Include または IncludeOptional で読み込まれるすべての設定ファイルをチェックします。つまり、conf.d/ 配下に追加したバーチャルホスト設定や、モジュール設定ファイルも含めて一括チェックが可能です。

# httpd.conf 内で Include されているファイルをすべて確認する [root@web01 ~]# grep -i "^Include" /etc/httpd/conf/httpd.conf IncludeOptional conf.d/*.conf # 実際に読み込まれているすべての設定ファイルを一覧表示する [root@web01 ~]# httpd -t -D DUMP_CONFIG 2>&1 | grep "^# .*config"

3. 本番環境での安全な設定反映手順

設定変更を本番環境に反映する際は、以下の手順を踏むことでリスクを最小化できます。

# Step 1: 設定ファイルを編集する(バックアップを先に取る) [root@web01 ~]# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak.$(date +%Y%m%d) [root@web01 ~]# vi /etc/httpd/conf/httpd.conf # Step 2: 構文チェックを実行する [root@web01 ~]# httpd -t Syntax OK # Step 3: graceful で設定を反映する(接続中のクライアントに影響を与えない) [root@web01 ~]# apachectl graceful # または systemd 経由で reload する(RHEL 7以降) [root@web01 ~]# sudo systemctl reload httpd

restart と reload の違い
restart(再起動):接続中のクライアントを切断して再起動する。httpd.conf の大きな変更(MPM変更等)には必要
reload(再読込):接続中のクライアントは維持したまま設定を再読み込みする(graceful reloadとも呼ばれる)

バーチャルホストの追加・変更、SSLの設定変更など、多くの設定変更は reload で対応できます。本番環境では restart より reload を優先して使ってください。

4. httpd -t -D DUMP_VHOSTS でバーチャルホストを確認する

複数のバーチャルホストを運用している場合、どのドメインがどのDocumentRootに紐づいているかを確認できます。

[root@web01 ~]# httpd -t -D DUMP_VHOSTS VirtualHost configuration: *:443 is a NameVirtualHost default server www.example.com (/etc/httpd/conf.d/ssl.conf:40) port 443 namevhost www.example.com (/etc/httpd/conf.d/ssl.conf:40) *:80 is a NameVirtualHost default server www.example.com (/etc/httpd/conf.d/vhost.conf:1) port 80 namevhost www.example.com (/etc/httpd/conf.d/vhost.conf:1) port 80 namevhost api.example.com (/etc/httpd/conf.d/vhost.conf:10) Syntax OK

バーチャルホストのリクエストルーティングが想定通りか確認する際に便利です。

※注意:httpd -t -D DUMP_VHOSTS は構文チェックと同時にバーチャルホスト情報を出力しますが、設定ファイルにエラーがある場合はバーチャルホスト情報は表示されません。まず httpd -t で Syntax OK を確認してから使ってください。

トラブルシュート・エラー対処

1. 「httpd: command not found」が出る

httpd コマンドが見つからない場合は、フルパスで指定するか、Debian/Ubuntu系では apache2 コマンドを使います。

# RHEL/CentOS 系でパスを確認する [root@web01 ~]# which httpd /usr/sbin/httpd [root@web01 ~]# /usr/sbin/httpd -t # Debian/Ubuntu 系では apache2 コマンドを使う $ sudo apache2 -t Syntax OK # または apachectl を使う(どちらの環境でも動作する) $ sudo apachectl configtest Syntax OK

2. 「Syntax OK」と表示されているのにApacheが起動しない

構文チェックはあくまで文法のチェックです。以下の問題は httpd -t では検出できません。

ポート競合:すでに他のプロセスが同じポート(80/443)を使っている
SSL証明書のパスエラー:指定した証明書ファイルが存在しない
DocumentRootのパスエラー:指定したドキュメントルートが存在しない、またはアクセス権がない

起動失敗時は必ずエラーログを確認してください。

# Apacheのエラーログをリアルタイムで確認する [root@web01 ~]# tail -f /var/log/httpd/error_log # systemctlでの起動失敗時はjournalctlも確認する [root@web01 ~]# journalctl -xe -u httpd --no-pager | tail -20

3. 「AH00558: httpd: Could not reliably determine the server's fully qualified domain name」が出る

これはエラーではなく警告(warning)です。Syntax OK の表示があれば問題なく起動できます。

# 警告が出ても Syntax OK ならば起動に問題はない [root@web01 ~]# httpd -t AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Syntax OK # 警告を消したい場合は httpd.conf に ServerName を追加する # /etc/httpd/conf/httpd.conf ServerName www.example.com:80

本記事のまとめ(httpd -t / configtest 早見表)

やりたいこと コマンド
設定ファイルの構文チェック(RHEL系) httpd -t
設定ファイルの構文チェック(共通) apachectl configtest
設定ファイルの構文チェック(Ubuntu) sudo apache2 -t
接続を維持しながら設定を反映する apachectl graceful または sudo systemctl reload httpd
バーチャルホストの設定を確認する httpd -t -D DUMP_VHOSTS
Apacheの起動失敗原因を確認する tail -f /var/log/httpd/error_log
systemd経由の起動失敗原因を確認する journalctl -xe -u httpd --no-pager
設定ファイルを編集前にバックアップする cp httpd.conf httpd.conf.bak.$(date +%Y%m%d)

「Invalid command」エラー早見表とよくある原因

httpd -t で頻出する「Invalid command 'XXX', perhaps misspelled or defined by a module not included in the server configuration」というエラーは、大きく分けて3パターンの原因があります。エラー文をぱっと見て即原因を切り分けられるよう、早見表にしました。

表示されるディレクティブ 本当の原因 対処
SSLEngine / SSLCertificateFile mod_ssl 未ロード RHEL系: dnf install mod_ssl / Ubuntu系: a2enmod ssl
RewriteEngine / RewriteRule mod_rewrite 未ロード RHEL系: conf.modules.d/00-base.confLoadModule rewrite_module / Ubuntu系: a2enmod rewrite
ProxyPass / ProxyPassReverse mod_proxy / mod_proxy_http 未ロード RHEL系: dnf install mod_proxy_html 不要、conf.modules.dにLoadModule追加 / Ubuntu系: a2enmod proxy proxy_http
Require / Order / Allow Apache 2.2系と2.4系の文法非互換 2.4系では Require all granted など新文法に書き直す
php_value / php_admin_value mod_php 未ロード(PHP-FPM環境では使用不可) PHP-FPM環境では .user.ini または php.ini で設定
ServerNme / DocuemntRoot など 単純なタイプミス エラー行の前後をvimで :set nu 表示して該当行を確認

1. モジュール未ロードの確認手順

「Invalid command」が出たら、まずモジュールが読み込まれているかを確認します。

# 現在ロードされているモジュール一覧 [root@web01 ~]# httpd -M | grep -i ssl ssl_module (shared) socache_shmcb_module (shared) # rewrite_module がロードされていないとSSL設定はOKでもRewriteRuleで詰む [root@web01 ~]# httpd -M | grep -i rewrite (何も出ない=未ロード)

2. Ubuntu 22.04 / 24.04 LTS では a2enmod が定番

Debian/Ubuntu系では、モジュール有効化が a2enmod コマンドで完結します。

# Ubuntu 24.04 LTS / 22.04 LTS でrewrite/ssl/proxyを有効化 $ sudo a2enmod rewrite ssl proxy proxy_http $ sudo apache2 -t Syntax OK $ sudo systemctl reload apache2

有効化後は必ず apache2 -t で構文チェックしてから reload してください。

本番投入前のステージング検証フロー(実務テンプレート)

構文チェックが通っても、設定変更が「業務影響を出さない」とは限りません。実務では、構文チェック → ステージング検証 → 本番反映の3段階を踏むことで、夜間メンテナンス事故を激減できます。

1. 5段階の安全フロー

# Step 1: 編集前にバックアップ(ファイル名にタイムスタンプ) [root@web01 ~]# cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d_%H%M%S) # Step 2: 構文チェック [root@web01 ~]# httpd -t Syntax OK # Step 3: ステージングサーバで先に reload してログ監視 [root@stg01 ~]# sudo systemctl reload httpd [root@stg01 ~]# tail -f /var/log/httpd/error_log # Step 4: 本番サーバで graceful reload [root@web01 ~]# apachectl graceful # Step 5: 反映後の動作確認(curl で代表的なURLを叩く) [root@web01 ~]# curl -sI https://www.example.com/ | head -1 HTTP/1.1 200 OK

2. graceful と graceful-stop の使い分け

apachectl graceful は接続中のリクエストを維持したまま再起動するコマンドですが、graceful-stop は再起動せず停止のみを行います。リクエストドレイン(既存接続を捌ききってから止める)が必要な場面で使います。

# 接続を維持したまま設定反映(再起動) [root@web01 ~]# apachectl graceful # 接続を捌ききってから停止(再起動はしない) [root@web01 ~]# apachectl graceful-stop # systemd経由の場合 [root@web01 ~]# sudo systemctl reload httpd # = graceful [root@web01 ~]# sudo systemctl reload-or-restart httpd

3. 構成管理ツールから流す場合の注意

Ansible / Chef / Puppet などで設定ファイルを配布する場合、ハンドラに httpd -t を必ず挟んでください。チェックなしでreloadすると、本番Apacheが落ちます。

# Ansibleのhandler例(YAML) - name: validate httpd config command: /usr/sbin/httpd -t changed_when: false - name: reload httpd service: name: httpd state: reloaded when: validate_result is succeeded

Nginxの「nginx -t」との違い・差し替え検討時のポイント

ApacheからNginxへの切り替え、または逆方向の移行を検討する際、構文チェックコマンドの違いを把握しておくと混乱しません。

項目 Apache(httpd -t Nginx(nginx -t
基本コマンド httpd -t または apachectl configtest nginx -t または sudo nginx -t
成功時の出力 Syntax OK syntax is oktest is successful の2行
Include展開 Include / IncludeOptional 配下まで一括チェック include 配下まで一括チェック
graceful reload apachectl graceful または systemctl reload httpd nginx -s reload または systemctl reload nginx
主な失敗パターン モジュール未ロード(mod_ssl/rewrite/proxy) upstream ホスト名の名前解決失敗、ポート競合

構文チェックの「思想」は同じです。「設定の反映前に必ずバリデーション」「失敗時は行番号で原因を示す」「graceful reloadで接続を切らずに反映」という3点はApache / Nginxどちらでも共通。本番運用ではこの3点を必ず守ってください。

※最終更新: 2026-05-11(Invalid commandエラー早見表・ステージング検証フロー・Nginx対比を追加)

よくある質問(FAQ)

httpd -t と apachectl configtest はどちらを使えばいいですか?

どちらも同じ構文チェックを実行します。apachectl configtest は内部で httpd -t を呼んでいるため結果は完全に同じです。スクリプトに組み込む場合は短い httpd -t、対話的に叩く場合は意味が分かりやすい apachectl configtest を使う方が読みやすいです。

configtest が Syntax OK でも、reload で失敗することがあります。なぜですか?

構文チェックは「文法が正しいか」だけを見るため、ポートの重複・モジュール未ロード・SELinux ラベル不一致は検出できません。configtest 通過後に apachectl graceful を実行し、journalctl -u httpd でエラーを確認するのが安全な順序です。

Ubuntu / Debian でも同じコマンドが使えますか?

Ubuntu/Debian系では apache2ctl configtest または apache2ctl -t を使います。設定ファイルパスも /etc/httpd/conf/httpd.conf(RHEL系)と /etc/apache2/apache2.conf(Debian系)で異なる点に注意してください。

設定ファイル変更前にバックアップを取る必要はありますか?

取った方が安全です。私も vi httpd.conf で直接編集して、configtest は通ったものの reload 後に挙動がおかしくなり、戻すファイルがなくて手が動かなくなった経験があります。cp httpd.conf httpd.conf.$(date +%Y%m%d) を編集前に必ず1行打つだけで、切り戻しが10秒で済みます。

Apacheの設定で詰まったことはありませんか?

設定ファイルのチェック方法に限らず、Linuxサーバー構築では「設定した通りに動かない」「エラーの意味がわからない」といった壁に何度もぶつかります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、「Linuxサーバー構築入門マニュアル(図解60P)」を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。