はじめに
最近、ChatGPTやGoogle Gemini、Claudeなど、AIサービスの普及により、多くの個人や小規模チームがWebアプリケーションを開発・公開するようになってきました。しかし、これらのアプリケーションを安全に運用するには、セキュリティ対策が欠かせません。
そこで注目したいのが「リバースプロキシ」という技術です。
リバースプロキシって何?
リバースプロキシは、簡単に言えば「Webアプリケーションの前に立つ門番」のようなものです。
例えば:
- お客様(ユーザー)がWebサイトにアクセスする時、最初に門番(リバースプロキシ)が応対します
- 門番は不審な訪問者を検知したり、アクセスの集中を管理したりします
- また、お客様とのやり取りを暗号化(HTTPS化)して、情報の盗聴を防ぎます
なぜリバースプロキシが必要?
- セキュリティの強化
- 実際のアプリケーションサーバーを直接インターネットに晒さない
- 不正なアクセスをブロック
- HTTPSによる通信の暗号化
- 運用管理の効率化
- 複数のアプリケーションを一つのドメインで管理
- SSL証明書の一元管理
- アクセスログの集中管理
- パフォーマンスの向上
- 静的コンテンツのキャッシュ
- アクセス負荷の分散
- 通信の最適化
このガイドで実現できること
このガイドでは、無料のSSL証明書を自動更新する機能を備えたNginxリバースプロキシの環境を、DockerとLet’s Encryptを使って構築します。これにより、以下のような環境を簡単に整備できます:
- Webアプリケーションの自動HTTPS化
- セキュリティの強化
- 証明書の自動更新
- Docker化による簡単な環境構築
個人開発のプロジェクトや、小規模なチームでの開発に最適な構成となっています。
システム構成
このプロジェクトは、DockerコンテナでNginxとCertbotを動かし、安全なWebサーバー環境を実現します。
主要コンポーネント
- Nginxコンテナ(リバースプロキシ)
- 外部からのアクセスを受け付け、内部のアプリケーションサーバーに転送
- HTTPSの終端点として機能
- アルパインLinuxベースの軽量イメージを使用
- Certbotコンテナ(SSL証明書管理)
- Let’s Encryptから無料のSSL証明書を取得
- 証明書の自動更新を担当(12時間ごとに確認)
- 更新時にNginxに自動で反映
設定ファイルの役割
- nginx.conf: Nginxの基本設定
- default.conf: サイト固有の設定(SSL設定、プロキシルール等)
- docker-compose.yml: コンテナの構成管理
- init-letsencrypt.sh: 初期セットアップ用スクリプト
セキュリティ対策
このシステムには以下のセキュリティ機能が組み込まれています:
- 通信の暗号化
- TLS 1.2/1.3のみを使用
- 最新の暗号化スイートを採用
- 自動証明書管理
- SSL証明書の自動更新
- 証明書の権限管理
- アクセス制御
- 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段階で行います:
- テストモードでの確認
- 設定ミスによるLet’s Encryptのレート制限を避けるため
- 正しく動作することを確認してから本番環境に移行
- 本番環境の構築
- テストモードで確認後、本番用の証明書を取得
- 実際のHTTPS環境の構築
具体的な手順
- リポジトリのクローン 以下のコマンドでプロジェクトをダウンロードします。
git clone https://github.com/superdoccimo/rev.git
cd rev
- 初期設定の変更
init-letsencrypt.sh
をテキストエディタで開き、以下の項目を設定します。domains=(あなたのドメイン名) # 例:example.com
email="管理者のメールアドレス"
staging=1 # テストモード
- テストモードでの実行 スクリプトに実行権限を付与し、実行します。
chmod +x init-letsencrypt.sh
sudo ./init-letsencrypt.sh
- 動作確認のポイント
- エラーメッセージが表示されていないことを確認
- ブラウザでドメインにアクセスして確認
- テストモードでは証明書の警告が表示されるのが正常です
- 本番モードへの切り替え
init-letsencrypt.sh
のstaging=1
をstaging=0
に変更し、再度実行します。sudo ./init-letsencrypt.sh
トラブルシューティング
問題が発生した場合は、以下の手順で確認します:
- Nginxのログを確認
docker compose logs nginx-proxy
- よくあるチェックポイント
- ドメインがサーバーの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時間間隔を必要に応じて調整
その他のカスタマイズオプション
- ログの設定
- アクセスログやエラーログの保存場所
- ログローテーションの設定
- リソース制限
- コンテナのメモリ制限
- ワーカープロセス数の調整
- 広告配信設定
- ads.txtファイルの配置
- アクセス制御の設定
これらの設定につきましては、必要に応じて段階的に実施されることをお勧めいたします。設定変更後は、以下の手順に従って操作を行ってください。
- Nginxの設定テストを実行
設定変更が正しく反映されているか確認するために、まずNginxの設定テストを実行してください。docker compose exec nginx-proxy nginx -t
テストが成功したことを確認してください。 - Nginxの再起動を実行
設定に問題がないことを確認後、Nginxを再起動して変更を適用します。docker compose restart nginx-proxy
- コンテナに入らずにNginxをリロード
コンテナにアクセスせずにNginxの設定をリロードする方法もございます。以下のコマンドを実行してください。docker compose exec nginx-proxy nginx -s reload
このコマンドにより、Nginxが現在の設定を再読み込みし、サービスを中断することなく設定変更を反映させることができます。
複数サイトの運用
リバースプロキシの大きな利点として、複数のWebサイトやサービスを簡単に管理できます。
例えば、以下のような状況を考えてみましょう:
- ブログサイト(WordPressなど)を8080ポートで運用
- ポートフォリオサイトを8888ポートで運用
通常であれば、以下のようなURLでアクセスする必要があります:
- http://example.com:8080 (ブログ)
- http://example.com:8888 (ポートフォリオ)
しかし、リバースプロキシを使うと、以下のようなスッキリとした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内の異なるサーバーへの転送を図示すると以下のようになります。
リバースプロキシ関連記事