サーバー運用

nginx静的ファイルの404エラー解決法

2026-04-27 読了7分 6PV
nginx静的ファイルの404エラー解決法

こんにちは、AIシステムズです。
この記事は、代表コバが現場で対応してきたnginx運用の知見をもとに、AIを活用して構成・執筆し、弊社にて最終チェックを行ったものです。

「画像やCSSファイルだけが404になる」「PDFをアップロードしたが直リンクが開けない」「PHPは動くが静的ファイルだけ404」——nginx運用で頻発する代表的なトラブルです。原因はrootディレクティブの指定ミス、tryfilesの設定漏れ、パーミッションの3つに集約されます。

  • nginxで静的ファイルが404になる主要原因
  • rootalias の使い分け
  • try_files の正しい記述
  • パーミッションとSELinuxの落とし穴
  • WordPressサイト特有の事例

目次

  1. 静的ファイル404の典型パターン
  2. 原因を切り分ける手順
  3. rootとaliasの違いと使い分け
  4. try_filesの記述
  5. パーミッション・SELinuxの確認
  6. こういうサイトに向いている/向いていない
  7. 再発防止チェックリスト

静的ファイル404の典型パターン

弊社が中小企業のnginx運用で対応してきた中で、404の原因は次のとおりです。

  • root の指す物理パスが、URLの実体と一致していない
  • location 内で alias を使うべきところを root で書いている
  • try_files の最後に =404 や フォールバックが書かれており、ファイルがあっても通らない
  • nginxのワーカープロセス(nginx, www-data等)に該当ディレクトリの読み取り権限がない
  • RHEL系でSELinuxがファイルアクセスを遮断している

原因を切り分ける手順

1. nginxのアクセスログ・エラーログを確認

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

404が出ているリクエストの行から、nginxが実際にどのパスを参照しようとしたかをエラーログで確認します。open() "/var/www/html/wp-content/uploads/2026/05/foo.jpg" failed (2: No such file or directory) のように、参照先のフルパスが出ます。

2. nginxの設定をテスト

sudo nginx -t
sudo nginx -T | grep -A 10 "server_name example.com"

-T で展開済みの設定を確認し、対象serverブロックのroot・locationを確認します。

3. ファイルが実在しパーミッションが通るか

sudo -u nginx ls /var/www/html/wp-content/uploads/2026/05/foo.jpg

nginxユーザーで実行して、読み取りできるか確認します。

rootとaliasの違いと使い分け

root:locationのパスを末尾に連結

location /static/ {
    root /var/www/html;
    # 実体は /var/www/html/static/foo.css を見にいく
}

alias:locationのパスを置き換え

location /assets/ {
    alias /var/www/static-files/;
    # 実体は /var/www/static-files/foo.css を見にいく
}

「URLパス と 実体のディレクトリ名が一致しないとき」は alias を使うのが鉄則です。root で書いてしまうと、URLパスがディレクトリ名として末尾に付くため、想定外のパスを参照して404になります。

try_filesの記述

WordPressの典型的なtry_filesはこの形式です。

location / {
    try_files $uri $uri/ /index.php?$args;
}

意味は「$uri で指定されたファイルがあればそれを返す、なければ $uri/(ディレクトリ)を試す、それもなければ /index.php?$args に飛ばす」です。
静的ファイル用のlocationで try_files $uri =404; を書く場合、最後の =404 はファイルがなかったときの応答です。ファイルがあるはずなのに404が返るときは、$uriが指すパスがrootと一致しているか確認します。

パーミッション・SELinuxの確認

パーミッション

ls -la /var/www/html/wp-content/uploads/

ディレクトリは 755、ファイルは 644 が基本です。nginxユーザーがディレクトリの実行権限(x)を持っていないと、その配下のファイルにアクセスできません。

SELinux(RHEL系)

getenforce
ls -Z /var/www/html/wp-content/uploads/

コンテキストが httpd_sys_content_t 系になっている必要があります。なっていなければ修正します。

sudo chcon -R -t httpd_sys_rw_content_t /var/www/html/wp-content/uploads/
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wp-content/uploads(/.*)?"
sudo restorecon -R /var/www/html/wp-content/uploads/

WordPressサイト特有の事例

WordPressのアップロードファイルが404になるケースで多いのは次の3つです。

  • wp-content/uploads のディレクトリは存在するが、nginxの設定で root がWordPress本体と異なる場所を指している
  • マルチサイト構成で /files/ のリライトルールが入っていない
  • nginxの location ~ \.php$ が静的ファイルにも一致してしまい、PHP扱いされている

こういうサイトに向いている/向いていない

この設定整備は、nginxで配信している中小企業のWordPressサイトや、画像・PDF・動画ファイルを大量に扱うサイトに直接効きます。Apacheのみで構成されたサイトには関係ありません。

再発防止チェックリスト

  • locationでパスを置き換えるならalias、末尾に連結するならrootを使っているか
  • nginxユーザーで該当ディレクトリを読めるか
  • RHEL系ならSELinuxコンテキストを確認しているか
  • nginx -t と nginx -T で設定が想定どおりか
  • エラーログの実体パスとファイルシステムが一致しているか

まとめ

nginxで静的ファイルが404になる原因は、設定のroot/alias誤用とパーミッションがほとんどです。エラーログに出る「実際に参照しようとしたパス」を確認すれば、原因はすぐに特定できます。

本記事は、代表コバが中小企業のnginx・WordPress運用の現場で対応してきた知見をもとに、AIを活用して構成・執筆し、弊社にて最終確認を行っています。サーバー設定の見直し、CDN導入、画像配信の最適化について、具体的な状況をふまえた相談を承っています。費用感だけ知りたい方も、お気軽にご相談ください。

AI Systemsへの無料相談はこちら

「何から始めればいいか分からない」段階からでも、お気軽にご相談ください。
まずは、お話を聞かせていただくだけでも大丈夫です。

無料で相談する
コバ

コバ

AI活用 / Web制作 / 業務自動化支援

中小企業さま向けに「お手頃に・早く・成果が出る」開発支援を行っています。AI・Web・自動化の3分野を、まとめてサポートしています。

この記事をシェアする

一覧へ戻る