NginxリバースプロキシとLet’s Encryptで実現する安全なWebサーバー構築

はじめに

最近、ChatGPTやGoogle Gemini、Claudeなど、AIサービスの普及により、多くの個人や小規模チームがWebアプリケーションを開発・公開するようになってきました。しかし、これらのアプリケーションを安全に運用するには、セキュリティ対策が欠かせません。

そこで注目したいのが「リバースプロキシ」という技術です。

リバースプロキシって何?

リバースプロキシは、簡単に言えば「Webアプリケーションの前に立つ門番」のようなものです。

例えば:

  • お客様(ユーザー)がWebサイトにアクセスする時、最初に門番(リバースプロキシ)が応対します
  • 門番は不審な訪問者を検知したり、アクセスの集中を管理したりします
  • また、お客様とのやり取りを暗号化(HTTPS化)して、情報の盗聴を防ぎます

なぜリバースプロキシが必要?

  1. セキュリティの強化
  • 実際のアプリケーションサーバーを直接インターネットに晒さない
  • 不正なアクセスをブロック
  • HTTPSによる通信の暗号化
  1. 運用管理の効率化
  • 複数のアプリケーションを一つのドメインで管理
  • SSL証明書の一元管理
  • アクセスログの集中管理
  1. パフォーマンスの向上
  • 静的コンテンツのキャッシュ
  • アクセス負荷の分散
  • 通信の最適化

このガイドで実現できること

このガイドでは、無料のSSL証明書を自動更新する機能を備えたNginxリバースプロキシの環境を、DockerとLet’s Encryptを使って構築します。これにより、以下のような環境を簡単に整備できます:

  • Webアプリケーションの自動HTTPS化
  • セキュリティの強化
  • 証明書の自動更新
  • Docker化による簡単な環境構築

個人開発のプロジェクトや、小規模なチームでの開発に最適な構成となっています。

システム構成

このプロジェクトは、DockerコンテナでNginxとCertbotを動かし、安全なWebサーバー環境を実現します。

主要コンポーネント

  1. Nginxコンテナ(リバースプロキシ)
  • 外部からのアクセスを受け付け、内部のアプリケーションサーバーに転送
  • HTTPSの終端点として機能
  • アルパインLinuxベースの軽量イメージを使用
  1. Certbotコンテナ(SSL証明書管理)
  • Let’s Encryptから無料のSSL証明書を取得
  • 証明書の自動更新を担当(12時間ごとに確認)
  • 更新時にNginxに自動で反映

設定ファイルの役割

  • nginx.conf: Nginxの基本設定
  • default.conf: サイト固有の設定(SSL設定、プロキシルール等)
  • docker-compose.yml: コンテナの構成管理
  • init-letsencrypt.sh: 初期セットアップ用スクリプト

セキュリティ対策

このシステムには以下のセキュリティ機能が組み込まれています:

  1. 通信の暗号化
  • TLS 1.2/1.3のみを使用
  • 最新の暗号化スイートを採用
  1. 自動証明書管理
  • SSL証明書の自動更新
  • 証明書の権限管理
  1. アクセス制御
  • HTTPからHTTPSへの自動リダイレクト
  • プロキシヘッダーの適切な設定

主要ファイルの説明

このプロジェクトは、以下の主要なファイルで構成されています。それぞれのファイルは特定の役割を持ち、全体として自動化された安全なWebサーバー環境を実現します。

設定ファイル

default.conf

Nginxの主要な設定ファイルです。このファイルでは:

  • HTTPSへの自動リダイレクト設定
  • SSL証明書の設定
  • バックエンドサーバーへの接続設定
    を管理しています。

nginx.conf

Nginxの基本的な動作設定を行うファイルです。ログの形式やワーカープロセスの設定など、システム全体の基本的な振る舞いを定義します。

Docker関連ファイル

docker-compose.yml

システム全体の構成を定義するファイルです。

  • Nginxコンテナの設定
  • Certbotコンテナの設定
  • 証明書の自動更新処理
    これらの要素がどのように連携するかを指定しています。

Dockerfile

Nginxのコンテナイメージをカスタマイズするための設定ファイルです。アルパインLinuxベースの軽量なイメージを使用し、必要な設定ファイルを配置します。

セットアップスクリプト

init-letsencrypt.sh

システムの初期セットアップを自動化するスクリプトです。

  • SSL証明書の取得
  • Nginx設定の初期化
  • 証明書の権限設定
    これらの処理を自動的に行い、安全な環境を構築します。

これらのファイルの詳細な内容は、プロジェクトのGitHubリポジトリで確認できます。また、セットアップ手順の詳細は後述のチュートリアル動画でご確認いただけます。

セットアップ手順

ここでは、実際の環境構築手順を説明します。初めての方でも安心して設定できるよう、段階的に進めていきます。

事前準備

セットアップを始める前に、以下が必要です:

  • Dockerがインストールされているサーバー
  • ドメイン名(お好みの独自ドメイン)
  • サーバーのIPアドレスにドメインが向いていること

