MENU

設定ファイルを適用する前に文法エラーを検出してサービス障害を防ぐ手順

目次

設定ファイルを適用する前に検査する意義

nginx や sshd の設定ファイルにタイポが混入したまま systemctl reload を実行すると、サービスが起動できずアクセス不能になることがあります。特に SSH サーバーの場合、設定ミスによってリモートからのログインが一切できなくなるリスクがあります。

主要なサービスにはほぼ必ず「適用前チェック」コマンドが用意されています。設定を反映する前にこのコマンドを通す習慣をつけておくと、構文エラーに起因するサービス障害をほぼ防ぐことができます。

Web サーバーの設定チェック

nginx

設定ファイルを編集したあと、次のコマンドで構文を検査できます。

sudo nginx -t

エラーがなければ以下のように表示されます。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

問題がなければそのままリロードできます。

sudo nginx -t && sudo systemctl reload nginx

&& でつなぐことで、テストが通ったときだけリロードが実行されます。

Apache(httpd)

sudo apachectl configtest

Syntax OK と表示されれば問題ありません。ディストリビューションによっては httpd -t も使えます。

SSH サーバーの設定チェック

sshd の設定ミスはリモートアクセスを完全に遮断するリスクがあるため、特に慎重に扱う必要があります。/etc/ssh/sshd_config を編集したあとは必ず次のコマンドで検査してください。

sudo sshd -t

エラーがあれば行番号とともに内容が表示されます。エラーがない場合は何も出力されず終了します。

設定の詳細な内容(有効な値を含む)を確認したい場合は -T オプションが使えます。

sudo sshd -T

systemd ユニットファイルの検証

カスタムのサービスユニットファイルを作成・編集した場合、systemd-analyze verify で構文と依存関係の問題を検出できます。

systemd-analyze verify /etc/systemd/system/myapp.service

警告・エラーがあれば標準エラーに出力されます。何も表示されなければ問題なしです。

ファイルを新規作成・変更したあとは daemon-reload の前にこのコマンドを通しておくと安全です。

systemd-analyze verify /etc/systemd/system/myapp.service \
  && sudo systemctl daemon-reload \
  && sudo systemctl restart myapp

汎用フォーマットの検査(JSON・YAML・シェルスクリプト)

JSON

jq がインストールされている環境では次のように検査できます。

jq . /path/to/config.json > /dev/null

jq がない場合は Python の標準モジュールで代替できます。

python3 -m json.tool /path/to/config.json > /dev/null

YAML

yamllint パッケージを使うと詳細なチェックができます。

yamllint /path/to/config.yaml

yamllint がない場合は Python で構文チェックだけ行えます。

python3 -c "import yaml, sys; yaml.safe_load(open(sys.argv[1]))" /path/to/config.yaml

シェルスクリプト

シェルスクリプトの構文確認には bash -n が使えます。スクリプトを実行せずに構文解析だけ行います。

bash -n /path/to/script.sh

よくあるつまずきと注意点

「テストは通ったのにリロードが失敗した」
構文チェックはあくまで文法の確認です。証明書ファイルのパスが存在しない、ポートがすでに使用中といった実行時エラーはチェックを通過しても起きることがあります。リロード後は systemctl status やジャーナルログで状態を確認してください。

sudo systemctl status nginx
sudo journalctl -u nginx -n 50 --no-pager

nginx -t が別の設定ファイルを読んでいる
コンパイル時のデフォルトパスと実際の設定ファイルのパスが異なる場合があります。-c オプションでファイルを明示できます。

sudo nginx -t -c /etc/nginx/nginx.conf

sshd を reload しても反映されない設定項目がある
sshd -t でエラーがなくても、ListenAddress など一部の設定は reload では反映されず restart が必要です。変更内容がどのタイミングで有効になるかは sshd_config のマニュアル(man sshd_config)で確認できます。

設定チェックを CI/デプロイフローに組み込む
手動でのチェック忘れを防ぐには、設定ファイルの変更をリポジトリで管理し、デプロイスクリプトの中でチェックコマンドを必ず通す構成が一般的です。チェックが失敗した場合はデプロイを中断するよう、前述の && による連結か、スクリプト冒頭の set -e を活用できます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次