「自分のアプリを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の手順を踏む
目次
リバースプロキシとは何か
リバースプロキシとは、クライアント(ブラウザや curl)からのリクエストを受け取り、バックエンドのアプリサーバーに代わりに転送するサーバーのことです。

図のように、クライアントは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 を忘れずに実行してください(これをやらないと古いバージョンのインデックスから取得してしまいます)。
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)

実際にDockerコンテナ(ubuntu:24.04)で実行したところ、nginx 1.24.0-2ubuntu7.11 がインストールされました。インストール直後に 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 では 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 パッケージは次のようなディレクトリ構成を使います。
conf.d/ modules-available/ nginx.conf sites-available/
mime.types modules-enabled/ sites-enabled/ snippets/
リバースプロキシの設定を追加する際は、sites-available/ に設定ファイルを作成し、sites-enabled/ にシンボリックリンクを張る方式を使います。これにより、設定を無効化したいときにリンクを削除するだけで済み、設定ファイル本体は残せます。
基本的なリバースプロキシ設定
バックエンドアプリ(例:ポート3000で動くNode.jsアプリ)へのリバースプロキシ設定を作ります。
手順1:設定ファイルを作成する
以下の内容を記述します。
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:設定を有効化する(シンボリックリンク)
# デフォルト設定と競合する場合は削除する
$ sudo rm /etc/nginx/sites-enabled/default
手順3:設定を確認してリロードする
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

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

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

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_timeout・proxy_send_timeout・proxy_read_timeout を設定しておくことで、バックエンドが応答しない場合にNginxが無限に待ち続けるのを防げます。
パスベースの振り分け(location ごとに異なるバックエンド)
1台のNginxで複数のアプリを動かしたい場合(例:/api/ は Node.js、/ は静的ファイル)は、location ブロックを複数使います。
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 が起動できなくなり、サービスが止まります。
$ 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 が返る
バックエンドアプリが起動していない、またはポートが間違っている場合に発生します。
$ 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 を持つ設定ファイルが複数ある場合に発生します。
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 を設定してください。
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 が返ります。
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 -sでsites-enabled/に有効化する proxy_passでバックエンドのURL を指定するだけで基本的なリバースプロキシが完成するproxy_set_header X-Real-IPとX-Forwarded-Forは必ず設定してクライアントIPを伝えるupstreamブロックで複数バックエンドへの負荷分散・フェイルオーバーができる- 設定変更後は
nginx -tで構文チェック →systemctl reload nginxの手順を忘れずに - 502: バックエンド未起動、504: タイムアウト不足、413: ボディサイズ制限がよくある落とし穴
次のステップとして、Let’s Encrypt で無料SSL証明書を取得し、HTTPS(443番ポート)対応のリバースプロキシ設定に挑戦してみてください。VPSでNginxを動かすならまずVPSの選び方も重要です。


コメント