Ubuntu Weekly Recipe

第892回Nginx Proxy Managerでリバースプロキシを効率よく管理しよう

第881回では、家庭内のサーバーをVPN越しに公開できるリバースプロキシPangolinを紹介しました。今回はもっとシンプルなリバースプロキシ管理ソフトである、Nginx Proxy Managerを紹介します。

リバースプロキシの必要性

はるか昔、WebサイトはApacheなどのWebサーバー上に直接デプロイするのが一般的でした。ですが現在では、アプリケーションをホストするWebサーバーの前段にリバースプロキシを置く、二段階の構成が一般的となっています。

これはアプリケーションの多くが、コンテナやVMといった独立した環境でホストされるようになってきたことや、フレームワークが独自のアプリケーションサーバーを持っていることに起因しています。またアクセス制御、ロードバランス、SSL証明書の管理などを考慮すると、こうした処理はアプリケーション本体から切り離し、前段のリバースプロキシに一任したほうがメンテナンス性も向上するためです。

そしてリバースプロキシとしてよく利用されているのが、高速なWebサーバーとしても有名なnginxです。nginx + コンテナ/VMという構成は、今時のWebアプリの構成の鉄板と言えるでしょう。

Nginx Proxy Managerとは

nginx + Docker/LXD/VMという構成を使い、複数のアプリを動かしているという人も多いのではないでしょうか。経験者であれば理解してもらえると思いますが、この構成のデメリットは、なんといっても設定の面倒さです。nginxとDockerを使ってWallabagを動かした第867回を参照するとわかるように、⁠SSL証明書の取得」「nginxの設定の作成」という作業を、プロキシ先が増えるごとに行わなくてはなりません。

最初の1回だけならともかく、頻繁にコンテナの起動と削除を繰り返す開発環境では、やってられないでしょう。アプリ毎にアクセス制限をかけようなどと思ったら、さらに面倒なことになります。

そこでnginxの設定ファイルのコピペに疲れた貴方へお勧めしたいのが、Webベースでリバースプロキシを管理でき、SSL証明書の自動取得にも対応しているNginx Proxy Managerです。

Nginx Proxy Managerのデプロイ

Nginx Proxy Manager(以下NPM)も、昨今のアプリの例に漏れず、Dockerでデプロイするのが簡単です。まずはいつも通り、DockerとComposeをインストールしましょう。

$ sudo apt install -U -y docker.io docker-compose-v2

必須ではありませんが、NPMとアプリケーションコンテナを同一マシン上で動作させる場合、専用のコンテナネットワークを作成しておくほうがよいでしょう。このメリットは以下の2つです。

  • NPMが対象のアプリケーションコンテナをサービス名で名前解決できる
  • アプリケーションコンテナが、ホストにポートを公開する必要がない

特に後者が重要です。コンテナ同士が同一のコンテナネットワークに所属しない場合、Dockerの「-p」オプションを使い、ホストに公開したポートを経由して通信することになります。ですがWebサーバーを複数動かす場合、この方法ではホストのポート番号を奪い合うため、異なるポートを割り当てる必要が出てきます。するとサービスとポートの対応を覚えておかねばならず、非常に面倒です。しかし通信をコンテナネットワーク内に閉じる場合、各コンテナがそれぞれ好きなポート番号を使えるため、この問題を気にしなくてもよくなるのです。また不用意にポートを公開しないことは、セキュリティの向上にも繋がります。

今回は「nginxproxy」というネットワークを作成しました。

$ sudo docker network create nginxproxy

NPM用のディレクトリを作成してから、その中にcompose.yamlを以下の内容で作成してください。バージョンは2025年12月現在の最新である「2.13.5」を指定していますが、今後新しいバージョンが公開された場合は、適宜修正してください。

NPMがHTTP/HTTPSプロキシとして動作するため80番と443番ポートと、NPM自体の管理用ポートである81番を開放します[1]。またネットワークとして、先ほど作成したnginxproxyを指定してください。

$ mkdir ~/npm && cd ~/npm

$ cat >compose.yaml <<EOF
services:
  app:
    image: 'jc21/nginx-proxy-manager:2.13.5'
    restart: unless-stopped
    environment:
      TZ: "Asia/Tokyo"
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

