Flask開発サーバーとgunicornにはいくつかの重要な違いがあります。これらの違いのため、本番環境ではgunicornなどのWSGIサーバーが推奨されます。
Flask開発サーバーの特徴
- デバッグと開発用:
- Flaskの開発サーバーは、開発とデバッグのために設計されています。
- 自動的にコードの変更を検出し、アプリケーションを再起動するホットリロード機能があります。
- デバッグモードでは、エラートレースバックとデバッガーが提供され、問題の特定が容易になります。
- パフォーマンスと安定性の欠如:
- 開発サーバーはシングルスレッドで動作し、高負荷環境や複数の同時接続に対して効率的にスケールしません。
- 高負荷や長時間の運用ではクラッシュしやすく、本番環境には不向きです。
- セキュリティの欠如:
- セキュリティ機能が限定的であり、本番環境での使用は推奨されません。
- デバッグモードの有効化は重大なセキュリティリスクを伴います。
gunicornの特徴
- プロダクションレディ:
- gunicorn(Green Unicorn)は、Python WSGI HTTPサーバーで、本番環境での使用を目的としています。
- 並行処理をサポートし、多数の同時接続を効率的に処理できます。
- マルチスレッドとマルチプロセス:
- gunicornは複数のワーカー(プロセスやスレッド)を生成し、負荷分散と高可用性を提供します。
- 各ワーカーは独立してリクエストを処理するため、単一のワーカーのクラッシュが全体のサービス停止につながりません。
- セキュリティ:
- gunicornは、TLS(SSL)暗号化などのセキュリティ機能をサポートしています。
- 安全な本番環境のための適切なセキュリティ設定が可能です。
- パフォーマンス:
- gunicornは高性能で、リクエストの処理速度や応答時間が優れています。
- ワーカー数やタイムアウト設定を調整することで、パフォーマンスを最適化できます。
- スケーラビリティ:
- 負荷分散やスケーリングのための設定が簡単に行えます。
- クラウド環境やコンテナ化された環境(例:Docker)での運用が容易です。
なぜ本番環境でgunicornを使用するのか?
- 安定性: gunicornは、長時間にわたる高負荷の運用に耐える安定性を提供します。
- セキュリティ: 本番環境に必要なセキュリティ機能をサポートしています。
- パフォーマンス: 複数のリクエストを効率的に処理でき、スケーラビリティも優れています。
- 設定可能性: 様々な環境設定を調整することで、パフォーマンスと安定性をさらに向上させることができます。
これらの理由から、本番環境ではgunicornのようなWSGIサーバーを使用することが推奨されます。
“gunicorn” は “Green Unicorn” の略称で、通常「ガニコーン」と発音されます。発音のガイドラインとしては「gun(ガン)」と「unicorn(ユニコーン)」を組み合わせたものです。ただし、アクセントは “gun” に置かれ、「ガニコーン」と言うのが一般的です。
日本語での発音は、「ガニコーン」または「グニコーン」とされることが多いです。どちらでも通じると思います。
確認事項
- アプリケーション動作の確認:
- ブラウザでEC2インスタンスのパブリックIPまたはドメイン名にアクセスして、アプリケーションが正しく動作していることを確認します。例:shコードをコピーする
http://<your-ec2-public-ip>
- セキュリティグループの設定:
- ポート80がセキュリティグループで開放されていることを確認します。セキュリティグループのインバウンドルールに以下の設定があることを確認します:タイププロトコルポート範囲ソースHTTP TCP 800.0.0.0/0 (または特定のIPアドレス)
- Firewallの設定:
- インスタンス内のファイアウォールがポート80のトラフィックをブロックしていないことを確認します。
追加の考慮事項
- エラーログの監視:
gunicorn
のログを監視して、エラーや警告がないか確認します。- ログファイルを指定する場合、
gunicorn
のオプションでログファイルを設定できます。 - 例:
sudo /home/ubuntu/venv/bin/gunicorn -b 0.0.0.0:80 app:app --access-logfile /var/log/gunicorn/access.log --error-logfile /var/log/gunicorn/error.log
- サービスとして設定:
gunicorn
をシステムサービスとして設定し、自動的に起動するようにすることを検討してください。これにより、サーバーが再起動されたときに自動的にアプリケーションが再起動されます。
システムサービスとして設定する方法
- サービスファイルの作成:
- 次の内容で
/etc/systemd/system/gunicorn.service
ファイルを作成します。 - iniコードをコピーする
[Unit] Description=gunicorn daemon After=network.target
[Service] User=ubuntu Group=www-data WorkingDirectory=/home/ubuntu/chouseikun ExecStart=/home/ubuntu/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/chouseikun/app.sock -m 007 wsgi:app
[Install] WantedBy=multi-user.target
- 次の内容で
- サービスのリロードと起動:shコードをコピーする
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
- Nginxの設定(オプション):
- より安定した環境のために、Nginxをリバースプロキシとして使用することを検討してください。
これで、gunicorn
が正常に起動し、アプリケーションが正しくリッスンしていることを確認できます。もしブラウザでアプリケーションにアクセスできない場合は、セキュリティグループの設定やファイアウォール設定を再度確認してください。