手順の概要

セットアップは大きく分けて2段階で行います:

  1. テストモードでの確認
  • 設定ミスによるLet’s Encryptのレート制限を避けるため
  • 正しく動作することを確認してから本番環境に移行
  1. 本番環境の構築
  • テストモードで確認後、本番用の証明書を取得
  • 実際のHTTPS環境の構築

具体的な手順

  1. リポジトリのクローン 以下のコマンドでプロジェクトをダウンロードします。
    git clone https://github.com/superdoccimo/rev.git
    cd rev
  2. 初期設定の変更 init-letsencrypt.shをテキストエディタで開き、以下の項目を設定します。
    domains=(あなたのドメイン名) # 例:example.com
    email="管理者のメールアドレス"
    staging=1 # テストモード
  3. テストモードでの実行 スクリプトに実行権限を付与し、実行します。
    chmod +x init-letsencrypt.sh
    sudo ./init-letsencrypt.sh
  4. 動作確認のポイント
    • エラーメッセージが表示されていないことを確認
    • ブラウザでドメインにアクセスして確認
    • テストモードでは証明書の警告が表示されるのが正常です
  5. 本番モードへの切り替え init-letsencrypt.shstaging=1staging=0に変更し、再度実行します。
    sudo ./init-letsencrypt.sh

トラブルシューティング

問題が発生した場合は、以下の手順で確認します:

  1. Nginxのログを確認
    docker compose logs nginx-proxy
  2. よくあるチェックポイント
    • ドメインがサーバーのIPアドレスに正しく向いているか
    • ポート80と443が開いているか
    • ファイアウォールが適切に設定されているか

詳しい設定方法や応用例については、GitHubリポジトリのREADMEや、後述のビデオチュートリアルをご確認ください。

カスタマイズ方法

基本的なセットアップが完了したら、必要に応じて以下の項目をカスタマイズできます。

バックエンドサーバーの設定

default.confのHTTPSサーバーブロック内で、実際のアプリケーションサーバーの設定を変更できます。

location / {
proxy_pass http://10.0.0.37:8080; # ここを変更
}
  • IPアドレスとポート番号は、実際のアプリケーションサーバーに合わせて変更
  • 複数のバックエンドサーバーがある場合は、locationブロックを追加

SSL/TLS設定のカスタマイズ

セキュリティ要件に応じて、SSL設定を調整できます。

ssl_protocols TLSv1.2 TLSv1.3;  # 使用するTLSバージョン
ssl_session_timeout 1d;         # セッション有効期限
ssl_session_cache shared:SSL:10m;  # キャッシュサイズ

証明書の自動更新間隔

docker-compose.ymlのcertbotサービスで、証明書更新の確認間隔を変更できます。

sleep 12h  # 12時間間隔を必要に応じて調整

その他のカスタマイズオプション

  1. ログの設定
    • アクセスログやエラーログの保存場所
    • ログローテーションの設定
  2. リソース制限
    • コンテナのメモリ制限
    • ワーカープロセス数の調整
  3. 広告配信設定
    • ads.txtファイルの配置
    • アクセス制御の設定

これらの設定につきましては、必要に応じて段階的に実施されることをお勧めいたします。設定変更後は、以下の手順に従って操作を行ってください。

  1. Nginxの設定テストを実行
    設定変更が正しく反映されているか確認するために、まずNginxの設定テストを実行してください。
    docker compose exec nginx-proxy nginx -t
    テストが成功したことを確認してください。
  2. Nginxの再起動を実行
    設定に問題がないことを確認後、Nginxを再起動して変更を適用します。
    docker compose restart nginx-proxy
  3. コンテナに入らずにNginxをリロード
    コンテナにアクセスせずにNginxの設定をリロードする方法もございます。以下のコマンドを実行してください。
    docker compose exec nginx-proxy nginx -s reload
    このコマンドにより、Nginxが現在の設定を再読み込みし、サービスを中断することなく設定変更を反映させることができます。

複数サイトの運用

リバースプロキシの大きな利点として、複数のWebサイトやサービスを簡単に管理できます。

例えば、以下のような状況を考えてみましょう:

  1. ブログサイト(WordPressなど)を8080ポートで運用
  2. ポートフォリオサイトを8888ポートで運用

通常であれば、以下のようなURLでアクセスする必要があります:

しかし、リバースプロキシを使うと、以下のようなスッキリとしたURLでアクセスできます:

または:

設定例:

# サブドメインを使用する場合
server {
server_name blog.example.com;
location / {
proxy_pass http://localhost:8080;
}
}

server {
server_name portfolio.example.com;
location / {
proxy_pass http://localhost:8888;
}
}

# パスで分ける場合
server {
server_name example.com;

location /blog {
proxy_pass http://localhost:8080;
}

location /portfolio {
proxy_pass http://localhost:8888;
}
}


実践的なユースケースとして、同じLAN内の異なるサーバーへの転送を図示すると以下のようになります。

リバースプロキシ関連記事

タイトルとURLをコピーしました