サーバー上でリバースプロキシを構築したい場合、Nginx が最も一般的な選択肢です。しかし、その設定は初心者には少し複雑で、ベテランにとってもあまり便利ではありません。そのため、Caddy などのより便利な設定ツールを選ぶ人もいます。しかし、初心者には可視化された Nginx 設定ソリューションがあります:Nginx Proxy Manager、Docker イメージを提供しており、構築も非常に簡単です。
Docker のインストール#
Install Docker Engine | Docker Documentationを参照し、自分のシステムを選択してください。まだシステムを選んでいない場合は、Debian の使用を強くお勧めします。
もし全過程で root ユーザーを使用する場合も可能ですが、この方法は非常に推奨されません。大きなセキュリティリスクがあり、将来的に権限管理に関して問題が発生する可能性があります。
ほとんどのディストリビューションでは、以下のスクリプトを使用してワンクリックでインストールできますが、ドキュメントではこのインストール方法は本番環境には推奨されていないとされていますので、自分で判断してください。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
普通のユーザーで操作することをお勧めします。インストール後は、Manage Docker as a non-root userの方法に従ってユーザーを docker ユーザーグループに追加し、毎回 Docker コマンドを使用する際に sudo を付ける必要がないようにします。
rootless mode、つまり root 権限で docker daemon を実行しないことは推奨されません。一部のプログラムに問題が発生する可能性があります。
一部の古いチュートリアルでは
docker-compose
のインストールを要求することがありますが、現在の Docker のバージョンには空白を含むdocker compose
が内蔵されており、私自身は違いを見つけていないので、docker-compose
をインストールする必要はありません。すべてdocker compose
を使用しましょう。
NPM のインストール#
-
まず、好きなディレクトリに cd します。例として
~/docker/
を使用します。 -
次に、npm のデータを保存するための新しいフォルダーを作成します:
mkdir npm && cd npm
-
どの方法を使用しても、以下のコードを新しく作成した
docker-compose.yml
に入れます:version: '3' services: app: image: 'jc21/nginx-proxy-manager:latest' container_name: 'npm' restart: unless-stopped ports: - '80:80' - '81:81' # コロンの左側は自分のサーバーで未使用のポートに変更できます - '443:443' volumes: - ./data:/data # コロンの左側はパスを変更できます - ./letsencrypt:/etc/letsencrypt # コロンの左側はパスを変更できます
-
コンテナを起動します。
docker compose up -d
-
ブラウザで https:// あなたのサーバー ip:81 を開いてログインします。デフォルトのメール:
[email protected]
、デフォルトのパスワード:changeme
-
ログイン後、アカウント名やパスワードなどの変更が表示されますが、この時点では本当の情報を急いで入力せず、適当に書いておきます。なぜなら、今は http 接続であり、安全ではありません。
インストール部分はこれで完了です。次に npm 自体を例に、リバースプロキシの設定方法を示します。
リバースプロキシ#
結果として、リバースプロキシの最も直接的な効果は、IP: ポートではなく、ドメイン名でアクセスできるようになることです。また、HTTP が HTTPS に変わります。
ドメイン名の設定#
リバースプロキシにはドメイン名が必要です。
ドメイン名の購入#
まず、ただ遊びたいだけなら、Google で無料で取得できるドメインがないか探してみてください。現時点で私が知っている無料で取得できるドメインは.link
と.eu.org
です。どうやって取得するかを検索してみてください。
長期的に使用したい場合は、自分の好きなドメインを選ぶのが最善です。経済的に許容できる範囲で短いものが良いです。例えば、私のyfi.moe
は、yfi は Yunfi の略で、moe を選んだ理由は以下の図の通りです:
私のドメインはすべてNameSiloで購入しました。彼らの.com
ドメインは 10 ドルちょっとで、最も安い部類に入ります。比較的お得なのは.top
ドメインで、初年度は $1.88、更新は $4.88 です。購入時に私のクーポンコード(Coupon)を使用すると、さらに $1 の割引が受けられます:yunfi
Cloudflare を通じてドメインを管理する(オプション)#
Cloudflareは、あなたがインターネットに接続するすべてを安全、プライベート、迅速、信頼性のあるものにすることを目的としたグローバルネットワークです。
Cloudflare はネットワークの分野で大手企業であり、無料の CDN やその他のさまざまなサービスを提供しています。私たちがやるべきことは、ドメインの DNS サーバーを Cloudflare に変更して、DNS レコードを便利に管理できるようにすることです。この記事以降も Cloudflare を例として使用します。
まず Cloudflare に登録し、サイト(Zone)を追加し、指示に従って操作します。その後、ドメイン登録業者で DNS サーバーを Cloudflare の 2 つに変更するように指示されます。もし NameSilo を使用している場合は、ドメイン管理ページで Options の最後のアイコンをクリックします。
元のものを削除し、Cloudflare が提供する 2 つを入力するだけです。
DNS レコードの追加#
Cloudflare で、まず SSL/TLS ページに移動し、暗号化モードを「完全(厳格)」に変更します。
次に DNS ページを開き、レコードを追加します:
- タイプ:A(IPv6 の場合は AAAA を使用)
- 名前:新しいサブドメイン
- IPv4 アドレス:サーバー IP
- プロキシ状態:オンにすると Cloudflare の CDN を使用して、自分の IP が他人に知られないように保護できますが、国内では速くありません。国内サーバーの場合はオフにしても構いません。
プロキシホストの設定#
-
npm のホームページに移動し、Proxy Host をクリックして Add Proxy Host をクリックします。
-
以下のように入力します:
- ドメイン名:以前設定したドメイン名、ここでは
nginx-demo.yfi.moe
- フォワードホスト名 / IP:サーバーの外部 IP を入力することも、Docker コンテナにとってホストの IP(一般的には
172.17.0.1
)を入力することもできます。 - フォワードポート:以前設定したポート、ここでは 81 の例です。
- 下の 3 つのスイッチは、npm にとってはすべてオンにできますが、一部のアプリケーションではオンにすると問題が発生する可能性があるため、自分でテストする必要があります。
- ドメイン名:以前設定したドメイン名、ここでは
-
タブの SSL インターフェースをクリックします。
- 新しい SSL 証明書をリクエストを選択します。
- Force SSL を必ずチェックし、残りは自分のニーズに応じて設定します。
- メールアドレスは必ずしも自分のものである必要はありませんが、あまりにも不適切でないものである必要があります(さもないと Let's Encrypt に拒否されます)。
-
確定をクリックします。Let's Encrypt に証明書を申請するため、約 10 秒待つ必要があります。
この時点で https://nginx-demo.yfi.moe にアクセスすると、ログイン画面が表示されます。同時にアドレスバーにも小さな鍵が表示され、現在は HTTPS で保護されていることが示されます。
** この時点で、メールアドレスやパスワードを正式に使用するものに変更できます。** その後、証明書申請のメールアドレスも自分のものに変更できます。これにより、証明書が間もなく期限切れになると、メールで通知を受け取ることができます(npm は自動的に更新しますが)。
ワイルドカード証明書の申請(オプション)#
上記のプロセスでも可能ですが、新しい Proxy Host を追加するたびに新しい証明書を申請する必要があり、非常に便利とは言えません。したがって、*.yfi.moe
のような証明書を申請することができ、すべてに対して有効です。(yfi.moe
自体には適用できませんので、別途申請が必要です)。
- npm の SSL Certificates ページに移動し、Add SSL Certificate をクリックし、Let's Encrypt を選択します。
- ドメイン名
*.yfi.moe
を入力し、Use a DNS Challenge にチェックを入れます。 - 新しく表示された入力ボックスで DNS Provider を Cloudflare に選択します。
- Cloudflare に移動し、右上のプロフィールに入り、左側の API トークンをクリックします。
- トークンを作成し、「DNS のゾーンを編集」のテンプレートを選択します。
- ゾーンリソースに追加するドメイン名を選択し、他は変更せず、「続行して要約を表示」をクリックし、「トークンを作成」をクリックします。
- コピーして npm の 2 番目のボックスの等号の後に貼り付け、確認をクリックします。
その後のリバースプロキシはこの証明書を使用できます。
終わりに#
Nginx と比較すると、Nginx Proxy Manager はその柔軟性において劣りますが、私は使いやすさと柔軟性のバランスを取っていると思います。そうでなければ、証明書の問題だけでもかなりの時間がかかり、簡単に済ませることはできません。
NPM はリダイレクト、ストリーミング、カスタム Nginx コードなどもサポートしており、実際には見た目よりもかなり柔軟です。
FAQ#
続く