「画像が表示されない!」その原因、パスの設定ミスかもしれません。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、設定ファイルの構造とバーチャルホストについて学びました。
複数のドメインをさばけるようになり、いよいよサーバーらしくなってきましたね。
さて、Webサーバーの基本機能といえば、「HTMLファイルや画像ファイルをブラウザに届けること」です。
簡単そうに聞こえますが、Nginxの設定には「初見殺しの罠」が潜んでいます。
「設定通りに書いたはずなのに、なぜか404 Not Foundになる」「CSSが読み込まれない」…そんな経験はありませんか?
先生、助けてください!
サイトのトップページは表示されるんですけど、/images/logo.png にアクセスすると404エラーになるんです。root ってやつを設定したはずなんですけど…。
あと、ネットで調べたら alias っていうのもあって、どっちを使えばいいのかパニックです!
落ち着いて、コウ君。root と alias の違いは、現役のエンジニアでも時々間違える「Nginxの最難関ポイント」の一つなの。
でも、仕組みさえ図でイメージできれば簡単よ。
今回は、Webサーバーの基本である「ファイルを正しく配信する方法」と、モダンなWebアプリに必須のテクニックをマスターしましょう!
本記事では、ドキュメントルートの定義、root と alias の決定的な違い、インデックスファイルの設定、そしてSPA(シングルページアプリケーション)やWordPressで必須となる try_files について徹底解説します。
🚀 Nginx基本講座(全8回)カリキュラム
現在地:【第3回】静的コンテンツ配信の極意。root/aliasの使い分けとインデックス設定
- 【第1回】Webサーバーの覇者。Nginxのアーキテクチャ解説と最新インストール完全ガイド
- 【第2回】設定ファイルの解剖学。nginx.confの構造とバーチャルホストの基本
- 【第3回】静的コンテンツ配信の極意。root/aliasの使い分けとインデックス設定
- 【第4回】リバースプロキシの構築。APサーバーへの転送とロードバランシング
- 【第5回】HTTPS化とHTTP/3(QUIC)。Let’s EncryptでのSSL証明書自動更新
- 【第6回】鉄壁の守り。アクセス制限、Basic認証、Rate LimitingによるDDoS対策
- 【第7回】爆速化チューニング。Gzip圧縮、ブラウザキャッシュ、バッファサイズ最適化
- 【第8回】ログ解析と運用監視。アクセスログのカスタム設定とDockerでの運用
第1章:基本の「root」ディレクティブ
Webサーバーにおける「ドキュメントルート」とは、Webサイトのトップページ(/)が、サーバー上のどのディレクトリ(フォルダ)に対応するかを指定するものです。
Nginxでは root ディレクティブを使用します。
基本的な使い方
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
}
この設定の場合、URLとサーバー上のファイルパスの関係は以下のようになります。
- URL:
http://example.com/index.html - 実体:
/var/www/html/index.html
つまり、「rootで指定したパス + URLのパス」 が、最終的なファイルの場所になります。
非常にシンプルですね。
特定のディレクトリだけ場所を変える
画像ファイルだけ別のディスクに置きたい場合などは、location ブロックを追加して root を再定義します。
location /images/ {
root /mnt/storage;
}
さて、ここで問題です。http://example.com/images/photo.jpg にアクセスした場合、Nginxはどこのファイルを探しに行くでしょうか?
正解: /mnt/storage/images/photo.jpg
「え? /mnt/storage/photo.jpg じゃないの?」と思った方。
それが root の仕様であり、多くの人がハマる罠です。root はあくまで「根っこ」を指定するものであり、URLの /images/ 部分もそのまま後ろにくっついてしまうのです。
第2章:最大の罠「root」と「alias」の違い
「URLの /images/ 部分を取り除いて、/mnt/storage/ の直下を見に行かせたい」。
そんな時に使うのが alias ディレクティブです。
比較:root vs alias
| ディレクティブ | 動作イメージ | 計算式 |
|---|---|---|
| root | 指定したパスを付け足す | root + URI |
| alias | 指定したパスに置き換える | alias + (URIからlocation部分を除いたもの) |
aliasを使った設定例
location /images/ {
alias /mnt/storage/;
}
この場合、http://example.com/images/photo.jpg へのアクセスは以下のように解決されます。
- URLから
/images/部分がカットされる。 - 残った
photo.jpgが/mnt/storage/に結合される。 - 最終パス:
/mnt/storage/photo.jpg
これなら、ディレクトリ構造を変えずにURLだけ見せ方を変えることができます。
⚠️ プロの注意点:alias使用時の「スラッシュ」問題
alias を使うときは、location の末尾と alias の末尾のスラッシュの有無を合わせるのが鉄則です。
良い例:
location /images/ { alias /path/to/; } (両方あり)
location /images { alias /path/to; } (両方なし)
悪い例:
location /images/ { alias /path/to; }
これだとパス結合がおかしくなり、予期せぬエラーやセキュリティリスクを生むことがあります。
第3章:インデックスファイルとAutoindex
ディレクトリ(/ など)にアクセスされた時、どのファイルを表示するかを決めるのが index ディレクティブです。
1. indexの優先順位
index index.html index.htm index.php;
左から順番に探します。index.html があればそれを表示し、なければ index.htm、それもなければ index.php を探します。
どれも見つからない場合は 403 Forbidden エラーになります。
2. ファイル一覧を表示する「autoindex」
開発中のサーバーや、社内のファイル共有サーバーなどでは、「ファイルの一覧(ディレクトリの中身)」をそのまま表示させたいことがあります。
その場合は autoindex を有効にします。
location /files/ {
root /var/www/shared;
autoindex on; # 一覧表示を有効化
autoindex_exact_size off; # ファイルサイズを KB/MB/GB で表示
autoindex_localtime on; # タイムスタンプを現地時間で表示
}
こうすると、ブラウザで /files/ にアクセスした時、ファイル一覧がリスト表示され、クリックしてダウンロードできるようになります。
セキュリティ警告:
一般公開するWebサイトでは、意図せず内部ファイルが見えてしまうリスクがあるため、autoindex は必ず off(デフォルト)にしておきましょう。
第4章:エラーページをカスタマイズする
Nginxのデフォルトのエラー画面(404 Not Foundや500 Internal Server Error)は、白背景に黒文字だけの素っ気ないものです。
これをサイトのデザインに合わせたオリジナルの画面に変更しましょう。
error_pageディレクティブ
server {
...
# 404エラー用
error_page 404 /404.html;
# 500系エラー用(まとめて指定可能)
error_page 500 502 503 504 /50x.html;
location = /404.html {
root /usr/share/nginx/html;
}
location = /50x.html {
root /usr/share/nginx/html;
}
}
仕組み:
- 404エラーが発生する。
- Nginxは内部的に
/404.htmlへアクセスを転送(リダイレクトではない)する。 location = /404.htmlの設定に従ってファイルを表示する。
これにより、URLは変わらずに中身だけカスタムエラーページを表示できます。
jsonでエラーを返す(APIサーバー向け)
Web APIの場合、HTMLではなくJSONでエラーを返したいことがあります。
error_page 404 = @json_error;
location @json_error {
default_type application/json;
return 404 '{"error": "Not Found", "code": 404}';
}
@ で始まる名前付きロケーション(Named Location)を使うのがテクニックです。
第5章:現代Webの必須知識「try_files」
WordPressや、React/VueなどのSPA (Single Page Application) をNginxで動かす場合、必ずと言っていいほど登場するのが try_files です。
これが理解できていないと、「トップページは出るけど下層ページが全部404になる」という現象に悩まされます。
try_filesの構文
try_files file1 file2 ... uri;
「左から順にファイルが存在するかチェックし、最初に見つかったものを返す。全部なければ最後の引数(URI)へ転送する」という動きをします。
ケーススタディ1:WordPressの設定
WordPressは、すべてのリクエストを index.php に集めて処理させたい(フロントコントローラーパターン)システムです。
location / {
try_files $uri $uri/ /index.php?$args;
}
動作解説:
$uri: リクエストされたファイル(画像やCSSなど)が実在すれば、それを返す。$uri/: リクエストされたディレクトリが実在すれば、そこを探す。/index.php?$args: 上記がなければ、全てindex.phpに処理を投げる。
ケーススタディ2:React/Vue (SPA) の設定
SPAでは、URLが変わっても実際には index.html 1枚だけで動いています(クライアントサイド・ルーティング)。
そのため、サーバー上に実在しないパス(例: /user/123)にアクセスされたら、404ではなく index.html を返す必要があります。
location / {
root /var/www/my-app;
index index.html;
try_files $uri $uri/ /index.html;
}
これがないと、ページをリロードした瞬間に404エラーになってしまいます。
第6章:トラブルシューティング(MIMEタイプと権限)
最後に、よくあるトラブルとその解決策を紹介します。
1. CSSが適用されない(MIMEタイプ問題)
「デザインが崩れて文字だけになる」場合、ブラウザの開発者ツールを見ると「Resource interpreted as Stylesheet but transferred with MIME type text/plain」という警告が出ていることがあります。
これはNginxがCSSファイルを「ただのテキスト」として送ってしまっているのが原因です。
http ブロックに以下の記述があるか確認してください。
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
...
}
mime.types ファイルには、「.css は text/css」「.png は image/png」といった対応表が書かれています。
これを読み込むことで、正しい種類としてファイルを配信できます。
2. 403 Forbidden が出る(権限問題)
ファイルは存在するのに 403 エラーになる場合、原因の9割は「パーミッション(権限)」です。
- ファイルの権限: Nginxの実行ユーザー(通常
nginx)が読み取れる必要があります(644など)。 - ディレクトリの権限: 実行権限(x)が必要です(755など)。
- SELinux: RHEL系OSの場合、SELinuxがブロックしている可能性があります。
ls -Zでコンテキストを確認し、必要ならchconコマンドで修正するか、一時的にSELinuxをPermissiveにして切り分けます。
まとめ:静的配信を制する者はNginxを制す
お疲れ様でした!
今回は、Nginxの基本であるファイル配信について深く掘り下げました。
今回の重要ポイント:
rootはパスを「結合」し、aliasはパスを「置換」する。aliasを使うときは末尾のスラッシュに注意する。- SPAやWordPressには
try_filesが必須。 - エラーページは
error_pageでサイトに合わせてカスタマイズする。
これで、Webサイトを公開するための基礎力は完璧です。
しかし、現代のWebシステムでは、Nginx単体で完結することは稀です。
後ろにいるPHPやPython、Node.jsなどのアプリケーションサーバーと連携して初めて、動的なサービスが提供できます。
次回、第4回は「リバースプロキシの構築。APサーバーへの転送とロードバランシング」です。
Nginxの真骨頂である「プロキシ機能」を使って、バックエンドサーバーへリクエストを中継する方法や、負荷分散(ロードバランサー)としての使い方をマスターします。
ここから一気に本格的なインフラ構築に入ります。お楽しみに!
▼ Nginxの実践環境を手に入れる ▼
Webサイトを公開するなら
「VPS」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」

コメント