リバースプロキシの記述をエディタで行っていましたが、よさげなツールがあったので動作確認してみます。リバースプロクシを使って背後のWordPressが見れるようにします。
https://github.com/NginxProxyManager/nginx-proxy-manager
DockerコンテナをNginxリバースプロキシの背後に配置するという設計は、いくつかの重要な利点があります。以下にその主な利点を挙げます。
- セキュリティの向上:
- リバースプロキシは、実際のバックエンドサーバー(この場合はWordPressコンテナ)の前に置かれるため、外部からの直接的なアクセスを遮断し、攻撃の表面を減少させます。
- 不正なリクエストや攻撃をフィルタリングする機能を追加することができ、セキュリティ層を増やすことができます。
- 負荷分散と冗長性:
- 複数のバックエンドサーバー(コンテナ)へのリクエストを分散させることができ、サービスの可用性と耐障害性を向上させます。
- 特に高トラフィックの状況で効果を発揮し、サーバーの負荷を均等に分散させることで、各サーバーの過負荷を防ぎます。
- SSL/TLSの集中管理:
- SSL/TLS証明書の管理をリバースプロキシで一元化することができ、セキュアなHTTPS接続を簡単に実装できます。
- 各バックエンドサーバーに個別に証明書を設定する必要がなくなるため、管理が容易になります。
- キャッシュとパフォーマンスの向上:
- 静的コンテンツをリバースプロキシでキャッシュすることで、バックエンドサーバーの負荷を軽減し、ウェブサイトのレスポンス時間を改善します。
- ユーザーへの応答速度が向上し、全体的なユーザーエクスペリエンスが向上します。
- 設定の柔軟性とカスタマイズ:
- Nginxは非常に柔軟で便利なリバースプロキシであり、URLの書き換え、リダイレクト、ロードバランシングのルールなど、高度な設定が可能です。
- 特定のリクエストに対して特別なヘッダーを追加したり、アクセス制御を設定するなどのカスタマイズが容易です。
特に、リバースプロキシを使用することで、同じポート番号(一般的にはポート80や443)を使用しながらも、バックエンドの異なるサービスやアプリケーションへのトラフィックを効果的に振り分けることができるのが便利だと思います。リバースプロキシはクライアントとサーバーの間に位置し、クライアントからのリクエストを受け取り、それを適切なバックエンドサーバーに転送し、そのレスポンスをクライアントに返送します。
ローカルでもクラウドでも確認することができますが、後者で実際に確認します。まずは、リバースプロキシを設置するサーバーの外部IPとドメインを紐づけしておきます。適当なディレクトリを作成し、公式GitHubのと同じようにdocker-compose.ymlを記述します。
mkdir proxy
nano docker-compose.yml
[記述内容]
version: '3.8'
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
コンテナを起動します。
docker compose up -d
以下のURLに最初にアクセスして、初期値のメールアドレスとパスワードを入力してログインします。うまくブラウザにnginx-proxy-managerの画面が表示されました。ログインするとユーザーを作成しなければなりません。また、パスワードを変更しておきます。
http://test.example.com:81
自分の環境では、ファイアーウォールは有効になっています。しかし、記事が長くなるのでファイアーウォールは無効になっているものとします。有効してある場合、使用するポート番号の追加をしておきます。もしくは無効にしておきます。
典型的な新規で始めるdockerによるWordPressを立ち上げるdocker-compose.yml
を作成します。WordPressとデータベースは、リバースプロキシとは別のサーバー(インスタンス)に作成します。この2つのインスタンスは同じセグメントのネットワークに属しています。
version: "3.8"
services:
db:
container_name: testmaria
image: mariadb:latest
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpass
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wpuser
- MYSQL_PASSWORD=testpass
restart: always
wordpress:
container_name: testwp
depends_on:
- db
image: wordpress:latest
ports:
- "8080:80"
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wpuser
- WORDPRESS_DB_PASSWORD=testpass
- TZ=Asia/Tokyo
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
volumes:
db_data:
リバースプロキシの主な役割の一つは、指定されたドメイン名やURLパターンに基づいて、クライアントからの接続をバックエンドサーバー(たとえば、Dockerで動作しているWebアプリケーション)に転送することです。具体的な挙動について説明します。
- ドメイン名やURLに基づくリクエストの受信: リバースプロキシは、特定のドメイン名やURLに対するHTTPリクエストを受信します。たとえば、
www.example.com
へのアクセスがあった場合、リバースプロキシがこのリクエストを受け取ります。 - リクエストの解析とルーティング: 受信したリクエストを解析し、設定ファイルに記述されたルールに従って、適切なバックエンドサーバーに転送します。たとえば、リクエストが
www.example.com/blog
であれば、ブログコンテンツを扱うサーバーに、www.example.com/shop
であれば、ショッピング関連のサーバーにルーティングすることができます。 - リクエストの転送: リバースプロキシはリクエストをバックエンドサーバーに転送し、そのサーバーからの応答を受け取ります。この過程では、必要に応じてリクエストヘッダーやIPアドレスなどの情報を加工することもあります。
- レスポンスのクライアントへの送信: バックエンドサーバーからの応答をクライアントに返します。このとき、リバースプロキシはクライアントとバックエンドサーバーの間に立っているため、クライアントはバックエンドサーバーの存在を意識することなくデータを受け取ることができます。
このように、リバースプロキシはネットワーク上で非常に重要な役割を果たし、ドメイン名に基づいてトラフィックを適切に管理することで、セキュリティの向上、負荷分散、キャッシュ管理など多くの利点を提供します。また、Nginxのようなリバースプロキシソフトウェアは設定が非常に柔軟であるため、さまざまなニーズに対応することができます。
リバースプロキシを使用する場合、背後にあるサーバーは直接インターネットに露出する必要がなく、プライベートIPアドレスで十分です。しかし、AWS(Amazon Web Services)のようなクラウド環境では、管理や保守のためにサーバーにSSHで接続する必要がある場合、外部からアクセスできるように設定する必要があります。これを回避する方法がいくつかあります。グローバルIPアドレスも不足していて有料になったサービスもあるみたいです。
1. Elastic IPの使用
AWSでは、Elastic IP(固定の公開IPv4アドレス)をインスタンスに割り当てることで、インターネットから直接アクセス可能にすることができます。これを使えば、必要に応じてインスタンス間でIPアドレスを移動させることが可能です。
2. プライベートサブネットとバスティオンホスト
よりセキュリティを高めたい場合は、バスティオンホスト(ジャンプボックスとも呼ばれる)を使用する方法があります。この設定では、プライベートサブネットにあるインスタンスには公開IPアドレスを割り当てず、公開サブネットに置かれたバスティオンホストを経由して間接的にアクセスします。バスティオンホストには公開IPを割り当て、厳格なセキュリティルールを適用することで、セキュリティを強化します。
3. VPN接続
企業がAWSリソースに安全にアクセスするためには、VPN(仮想プライベートネットワーク)を設定することも一般的です。VPNを使用すれば、インターネット上から直接アクセスされることなく、プライベートサブネット内のインスタンスに対してセキュアな通信路を確保できます。
4. AWS Systems Manager
AWS Systems ManagerのSession Manager機能を使用すれば、SSHキーなしでインスタンスにセキュアなアクセスを行うことができます。これはAWSの管理コンソールやAWS CLIを通じて、インターネット経由でインスタンスに接続するためのツールです。
これらのオプションを適切に選択し、組み合わせることで、クラウド環境におけるセキュリティとアクセシビリティのバランスを取ることが可能です。どの方法を選択するかは、セキュリティ要件、コスト、管理の複雑さなどの要素を考慮して決定することになります。
リバースプロキシとWordPressは個人が自宅に設置することも可能で、ルーターがネットワークセグメントを管理し、デバイス間の通信を調整する役割を担います。ルーターは通常、ホームネットワークのゲートウェイとして機能し、インターネット接続の分配と内部ネットワークのセキュリティを提供します。
図の説明:
- ルーター/ゲートウェイ: ホームネットワークの中心に位置し、インターネットアクセスと内部トラフィックのルーティングを管理します。IPアドレスは
192.168.1.1
です。 - 個人用コンピューター: IPアドレス
192.168.1.2
を持ち、有線接続でルーターに接続されています。 - スマートフォンとタブレット: それぞれIPアドレス
192.168.1.3
と192.168.1.4
を持ち、Wi-Fiを通じてルーターに接続されています。
このスクショは、家庭内の典型的なネットワーク設計を示し、異なるデバイスがどのように接続され、通信しているかを視覚的になスクショです。非一般的なセットアップであり、多くの家庭で見られる典型的な環境です。リバースプロキシを利用することで、特定のポートにバインドされたサービス(例えば、Stable Diffusionなどのアプリケーション)へのアクセスを、外部から簡単なURLでアクセスできるように設定することが可能です。これは特に開発環境や内部ネットワークで役立ち、外部のユーザーには簡単で覚えやすいURLを提供しながら、内部では複数のサービスを異なるポートで運用することができます。
リバースプロキシは以下のような機能を提供します。
- トラフィックのルーティング: リバースプロキシはドメイン名やリクエストのパスに基づいて、適切なバックエンドサーバーやポートにトラフィックを転送します。
- SSL終端: リバースプロキシはSSL/TLS証明書を管理し、HTTPS通信を終端することができます。これにより、内部のサービスが直接SSLを扱う必要がなくなり、設定が簡単になります。
- 負荷分散: 複数のサーバーが同じサービスを提供している場合、リバースプロキシは負荷を分散し、トラフィックの増加に対応できます。
- セキュリティ強化: リバースプロキシを使用すると、バックエンドサーバーのIPアドレスを隠蔽でき、直接的な攻撃から保護することができます。
たとえば、ローカルに設置されたStable Diffusionのインスタンスがポート7860
で運行している場合、リバースプロキシを設定してhttps://example.com/stablediffusion
というアドレスからアクセスできるようにすることができます。ユーザーはポート番号を覚える必要がなく、直感的なURLでサービスを利用できるようになります。
以上の手順でリバースプロキシの設定ができます。ユーザーを作成して、パスワードを変更した続きになります。
http://test.example.com:81
それでは具体的に、proxyの設定をして背後のWordPressにルーティングできるようにしましょう。
NGINX プロキシマネージャでは、ドメイン名の欄にそのプロキシを通してアクセスしたいときに使用するドメイン名を入力します。
この設定によって、NGINX は指定されたドメイン名でのリクエストを適切なバックエンドサービスにルーティングするように構成されます。
具体的には、以下のステップで設定が進みます。
- ドメイン名の設定: プロキシマネージャにおいて、外部からアクセスされる際に使うドメイン名(例:
example.com
)を指定します。 - リバースプロキシのルール設定: 指定したドメイン名に基づいて、どのバックエンドサーバーやサービスにトラフィックを送るかのルールを設定します。これにはポート番号やプロトコル、パスなどが含まれることがあります。
- セキュリティ設定: 必要に応じて、SSL/TLS証明書を設定してHTTPS通信を有効にします。NGINX プロキシマネージャは、証明書の取得と更新を自動化する機能も提供している場合があります。
- アクセス制御とログの管理: 特定のドメインへのアクセスを制限したり、ログを取得してアクセスパターンを分析する設定も可能です。
これらの設定により、NGINX プロキシマネージャはGUIなツールで、複数のアプリケーションやサービスを同じサーバー上で効率的に運用することが可能になります。ドメイン名を通じてリクエストを適切にルーティングし、管理を容易にすることができます。
また、NGINX プロキシマネージャを使用することで、SSL証明書の設定が大幅に簡単になります。特に、Let’s Encryptなどの無料SSL証明書提供サービスを利用した自動化された証明書の取得と更新機能は、SSL証明書の管理を容易にします。
SSL証明書の集中管理の利点:
- セキュリティの向上: リバースプロキシサーバーでSSL証明書を集中管理することで、バックエンドサーバーへの直接的な暴露を避けることができます。この設定により、データの暗号化が一元管理され、セキュリティが強化されます。
- 設定の簡略化: 複数のバックエンドサーバーに対して、一箇所でSSL証明書を管理することで、各サーバーで個別に証明書を設定・更新する手間が省けます。これにより、設定ミスが減少し、運用が簡単になります。
- パフォーマンスの向上: SSL/TLSネゴシエーションの負荷をリバースプロキシサーバーが吸収するため、バックエンドサーバーのリソースをより効率的に使用できます。これにより、全体的なサーバーパフォーマンスが向上します。
- コンプライアンスの遵守: 特定の業界ではデータの暗号化が法律または規制によって求められていることがあります。SSL証明書の集中管理により、これらの要件を効率的に満たすことが可能になります。
NGINX プロキシマネージャを利用することで、これらの設定をGUIを通じて直感的に行うことができ、定期的な証明書の更新も自動で行われるため、継続的なセキュリティ維持が容易になります。安全で信頼性の高いWeb環境を構築できるため、企業や組織にとって大きな利点となります。
リバースプロキシを設定する際には、一つの外部IPアドレスに複数のドメイン名を紐づけるのが一般的です。同じ物理的または仮想的なサーバーが複数のウェブサイトやアプリケーションをホストし、効率的にトラフィックを処理することが可能になります。結局のところ、背後に複数のサーバーがある場合リバースプロキシのサーバーの外部IPに複数のドメイン名を割り当てておくことになります。