はじめに
Nginx(エンジンエックス)は、Webサーバとしても、リバースプロキシとしても、ロードバランサとしても使える“交通整理係”のような存在です。アプリケーション(Node.js / Go / Java など)を作ると、最後はだいたい「外からアクセスできるように公開する」工程に行き着きます。そのときに、アプリを直接インターネットへ晒すのではなく、手前にNginxを置いて「入口」を作るのが定番です。
ただ、最初に詰まりやすいのもNginxです。設定ファイルの書き方が独特で、ディレクティブ(設定項目)の意味が分からないと、エラーが出ても修正ポイントを見つけづらい。そこでこの記事では、いきなり難しい構成に行かずに、Nginxの基本機能を最短距離で体感することを目的にします。
ゴールは次の2つです。
- 静的ファイルをNginxで配信できる
- アプリ(例:Go/Node)をNginxでリバースプロキシできる
そして、最後に「次に何をやると伸びるか」も、別テーマで2つ提示します。
座学
1) Nginxは何をしているのか
Nginxが受けるのは基本的にHTTPリクエストです。受けたリクエストを、状況に応じて次のどれかへ振り分けます。
- ファイルとして返す(静的配信)
/index.htmlや画像、CSS、JSなどをディスクから読み、レスポンスとして返す。 - 別のサーバへ渡す(リバースプロキシ)
/apiへのアクセスはアプリサーバへ、/は静的配信へ…のように役割を分ける。 - 複数へ分配する(ロードバランシング)
同じアプリが2台/3台あるとき、どこへ投げるか決める。
入門で押さえるべきポイントは「静的配信」と「リバースプロキシ」です。ここが分かると、Nginxが“入口として機能する”感覚がつかめます。
2) server と location の読み方
Nginx設定の中心はだいたいこの形です。
http { ... }:HTTP全体の設定server { ... }:仮想ホスト(このドメイン/このポートの入口)location { ... }:パスごとの振り分け
大雑把に言うと、
- server = 「どのホスト名/ポートに来た通信か」
- location = 「URLパスが何から始まるか」
です。例えば「/api だけアプリに流して、他は静的ファイルを返す」は、まさに location の仕事です。
3) root と try_files は入門の最重要セット
静的配信で必ず出てくるのが root と try_files。
root:ファイルを探す基準ディレクトリtry_files:指定した候補順にファイルを探し、見つからなければ別の扱いにする
SPA(React/Vueなど)を配信するときに「ページ更新すると404になる」問題は、try_files を知らないとハマります。入門のうちに触れておくと後が楽です。
4) proxy_pass の最低限の勘所
リバースプロキシは proxy_pass が主役です。
- Nginxが受けたリクエストを、アプリサーバ(例:
http://127.0.0.1:3000)へ転送します - その際、ヘッダ(HostやX-Forwarded-Forなど)を付け替えたり追加したりします
入門では、まず “動く” を優先して、最低限のヘッダ付与を覚えるのが良いです。
ハンズオン
ここでは、ローカル(またはLinuxサーバ)で「静的配信」と「リバースプロキシ」を実際に作ります。OSはUbuntu系でもRHEL系でも概ね同じ考え方です。
0) 前提:Nginxの起動確認
インストール後、Nginxが動いているかを確認します。
- 設定テスト:
nginx -t - 起動:
systemctl start nginx - ステータス:
systemctl status nginx
ブラウザで http://localhost(サーバならIP)にアクセスして、Nginxのデフォルトページが出ればOKです。
1) 静的配信:HTMLを置いて返す
まずは“ファイルを返すだけ”を作ります。
(1) 配信ディレクトリを用意
例:/var/www/nginx-beginner
index.htmlを作成して、簡単な文言を入れます
例:「Hello Nginx」「静的配信できた」など
(2) サーバ設定を書く
Nginxは環境によって設定の置き場所が違いますが、Debian/Ubuntuなら sites-available / sites-enabled がよく使われます。
例:/etc/nginx/sites-available/beginner.conf
- 80番で待ち受け
rootを/var/www/nginx-beginnerにするindexをindex.htmlにする
これで http://localhost/ が index.html を返せるようになります。
(3) SPA想定の try_files を追加(おすすめ)
もし将来 React/Vue のビルド成果物を置くなら、次を入門のうちに体験しておくと強いです。
location / { try_files $uri $uri/ /index.html; }
これで、/about みたいなパスでも index.html にフォールバックできます(ルーティングをフロント側で解決するため)。
2) リバースプロキシ:アプリへ転送する
次に、アプリサーバを立てて、Nginxから中継します。
(1) アプリの例(どれでもOK)
- Goなら
:8080で “Hello from App” を返す - Nodeなら
:3000で同様
ここでは「アプリが直接叩ける状態」を先に作ります。
例:curl http://127.0.0.1:8080 でレスポンスが返ってくる状態。
(2) Nginxで /api をアプリへ流す
Nginx側の server の中に次を作ります。
location /api/ { proxy_pass http://127.0.0.1:8080/; }
最初はこれだけでも動きます。加えて、実運用に近づける最低限としてヘッダを付けます。
proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;
これで、アプリ側が「元のクライアント情報」を拾いやすくなります。
(3) 動作確認
curl http://localhost/api/で、アプリの返答が来ることhttp://localhost/は静的HTMLが返ること
この時点で「Nginxが入口になって、パスで振り分けている」構造が完成です。ここが掴めれば、Nginxの学習は一気に進みます。
3) 入門で一度だけ触れておくと強い:ログ
詰まったらログです。Nginxはログが素直です。
- アクセスログ:どのリクエストが来たか
- エラーログ:なぜ返せなかったか、上流が死んでるか等
典型的な詰まりポイントは次の3つです。
nginx -tは通るのに期待通り動かない →locationのマッチが違う- 静的ファイルが404 →
rootのパスが違う、権限がない - リバースプロキシが502 → アプリが落ちてる / ポートが違う /
proxy_passが違う
この3つをログで切り分けられるだけで、入門としては十分“戦える”状態です。
まとめ
Nginx入門の最短ルートは、複雑な理屈より先に「入口としての役割」を体で覚えることです。この記事では、
root+try_filesで 静的配信location+proxy_passで リバースプロキシ- ログで 切り分け
という、実務で最も登場頻度が高い基本を押さえました。
ここまでできれば、Nginxは「なんか難しい設定ファイル」ではなく、「通信の流れを設計する道具」に変わります。次は、扱うトラフィックが増える・要件が増える場面で、より強い武器が必要になります。
コメントを残す