UbuntuのNginxでリバースプロキシを設定する方法

サーバー構築

「自分のアプリをVPSで公開したいけど、直接ポート3000を外に開けて大丈夫?」——この疑問を持ったことがある方は多いと思います。結論から言うと、バックエンドアプリを直接外部に公開するのは避け、Nginxをリバースプロキシとして前段に置くのがベストプラクティスです。本記事では Ubuntu 24.04 LTS に Nginx をインストールし、ポート80でリクエストを受け取ってバックエンドに転送する設定を、実際にDockerコンテナで動かした実データをもとに解説します。

この記事のポイント

  • Ubuntu 24.04 LTS に apt install nginx で nginx 1.24.0 が入る(実測)
  • リバースプロキシの設定ファイルは /etc/nginx/sites-available/ に置いてシンボリックリンクで有効化する
  • proxy_set_header で X-Real-IP・X-Forwarded-For を付加し、バックエンドがクライアントのIPを取得できるようにする
  • upstream ブロックを使えば複数バックエンドへのロードバランシングも設定できる
  • 設定変更後は必ず nginx -t で構文チェック → systemctl reload nginx の手順を踏む

目次

  1. リバースプロキシとは何か
  2. Nginx のインストール
  3. 基本的なリバースプロキシ設定
  4. upstream ブロックで複数バックエンドに対応する
  5. 設定確認とリロード
  6. よくあるエラーと解決策
  7. まとめ

リバースプロキシとは何か

リバースプロキシとは、クライアント(ブラウザや curl)からのリクエストを受け取り、バックエンドのアプリサーバーに代わりに転送するサーバーのことです。

Nginx リバースプロキシの構成図
Nginx リバースプロキシの構成図

図のように、クライアントはNginxにだけアクセスします。バックエンドアプリ(Node.js の ポート3000 や Python の ポート8000 など)は外部に直接公開せず、Nginx経由でのみ到達できる構成にします。これにより:

  • バックエンドアプリを外部に直接さらさなくて済む(セキュリティ向上)
  • SSLターミネーション(HTTPSの処理)をNginxで一元管理できる
  • 複数のアプリを1台のサーバーで動かし、パスやドメインで振り分けられる

前提環境

  • OS: Ubuntu 24.04 LTS(本記事はDockerコンテナ ubuntu:24.04 で実証)
  • Nginx バージョン: 1.24.0(apt からインストール)
  • バックエンド: 任意のアプリ(Node.js / Python / Ruby on Rails など)
  • 検証日: 2026-06-13

Nginx のインストール

Ubuntu 24.04 LTS では、apt パッケージマネージャーで Nginx を簡単にインストールできます。インストール前に apt update を忘れずに実行してください(これをやらないと古いバージョンのインデックスから取得してしまいます)。




ubuntu@vps: ~
$ sudo apt update
Hit:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease

Fetched 39.6 MB in 6s (6562 kB/s)
Reading package lists… Done
$ sudo apt install -y nginx
Reading package lists… Done
Building dependency tree… Done

Setting up nginx-common (1.24.0-2ubuntu7.11) …
Setting up nginx (1.24.0-2ubuntu7.11) …
$ nginx -v
nginx version: nginx/1.24.0 (Ubuntu)
apt install nginx の実行ログと nginx -v の出力
apt install nginx の実行ログと nginx -v の出力

実際にDockerコンテナ(ubuntu:24.04)で実行したところ、nginx 1.24.0-2ubuntu7.11 がインストールされました。インストール直後に nginx -t を実行して設定ファイルの構文チェックも行っておきましょう。




ubuntu@vps: ~
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Ubuntu 22.04 と 24.04 では nginx のバージョンが異なります。以下は両方の環境で apt-cache policy nginx を実行して比較した実測データです。

Ubuntu 22.04 vs 24.04 の Nginx バージョン比較(実測)
Ubuntu 22.04 vs 24.04 の Nginx バージョン比較(実測)

Ubuntu 22.04 では nginx 1.18.0、Ubuntu 24.04 では nginx 1.24.0 が提供されています(2026-06-13時点の apt-cache policy 実測値)。新規にVPSを借りるなら Ubuntu 24.04 LTS を選びましょう。サポート期間が2029年4月まであり、2年長く使えます。

Nginx のディレクトリ構成を確認する

Nginx のインストールが完了したら、設定ファイルの構成を把握しておきましょう。Ubuntu の Nginx パッケージは次のようなディレクトリ構成を使います。




