こんにちは、AIシステムズです。
この記事は、代表コバが現場で対応してきたnginx運用の知見をもとに、AIを活用して構成・執筆し、弊社にて最終チェックを行ったものです。
「画像やCSSファイルだけが404になる」「PDFをアップロードしたが直リンクが開けない」「PHPは動くが静的ファイルだけ404」——nginx運用で頻発する代表的なトラブルです。原因はrootディレクティブの指定ミス、tryfilesの設定漏れ、パーミッションの3つに集約されます。
- nginxで静的ファイルが404になる主要原因
rootとaliasの使い分けtry_filesの正しい記述- パーミッションとSELinuxの落とし穴
- WordPressサイト特有の事例
目次
- 静的ファイル404の典型パターン
- 原因を切り分ける手順
- rootとaliasの違いと使い分け
- try_filesの記述
- パーミッション・SELinuxの確認
- こういうサイトに向いている/向いていない
- 再発防止チェックリスト
静的ファイル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導入、画像配信の最適化について、具体的な状況をふまえた相談を承っています。費用感だけ知りたい方も、お気軽にご相談ください。