エラーの内容
apt install nginx または apt upgrade を実行すると、ターミナルに以下のエラーが表示されます:
dpkg: error processing package nginx (--configure)
dpkg: dependency problems prevent configuration of nginx
Errors were encountered while processing:
nginx
これで apt が半壊状態になります。以降の apt install や apt upgrade はすべて同じエラーを吐き続けます。dpkg 地獄へようこそ。
何が起きているのか
apt の下層にある低レベルパッケージマネージャー dpkg が、パッケージを展開した後の設定処理で壁にぶつかりました。原因はたいてい次のいずれかです:
- 依存パッケージが存在しない、バージョンが合わない、またはそれ自体が壊れている
- 以前のインストールやアップグレードが途中で中断された(停電、Ctrl+C、SSH切断など)
- インストール後スクリプト(
postinst)がクラッシュするか、ゼロ以外の終了コードで終了した - 競合するパッケージが設定処理をブロックしている
- パッケージデータベース自体が不整合な状態になっている
1つのパッケージが詰まると、apt システム全体が凍りつきます。壊れた状態を修正するまで、何もインストールもアップグレードもできません。
修正方法 — この順番で試してください
ステップ 1:保留中のパッケージを強制設定する
まずここから始めます。dpkg が途中で放置した設定処理を完了させます:
sudo dpkg --configure -a
エラーが出なければ成功です。続けてすぐに以下を実行します:
sudo apt install -f
-f オプションは「fix broken(壊れたものを修正)」の略です。apt が未解決の依存関係をスキャンして自動的に解決します。その後 apt upgrade を実行してシステムがクリーンな状態か確認しましょう。
ステップ 2:壊れた依存関係を修正する
まだ壊れていますか?apt 自体に自己修復を試みさせます:
sudo apt --fix-broken install
sudo apt autoremove
sudo apt autoclean
その後、元のインストールを再試行します:
sudo apt install nginx
ステップ 3:壊れたパッケージを削除して再インストールする
場合によっては、壊れたパッケージを完全に取り除いてやり直すしかありません:
# パッケージを完全削除(設定ファイルも含む)
sudo dpkg --purge nginx
# 設定ファイルを残したまま削除する場合
sudo dpkg --remove nginx
# 残った壊れた状態をクリーンアップ
sudo apt install -f
# 再インストール
sudo apt install nginx
dpkg --purge 自体がスクリプトエラーで詰まる場合は、強制的に実行します:
sudo dpkg --purge --force-remove-reinstreq nginx
ステップ 4:依存関係の競合を手動で解決する
エラーメッセージに特定の依存パッケージ名が示されている場合は、直接対処します:
# 依存関係のチェーンを確認する
sudo apt install nginx 2>&1 | grep "Depends"
# 不足している依存パッケージを明示的にインストール
sudo apt install libssl1.1
# 再試行
sudo apt install nginx
バージョンの競合はより複雑です。実際に利用可能なバージョンを確認してから、動作するバージョンを指定します:
# 利用可能な全バージョンを確認
apt-cache policy nginx
# 特定のバージョンをインストール
sudo apt install nginx=1.18.0-0ubuntu1.4
ステップ 5:パッケージキャッシュをクリアして再取得する
古くなったり半端にダウンロードされた .deb ファイルは、見逃しやすいサイレントな失敗の原因になります。まとめて削除しましょう:
sudo apt clean
sudo apt update
sudo apt install nginx
ステップ 6:最終手段 — dpkg データベースを再構築する
最後の手段です。dpkg のステータスデータベースは、ディスクエラーやアップグレード中の強制再起動によって壊れることがあります。まずバックアップを取ってから、古いロックファイルを削除します:
# ステータスデータベースをバックアップ
sudo cp /var/lib/dpkg/status /var/lib/dpkg/status.bak
# 前回の処理が残したロックファイルを削除
sudo rm -f /var/lib/dpkg/lock-frontend
sudo rm -f /var/lib/dpkg/lock
sudo rm -f /var/cache/apt/archives/lock
sudo rm -f /var/lib/apt/lists/lock
# すべてを再設定
sudo dpkg --configure -a
sudo apt install -f
sudo apt update && sudo apt upgrade
重要: ロックファイルを削除するのは、apt や dpkg のプロセスが確実に実行されていない場合のみです。事前に確認してください:ps aux | grep -E 'apt|dpkg'
修正の確認
作業完了と判断する前に、簡単なサニティチェックを実行します:
# 壊れた状態のパッケージがないか確認
sudo dpkg --audit
# ステータスフラグが異常なパッケージを一覧表示(rc、iF、iU、rF)
dpkg -l | grep -E '^(rc|iF|iU|rF)'
# 両コマンドが何も返さなければクリーン
# 完全なアップグレードで最終確認
sudo apt update && sudo apt upgrade
正常なシステムでは dpkg --audit が何も出力しません。それが合格サインです。
特定のケース:postinst スクリプトの失敗
エラーに postinst が含まれていますか?パッケージの展開自体は成功したものの、セットアップ中に失敗したということです。よくある原因は、ポート 80 がすでに使用中でサービスを起動できない場合や、設定ファイルに構文エラーがある場合です。
# ポート 80 を占有しているプロセスを確認(nginx の場合)
sudo ss -tlnp | grep :80
# サービスの状態を確認して手がかりを探す
sudo systemctl status nginx
# postinst スクリプトを読んで処理内容を把握する
cat /var/lib/dpkg/info/nginx.postinst
競合しているサービスを停止するか設定を修正してから、手動で設定処理を完了させます:sudo dpkg --configure nginx。
予防策
- apt の処理中に絶対に Ctrl+C を押さない — どうしても止める必要がある場合は、現在処理中のパッケージが終わるまで待ちましょう
- PPA の追加は慎重に — サードパーティの PPA は Ubuntu における依存関係の競合の最大の原因です。追加するたびにリスクが増えます
- 定期的にアップデートする — 週に一度
sudo apt update && sudo apt upgradeを実行することで依存関係のズレを最小限に抑えられます。半年分のアップデートをまとめて適用しようとすると競合の温床になります - インストールには
dpkgではなくaptを使う — apt は依存関係を自動解決しますが、dpkg はパッケージを機械的に展開するだけです - ディスク容量を確認する —
/varパーティションが満杯だと dpkg が書き込み途中で失敗し、パッケージが半インストール状態になります。大きなアップグレードの前に確認しましょう:df -h /var
Ansible や cloud-init でサーバーを管理している場合、不正な YAML 設定も dpkg が動き出す前にインストールを失敗させる原因になります。ToolCraft の YAML ↔ JSON コンバーターを使えば、ファイルをアップロードせずにブラウザ上で YAML 構文を検証できます。サーバーに反映する前のタイポ発見に重宝します。