ubuntu@vps: ~
$ ls /etc/nginx/
conf.d/ modules-available/ nginx.conf sites-available/
mime.types modules-enabled/ sites-enabled/ snippets/

リバースプロキシの設定を追加する際は、sites-available/ に設定ファイルを作成し、sites-enabled/ にシンボリックリンクを張る方式を使います。これにより、設定を無効化したいときにリンクを削除するだけで済み、設定ファイル本体は残せます。

基本的なリバースプロキシ設定

バックエンドアプリ(例:ポート3000で動くNode.jsアプリ)へのリバースプロキシ設定を作ります。

手順1:設定ファイルを作成する




ubuntu@vps: ~
$ sudo nano /etc/nginx/sites-available/myapp.conf

以下の内容を記述します。




/etc/nginx/sites-available/myapp.conf
server {
listen 80;
server_name your-domain.com; # ドメインまたはIPアドレス

location / {
proxy_pass http://127.0.0.1:3000; # バックエンドのURL
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;
}
}

各ディレクティブの意味を押さえておきましょう:

ディレクティブ 説明
proxy_pass 転送先のバックエンドURL。http://127.0.0.1:3000 のように指定する
proxy_set_header Host 元リクエストの Host ヘッダーをバックエンドに渡す
proxy_set_header X-Real-IP クライアントの実IPをバックエンドに渡す。アクセスログに実IPを残したい場合に必要
proxy_set_header X-Forwarded-For プロキシを経由してきたIPアドレスのリスト。$proxy_add_x_forwarded_for で既存リストに追記
proxy_set_header X-Forwarded-Proto 元リクエストのプロトコル(http/https)を伝える。HTTPS対応時に重要

注意:server_name の設定

server_name に設定するのは、このサーバーに向いているドメインまたはIPアドレスです。VPSを借りたばかりでドメインがない場合は、VPSのグローバルIPアドレス(例: 203.0.113.10)を入れてください。テスト用なら server_name _;(アンダースコア)でデフォルトサーバーとして全リクエストをキャッチすることもできます。

手順2:設定を有効化する(シンボリックリンク)




ubuntu@vps: ~
$ sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
# デフォルト設定と競合する場合は削除する
$ sudo rm /etc/nginx/sites-enabled/default

手順3:設定を確認してリロードする




ubuntu@vps: ~
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl reload nginx
nginx -t と curl でのプロキシ動作確認(実測)
nginx -t と curl でのプロキシ動作確認(実測)

上のスクリーンショットは、実際に Docker コンテナ内で nginx を設定してバックエンドサーバー(python3 -m http.server 8080)へのリバースプロキシを確認したものです。curl -s -I http://localhost/ で HTTP 200 が返り、Server: nginx/1.24.0 (Ubuntu) が確認できました。

Playwright で撮影:Nginx リバースプロキシ経由のレスポンス確認
Playwright で撮影:Nginx リバースプロキシ経由のレスポンス確認

upstream ブロックで複数バックエンドに対応する

アプリのスケールアウト(同じアプリを複数台のサーバーで動かす)や、同一サーバー上でポートを変えて複数プロセスを立てるケースでは、upstream ブロックを使います。

upstream ブロックの設定と動作確認(実測)
upstream ブロックの設定と動作確認(実測)



/etc/nginx/sites-available/myapp.conf
upstream backend_servers {
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}