networks:
  default:
    external: true
    name: nginxproxy
EOF

準備ができたらNPMを起動します。

$ sudo docker compose up -d

サインインとデフォルトサイトの設定

Webブラウザから、⁠http://NPMを動かしているホストのアドレス:81」にアクセスしましょう。初回時は以下のサインアップ画面が表示されます。名前、メールアドレス、パスワードを入力してください。

図1 NPMのサインアップ画面

NPMにサインインすると、以下のダッシュボードが表示されます。ダッシュボードには設定済みのプロキシに関する情報が表示されます。

図2 NPMのデフォルト状態のダッシュボード

まずは右上のアイコンをクリックして、言語を日本語にしておきましょう。

図3 言語を変更できる。日本語にも対応済み
図4 日本語化されたダッシュボード

プロキシの設定に先立って、デフォルトサイトを設定しましょう。ヘッダから「設定」をクリックすると、以下の画面が表示されます。これは存在しないホストへアクセスされた際に、NPMが返すページの設定です。

図5 デフォルトサイトの設定画面

デフォルトでは「設定ページ」となっており、以下のページが表示されます。

図6 存在しないホストへアクセスした際に、NPMが返すデフォルトのページ

開発環境などでは、間違ったホストにアクセスしたことや、それに対してNPMが応答していることを明確にしたいでしょう。こうしたケースでは、デフォルトのまま運用するのが便利です。対してインターネットからアクセス可能にしたい場合は、無数にやってくる不正アクセスに対して、律儀に応答を返すのは悪手です。その場合は404や、444を返すことも検討してください。444はnginx独自のレスポンスコードで、クライアントに対して一切のレスポンスを返さず接続を閉じます。また別のサイトへリダイレクトさせたり、カスタム応答ページを返すことも可能となっています。

プロキシの設定

それではアプリケーションへのプロキシを設定しましょう。NPMのプロキシには、4つの種類があります。

プロキシホスト

プロキシホストはもっとも一般的な、HTTP/HTTPSのリバースプロキシです。NPMの80/443番ポートへのアクセスを、ドメインに応じてバックエンドへプロキシします。ここでは例として、同一ホスト上にwhoamiコンテナを起動し、プロキシしてみましょう。whoamiはHTTPリクエストやOS情報を確認するためだけの、シンプルなサービスです。なお当然ですが、アクセスしてきたドメイン名によって宛先を決定するため、対象のドメインがNPMサーバーのIPアドレスを指すよう、あらかじめDNSへレコードを登録しておいてください。LAN内で運用する場合は第834回で紹介した、ローカルゾーンを持ったDNSサーバーがあると便利です。

以下のコマンドを実行し、コンテナを起動してください。compose.yamlの内容は非常にシンプルですが、先ほど作成したコンテナネットワークに所属させる点を忘れないでください。

$ mkdir ~/whoami && cd ~/whoami

$ cat >compose.yaml <<EOF
services:
  whoami:
    image: traefik/whoami:v1.11
    container_name: whoami-service
    restart: unless-stopped

networks:
  default:
    external: true
    name: nginxproxy
EOF

$ sudo docker compose up -d

NPMのダッシュボードから「ホスト⁠⁠→⁠プロキシホスト」を開き、⁠プロキシホストを追加」をクリックします。

図7 プロキシホストを追加する

プロキシホスト作成のダイアログが表示されます。ドメイン名には、このホストへのアクセスに使うFQDNを入力してください。スキームは「http⁠⁠、転送ホスト名は、先ほどcompose.yaml内で指定したサービス名である「whoami⁠⁠、ポート番号は「80」です。アクセスリストはアクセス制限の設定です。Basic認証やIPアドレスによるアクセス制限も可能ですが、今回はアクセス制限をしないため「公開されたアクセス」とします。それ以外はデフォルトで大丈夫です。

図8 プロキシホストの設定

今時のWebアプリには、ドメイン名と正規のSSL証明書がないと動かないものも増えてきました。ローカルなテスト環境であっても、従来のようにIPアドレスと自己署名証明書というわけにはいきません。NPMではプロキシホストの作成と同時に、Let's EncryptによるSSL証明書を取得できます。⁠SSL」タブをクリックしてください。

