- uWSGIとWebサーバーを接続したい!
Python と nginx を本番環境で繋ごうとする場合、アプリケーションサーバーとして uWSGI が使われることがよくあります。
この2つはログの確認が難しかったりで、動作確認まで結構苦労する方も多いのではと思います。
そこで、本記事では難しいことは抜きにして基礎的な内容をベースに統合の方法を解説していきます。
セットアップ方法
以下の流れでセットアップを進めます。
- nginx のインストール
- uWSGI のインストール
- uWSGI 設定ファイルの作成
- nginx の設定
- サービスの起動
- 動作確認
順番に解説していきます。
nginx のインストール
Linux 環境では、以下のコマンドを使います。
sudo apt-get install nginx
uWSGI のインストール
Python 環境に uWSGI をインストールします。
pip install uwsgi
uWSGI 設定ファイルの作成
uWSGI の設定は、uwsgi.ini
として以下のように記載します。
[uwsgi]
module = your_application_module
callable = app
socket = :8000
processes = 4
threads = 2
このように、アプリケーションのモジュール名・アプリケーションオブジェクト・ソケット・プロセス数などを記載していきます。
nginx の設定
nginx 側に uWSGI と通信するための設定をします。
まずは設定用のファイルを用意するため、以下のコマンドを実行。
touch /etc/nginx/sites-available/
さらに、リバースプロキシとして動作するようにしましょう。
server {
listen 80;
server_name your_domain.com;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
}
サービスの起動
uWSGI と nginx を起動します。
uwsgi --ini wsgi.ini
sudo systemctl start nginx
動作確認
きちんと動いているか、以下のコマンドで確認しましょう。
まずはnginxの確認からです。
sudo systemctl status nginx
active(running)
と表示されれば、成功です。
続いて uWSGI の確認です。
通常、uWSGI はバックグラウンドで実行されているので、以下のコマンドを使います。
ps aux | grep uwsgi
結果から、uWSGI のプロセスがあれば動作 OK です。
高度なNginxの設定とパフォーマンス最適化には、キャッシュの設定、接続の調整、セキュリティの強化などが含まれます。ここでは、効果的な設定例をいくつか紹介します。
パフォーマンス最適化とセキュリティ対策
パフォーマンス最適化とセキュリティ対策の基礎の部分だけさらっていきます。
- キャッシング
- Gzip圧縮
- リクエスト処理の最適化
- セキュリティの強化
上記について、順番に説明します。
キャッシング
nginx 側で静的ファイルのキャッシング設定をすることで、サーバー負荷低減と応答時間の短縮ができます。
server {
listen 80;
server_name example.com;
location /static/ {
root /path/to/static/files;
expires 30d;
add_header Cache-Control "public";
}
}
7, 8 行目の設定により、静的ファイルを30日間キャッシュします。
- expires 30d;
- サーバーからリソースが提供されてから30日間キャッシュする
Expires
ヘッダーに特定の日付を設定する
- add_header Cache-Control “public”;
- 公開キャッシュによって保存されることを示す
Cache-Control
ヘッダーで提供される
公開キャッシュとは、個人のコンピュータではなくサーバーなどの公の場所に保存されるキャッシュのことです。
Gzip 圧縮
nginx 側で Gzip 圧縮を有効にすると、クライアントに送信されるレスポンスが圧縮されてページ読み込み速度が向上します。
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6;
}
以下に各要素を解説します。
- gzip on;
- Gzip圧縮を有効化する
- gzip_vary on;
Vary: Accept-Encoding
ヘッダーをレスポンスに追加する- 圧縮を「受け入れるクライアント」と「受け入れないクライアント」の両方に対応するため
- gzip_proxied any;
- プロキシされた全リクエストに圧縮を実行
- プロキシ、ロードバランサ経由にも対応するため
- gzip_types ~;
- 圧縮を適用するコンテンツタイプを指定
- gzip_comp_level 6;
- 圧縮レベルを指定
- レベル1(最速、最低圧縮)〜レベル9(最も遅い、最高圧縮)
- レベル6は効率とパフォーマンスのバランスが良い標準的なもの
リクエスト処理の最適化
ネットワークとファイル送信の最適化をする例です。
http {
keepalive_timeout 65;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_max_body_size 8m;
}
各要素の役割は以下のとおりです。
- keepalive_timeout 65;
- キープアライブのタイムアウト時間を65秒に設定
- sendfile on;
- 静的ファイル配信を高速化し、CPU負荷を下げる
- カーネルスペースからユーザースペースへのコピーをスキップ
- tcp_nopush on;
- ヘッダー情報を集めて一度に送信する
tcp_nopush
はsendfile
が有効なときに使用される- TCPの
nagle
アルゴリズムを制御
- tcp_nodelay on;
nagle
アルゴリズムが無効になる- 送信可能なデータがあるとすぐにデータを送信するようになる
- レイテンシの削減に寄与
- client_max_body_size 8m;
- 大きなファイルのアップロードを制限
- クライアントからサーバーに送信できる最大リクエストボディサイズを指定
- ここでは8MBとしている
セキュリティの強化
セキュリティヘッダーを追加して情報漏洩のリスクを低減します。
server {
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}
それぞれの項目の説明をします。
- X-Frame-Options “SAMEORIGIN”:
- クリックジャッキング攻撃を防ぐ
- このヘッダーは、ウェブページがどのドメインからのフレーム内で表示できるかをブラウザに指示します。
SAMEORIGIN
オプションは、ページを含むフレームが同じオリジン(ドメイン)に属している場合のみ許可します。
- X-Content-Type-Options “nosniff”:
- MIMEタイプの混乱攻撃を防ぐ
- このヘッダーは、ブラウザが提供された
Content-Type
ヘッダーに従ってファイルを解釈するように強制します。nosniff
を指定すると、ブラウザはスクリプトやスタイルシートとして指定されていないMIMEタイプのファイルを実行しようとしません。これにより、
- X-XSS-Protection “1; mode=block”:
- このヘッダーは、クロスサイトスクリプティング(XSS)攻撃の防御を強化します。
1; mode=block
は、XSS攻撃が検出された場合にページのレンダリングをブロックするようブラウザに指示します。ただし、このヘッダーは一部の最新ブラウザでは非推奨とされており、より現代的なコンテンツセキュリティポリシー(CSP)による保護が推奨されています。
- このヘッダーは、クロスサイトスクリプティング(XSS)攻撃の防御を強化します。
- Strict-Transport-Security “max-age=31536000; includeSubDomains”:
- 全通信を HTTPS を通じて行うようブラウザに指示(通称 “HSTS”)
- 中間者攻撃によるデータの盗聴や改ざんを防ぐ
max-age=31536000
: 1年間有効にするincludeSubDomains
: 全サブドメインに適用する
まとめ
以上が uWSGI と nginx の基本的な統合方法でした。
まずは本記事の内容をご理解いただき、徐々にステップアップしていくと効率良く学習が進められるはずです。
また、当ブログでは順次技術的な発信を行なっています。
ぜひ他記事の方も、覗いてみてください。
コメント