個人的な備忘録：Webアプリケーションのセキュリティ向上や負荷分散に不可欠な NGINX を活用したリバースプロキシについてまとめてみた

## はじめに

リバースプロキシは、Webアプリケーションのセキュリティ向上や負荷分散において重要な役割を果たします。

:::note info
**特に、NGINX を活用したリバースプロキシの構成は、Django や Flask などのバックエンドと組み合わせることで、パフォーマンスの最適化やスケーラビリティの向上に貢献します。**
:::

実際に、Python の Django と NGINX を用いたリバースプロキシの構成を実装してみた経験をもとに、基本を振り返りつつ体系的に整理しました。

***また、個人的な備忘録 としての意味合いも強いため、リバースプロキシに興味のある方や、これから学習したい方の参考になれば幸いです。***

## 書こうと思ったきっかけ
普段のプロキシについては、自宅に構築したり技術検証を行った経験があり、基本的な仕組みは理解していました。

:::note warn
***しかし、リバースプロキシについては改めて学ぶ必要があると感じました。***
:::

そこで、直近で Python の Django と NGINX を使ってリバースプロキシの構成を実装した経験をもとに、リバースプロキシの仕組みや設定を整理しながら振り返ってみることにしました。

https://qiita.com/free-honda/items/57bd55b1f70348295a13

## NGINX を使ったリバースプロキシとは？

- **リバースプロキシ（Reverse Proxy）** とは、クライアントとサーバーの間に立ち、リクエストを適切なサーバーに転送する仕組み。  

これにより、負荷分散・セキュリティの向上・キャッシュ機能による高速化 など、多くのメリットが得られます。

![Screenshot 2025-02-01 at 12.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/77ef0fbd-8879-01ba-04f4-bc9968647b0b.png)

引用画像：https://www.kagoya.jp/howto/it-glossary/web/reverse-proxy/

プロキシサーバーについては、これまで自宅やAWS環境で構築した経験があります。***興味のある方は、以下の記事も参考にしてみてください。***

https://qiita.com/free-honda/items/27a201413787414b0108

https://qiita.com/free-honda/items/99170d4d481e7937d893

- **NGINX（エンジンエックス）** は、軽量で高速な Web サーバーであり、リバースプロキシとしても非常に優れた機能を持つ。

NGINXに関する技術検証の内容もまとめていますので、興味のある方はぜひご覧ください。

https://qiita.com/free-honda/items/0cd447cfbb3b2bdf1b80

https://qiita.com/free-honda/items/af5277d640768957b8d2

## **リバースプロキシ vs フォワードプロキシ**
- **フォワードプロキシ**（通常のプロキシ）  
  - **クライアントの代理** として **外部サーバーへアクセス** する。  
- **リバースプロキシ**  
  - クライアントからのリクエストを受け取り、**適切なバックエンドサーバーに振り分ける** 役割を果たす。  

# NGINX をリバースプロキシとして使うメリット

- **1. 負荷分散（ロードバランシング）**  
  - **複数のバックエンドサーバーにリクエストを分散** することで、負荷を軽減し、サーバーダウンを防ぐ。  
  - **ラウンドロビン・IP ハッシュ** などのアルゴリズムで、トラフィックを最適に振り分けられる。  

- **2. セキュリティの向上**  
  - クライアントが直接バックエンドサーバーにアクセスできないため、**サーバーの IP アドレスや内部構成を隠す** ことが可能。  
  - **DDoS 攻撃の軽減** や **WAF（Web Application Firewall）との連携** もできる。  

- **3. キャッシュ機能による高速化**  
  - **静的ファイル（画像・CSS・JavaScript）のキャッシュ** を活用し、バックエンドの負荷を軽減。  
  - **頻繁にアクセスされるページをキャッシュ** することで、レスポンス速度を向上させる。  

- **4. SSL ターミネーション**  
  - **SSL/TLS の処理を NGINX にオフロード** することで、バックエンドのサーバー負荷を軽減。  
  - **証明書の管理が一元化** でき、セキュリティ設定を統一できる。  

- **5. WebSocket や HTTP/2 のサポート**  
  - **リアルタイム通信（WebSocket）** に対応し、チャットやストリーミングアプリにも適用可能。  
  - **HTTP/2 に対応** し、パフォーマンスを向上。  

- **6. API ゲートウェイとしての利用**  
  - **REST API / GraphQL API のリクエストを適切に振り分け** られる。  
  - **API のレートリミットや認証処理** も NGINX 側で制御可能。  

## NGINX をリバースプロキシとして設定する例

### 1. 基本的なリバースプロキシ設定（Django / Flask）

```conf
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
```

- クライアントのリクエストを **127.0.0.1:8000（Django / Flask）** に転送  
- クライアントの **IP アドレスをバックエンドに伝える**  

直近で、私も似たような設定ファイルを作成し、AWS環境上にデプロイしました。

:::note info
***設定ファイルの詳細は、以下のリポジトリに公開していますので、参考にしてください。***
:::

https://github.com/free-honda/reverse-proxy-django-prd/blob/main/nginx/default.conf

### 2. 複数のバックエンドへの負荷分散

```conf
upstream backend_servers {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
    }
}
```

- **複数のバックエンドサーバーにリクエストを分散**  
- **ロードバランサーとして機能**  

## ここまでの内容を表にまとめてみた

| **メリット**                | **説明**                                              |
|----------------------------|------------------------------------------------------|
| **負荷分散**               | リクエストを複数のサーバーに分散し、パフォーマンス向上 |
| **セキュリティ向上**        | バックエンドサーバーの IP を隠し、DDoS や不正アクセスを防止 |
| **キャッシュによる高速化**   | 静的コンテンツのキャッシュで、レスポンスを改善        |
| **SSL ターミネーション**    | SSL/TLS をオフロードし、暗号化処理を軽減             |
| **API ゲートウェイ機能**    | REST API / GraphQL API のリクエスト制御              |
| **WebSocket / HTTP/2 対応** | リアルタイム通信や HTTP/2 での最適化               |

NGINX を **リバースプロキシとして導入** することで、**Web アプリのパフォーマンスとセキュリティを向上** させることができます！ 

# まとめ
ここまで読んでいただき、ありがとうございました。***今回、NGINX をリバースプロキシとして導入するメリットを体系的に整理することで、より理解が深まりました。***

:::note info
***今後、基本的な部分についても丁寧に記事としてアウトプットしていきたいと考えています。***
:::

これからも学びの過程を記録していきますので、引き続き温かく見守っていただけると嬉しいです！