NMPが管理している証明書から使用するもの選択します。ですがまだ証明書がないため、ここでは「新しい証明書を作成」を選択します。今回はDNS-01チャレンジを使用するため(後述のコラムを参照)⁠DNSチャレンジを使用」をオンにします。

筆者はAmazon Route 53でドメインをホストしているため、DNSプロバイダーは「Route 53」を選択しました。⁠資格情報ファイルの内容」には、DNSプロバイダーのAPIを叩くためのクレデンシャル等を記述します。

図9 Let's Encryptの設定

最後に「保存」をクリックすると、SSL証明書の取得とプロキシホストの設定が行われます。

図10 プロキシホストが作成された

プロキシホストのドメインにアクセスしてみましょう。whoamiコンテナにアクセスがプロキシされ、HTTPリクエストの内容が表示されました。またLet's Encryptの証明書によって、HTTPS通信が行えています。

図11 NPM経由でwhoamiコンテナにアクセスできた

ストリーム

ストリームはHTTP/HTTPSではなく、TCP/UDPレベルのプロキシ機能です。HTTPプロトコルを利用していないトラフィックであっても、任意のバックエンドへ直接転送できます。例としてLAN内の別のサーバーに対し、SSHをプロキシしてみましょう。NPMのダッシュボードから「ホスト⁠⁠→⁠ストリーム」を開き、⁠ストリームを追加」をクリックします。

受信ポートには、NPMが待ち受けるポート番号を指定します。ここではわかりやすく、8022としてみました。⁠転送ポート」がふたつありますがこれは誤訳で、左側は転送ホスト(原文ではForward Host)です。ここには転送先のIPアドレスを入力します。右側の転送ポートには、SSHなので22を入力します。最後に保存をクリックしてください。

図12 ストリームホストの設定。左側の転送ポートが、本来は「転送ホスト」

ストリームの場合、NPMが待ち受けるポートを追加で開く必要があります。NPMのcompose.yamlを以下のように修正してください。

services:
(...略...)
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
      - '8022:8022'   この行を追加

コンテナを再起動します。compose.yamlが修正されているため、restartではなくupし直しています。

$ sudo docker compose up -d

これでホストの8022番ポートがNPMコンテナの8022番ポートと繋がりました。このポートへのアクセスは、NPMが別サーバー(ここでは192.168.1.7)の22番ポートへストリーミングします。NPMでSSHをストリームすれば、踏み台サーバーからの多段SSHも不要になるでしょう。

リダイレクトホスト

リダイレクトホストはリバースプロキシではなく、クライアントを別のURLへ転送する機能です。クライアントからのリクエストに対して、NPMはプロキシせず、HTTPレスポンスコード30Xを返します。クライアントのブラウザはこの応答を受け取り、レスポンスに含まれる新しいURLへ自動的に再アクセスします。新しいドメインにサービスを引越したような場合に、古いサービスのドメインをNPMで受け、新ドメインへリダイレクトするといった使い方が考えられます。

図13 特定のドメインへのアクセスを、別ドメインへリダイレクトする設定例

404ホスト

404ホストは、文字通り常に404を返す機能です。普段利用することはないでしょうが、廃止したドメインの後始末などに役立つかもしれません。

図14 特定のドメインへのアクセスに対し、常に404を返す設定例

Nginx Proxy Managerを使えば、面倒なリバースプロキシとSSL証明書の管理を、Webから手軽にポチポチで行えます。もちろんPangolinでも、WireGuardなしのローカルモードで動かせば、これと同様のことは可能です。ただしPangolinはやはり、VPN越しに使うことで真価を発揮するソフトです。また設定も少し複雑なため、LAN内での手軽なリバースプロキシ管理という面では、Nginx Proxy Managerに軍配が上がると筆者は考えています。さらに今回は紹介しきれませんでしたが、Basic認証やIPアドレスベースでアクセス制限をかけることも可能です。

nginxのリバースプロキシ設定を手作業でメンテしている方は、Nginx Proxy Managerを試してみてください。

おすすめ記事

記事・ニュース一覧