server {
listen 80;
server_name your-domain.com;

location / {
proxy_pass http://backend_servers; # upstream 名を指定
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_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}

実際に Docker コンテナ内で2つのバックエンドサーバー(ポート8081・8082)を起動し、upstream でラウンドロビン分散させる設定を動かしました。片方のバックエンドが停止した場合、Nginx は自動的にもう片方にフェイルオーバーします

proxy_connect_timeoutproxy_send_timeoutproxy_read_timeout を設定しておくことで、バックエンドが応答しない場合にNginxが無限に待ち続けるのを防げます。

パスベースの振り分け(location ごとに異なるバックエンド)

1台のNginxで複数のアプリを動かしたい場合(例:/api/ は Node.js、/ は静的ファイル)は、location ブロックを複数使います。




/etc/nginx/sites-available/myapp.conf
server {
listen 80;
server_name your-domain.com;

location /api/ {
proxy_pass http://127.0.0.1:3000; # API サーバー
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location / {
root /var/www/html; # 静的ファイル
index index.html;
}
}

location マッチの優先順位

location のマッチは「最も長いプレフィックス」が優先されます。/api// より長いので、/api/anything へのリクエストは必ず API サーバーに転送されます。location の記述順は関係ないので安心してください。

設定確認とリロード

設定ファイルを変更するたびに必ずこの手順を踏んでください。正直、nginx -t を飛ばして systemctl reload を実行するのは厳禁です。構文エラーがあると nginx が起動できなくなり、サービスが止まります。




ubuntu@vps: ~
# 1. 構文チェック(必須)
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# 2. 設定をリロード(サービスを止めずに再読み込み)
$ sudo systemctl reload nginx

# 3. サービス状態を確認
$ sudo systemctl status nginx
● nginx.service – A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
Active: active (running) since Sat 2026-06-13 14:00:00 JST; 5min ago

reload vs restart の違い

systemctl reload nginx は現在の接続を切らずに設定を再読み込みします(ゼロダウンタイム)。systemctl restart nginx はプロセスを再起動するため、処理中のリクエストが切断されます。設定変更には基本的に reload を使ってください。

よくあるエラーと解決策

① 502 Bad Gateway が返る

バックエンドアプリが起動していない、またはポートが間違っている場合に発生します。




ubuntu@vps: ~
# エラーログを確認する
$ sudo tail -f /var/log/nginx/error.log
2026/06/13 14:01:23 [error] 1234#0: *1 connect() failed (111: Connection refused)
while connecting to upstream, client: 203.0.113.1, server: localhost,
request: “GET / HTTP/1.1”, upstream: “http://127.0.0.1:3000/”,

# バックエンドが起動しているか確認
$ sudo ss -tlnp | grep 3000
(何も表示されない = バックエンドが起動していない)

Connection refused (111) が出ていれば、バックエンドアプリが起動していないか、ポートが一致していません。proxy_pass に設定したポートでアプリが起動しているか確認してください。

② nginx -t で「conflicting server name」エラーが出る

同じ server_name を持つ設定ファイルが複数ある場合に発生します。




ubuntu@vps: ~
$ sudo nginx -t
nginx: [warn] conflicting server name “your-domain.com” on 0.0.0.0:80
ignored /etc/nginx/sites-enabled/default; first found in
/etc/nginx/sites-enabled/myapp.conf

# デフォルト設定を無効化する
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

③ 413 Request Entity Too Large

リクエストボディが大きすぎる(ファイルアップロード等)場合に発生します。client_max_body_size を設定してください。




/etc/nginx/sites-available/myapp.conf
server {
listen 80;
server_name your-domain.com;
client_max_body_size 50M; # 50MB まで許可(デフォルト: 1MB)

location / {
proxy_pass http://127.0.0.1:3000;
# … 省略
}
}

④ タイムアウトが発生する(504 Gateway Timeout)

バックエンドの処理に時間がかかる場合、デフォルトのタイムアウト値(60秒)を超えると 504 が返ります。




/etc/nginx/sites-available/myapp.conf
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_connect_timeout 10s; # バックエンドへの接続タイムアウト
proxy_send_timeout 60s; # リクエスト送信のタイムアウト
proxy_read_timeout 120s; # レスポンス受信のタイムアウト
}

まとめ

今回は Ubuntu 24.04 LTS で Nginx をリバースプロキシとして設定する方法を、実際にDockerコンテナで動かしたデータをもとに解説しました。

この記事のまとめ

  • Ubuntu 24.04 の apt には nginx 1.24.0 が収録されている(apt install nginx でインストール)
  • 設定ファイルは /etc/nginx/sites-available/ に作成し、ln -ssites-enabled/ に有効化する
  • proxy_pass でバックエンドのURL を指定するだけで基本的なリバースプロキシが完成する
  • proxy_set_header X-Real-IPX-Forwarded-For は必ず設定してクライアントIPを伝える
  • upstream ブロックで複数バックエンドへの負荷分散・フェイルオーバーができる
  • 設定変更後は nginx -t で構文チェック → systemctl reload nginx の手順を忘れずに
  • 502: バックエンド未起動、504: タイムアウト不足、413: ボディサイズ制限がよくある落とし穴

次のステップとして、Let’s Encrypt で無料SSL証明書を取得し、HTTPS(443番ポート)対応のリバースプロキシ設定に挑戦してみてください。VPSでNginxを動かすならまずVPSの選び方も重要です。

コメント

タイトルとURLをコピーしました