Nginx Proxy Manager で1台のサーバーに複数のサービスを載せる
1台のサーバーで複数のプロジェクトを動かすと、いずれ 80 番と 443 番のポートにぶつかります。そのポートを待ち受けできるのは一つのプロセスだけだからです。Selectel ブログの Habr の記事は、Nginx Proxy Manager でこの問題を解決する方法を段階的に示しています。
著者はまず問題を説明します。特権ポート、「1ポートに1リスナー」という制約、フロントエンドとバックエンドをポートで分けたときの CORS の問題、HTTPS がないことです。リバースプロキシは仲介役として、ドメインとパスに応じてトラフィックを振り分けます。さらに、ファイアウォールで開ける必要があるのは 22、80、443 番だけになります。
検証環境は、2 vCPU・2GB RAM・40GB NVMe の VDS、Ubuntu 24.04、公式リポジトリから入れた Docker です。docker network create proxy でネットワークを作り、データと証明書用のボリュームを付けて jc21/nginx-proxy-manager コンテナを起動します。81 番の管理画面を 127.0.0.1 にだけ bind し、SSH トンネル経由でアクセスする点が良いと思いました。
次に、プロキシホストを設定します。Forward Hostname にはコンテナ名を指定し、SSL 証明書は SSL タブで紐づけます。テストには traefik/whoami を使っています。アプリがホスト上で直接動いている場合も別に扱われています。Docker ネットワークのゲートウェイアドレスは docker network inspect で取得し、プロキシを迂回してアプリに直接届かないようファイアウォールを設定します。
気になる点もあります。例では異なるドメインが混ざっており、イメージが latest タグのため、時間がたつと再現性が落ちるかもしれません。それでも、nginx の設定を手で編集せずに複数のサービスを家や VDS で運用したい人には良い出発点です。
出典:Habr(Selectel ブログ)
著者はまず問題を説明します。特権ポート、「1ポートに1リスナー」という制約、フロントエンドとバックエンドをポートで分けたときの CORS の問題、HTTPS がないことです。リバースプロキシは仲介役として、ドメインとパスに応じてトラフィックを振り分けます。さらに、ファイアウォールで開ける必要があるのは 22、80、443 番だけになります。
検証環境は、2 vCPU・2GB RAM・40GB NVMe の VDS、Ubuntu 24.04、公式リポジトリから入れた Docker です。docker network create proxy でネットワークを作り、データと証明書用のボリュームを付けて jc21/nginx-proxy-manager コンテナを起動します。81 番の管理画面を 127.0.0.1 にだけ bind し、SSH トンネル経由でアクセスする点が良いと思いました。
次に、プロキシホストを設定します。Forward Hostname にはコンテナ名を指定し、SSL 証明書は SSL タブで紐づけます。テストには traefik/whoami を使っています。アプリがホスト上で直接動いている場合も別に扱われています。Docker ネットワークのゲートウェイアドレスは docker network inspect で取得し、プロキシを迂回してアプリに直接届かないようファイアウォールを設定します。
気になる点もあります。例では異なるドメインが混ざっており、イメージが latest タグのため、時間がたつと再現性が落ちるかもしれません。それでも、nginx の設定を手で編集せずに複数のサービスを家や VDS で運用したい人には良い出発点です。
出典:Habr(Selectel ブログ)
コメント 0
最初のコメントをどうぞ。どの言語でも大丈夫です。
ログインしてコメント