web-dev-qa-db-ja.com

Nginx / uWsgi / DjangoサイトはURLを書き換えることでより多くのトラフィックを処理できます

Nginxの背後にあるuWsgiを使用してDjangoアプリを実行しています。ApacheBenchを使用してパフォーマンスチューニングと負荷テストを行っていますが、誰かが説明してくれるかどうか疑問に思う予期しない何かを発見しました。私のNginx構成には、多くの異なるURL順列をキャッチし、それらを使用したい正規URLに転送する書き換えディレクティブがあります。たとえば、www.mysite.com/whatever、www.mysite.co.uk/whateverをトラップします。そしてそれらすべてを http://mysite.com/whatever に転送します。

リダイレクトでリストされたURLのいずれか(つまり、最終的に転送される正規URLではない)に対して負荷テストを行うと、汗をかくことなく15000の同時接続を提供できます。

上記のテストがとにかく転送されると予想していた正規URLに対してテストをロードすると、ほとんど処理できなくなります。 15000リクエストのうち約4000をドロップし、確実に処理できるのは約9000のみです。

これは、テストに使用しているコマンドラインです。

ab -c15000 -n15000 http://www.mysite.com/somepath/

そして

ab -c15000 -n15000 http://mysite.com/somepath/

私はいくつかの異なるタイプを試しました-どの順序で行うかは変わりません。これは私には意味がありません-リダイレクトを含むリクエストがそれほど多くの同時接続を処理しない理由は理解できますが、それは起こっています逆に。誰か説明できますか?正規URLがより多くのトラフィックを処理できるURLであれば、私は本当にそれを好みます。

Nginxの設定を以下に投稿します。

助けてくれてありがとう!

server {
    server_name www.somesite.com  somesite.net www.somesite.net somesite.co.uk www.somesite.co.uk;
    rewrite ^(.*) http://somesite.com$1 permanent;
}

server {
    root   /home/Django/domains/somesite.com/live/somesite/;

    server_name  somesite.com somesite-live.myserver.somesite.com;

    access_log  /home/Django/domains/somesite.com/live/log/nginx.log;

    location / {
        uwsgi_pass unix:////tmp/somesite-live.sock;
        include    uwsgi_params;
    }

    location /media {
        try_files $uri $uri/ /index.html;
    }

    location /site_media {
        try_files $uri $uri/ /index.html;
    }

    location = /favicon.ico {
        empty_gif;
    }
}
3
Ludo

実際、答えは非常に簡単です。最初のテスト(リダイレクト)では、abは「301MovedPermanently」リクエストのベンチマークのみを行っています。 2番目のテストは、実際のコンテンツをテストすることです。

私が何を意味するかを説明するために、リダイレクトURLをカールさせます。次のようなものが表示されます。

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/0.8.52</center>
</body>
</html>

そのためだけに15000の同時リクエストを処理するのは難しくありません! ;)

4
incredimike

これを開発メーリングリストに提示しましたか?確かに非常に興味深い。完全なデバッグを有効にしてみましたか。コンパイル中に有効にする必要があったかもしれません。有効にしたら、正規のリクエストと別のリクエストを実行します。おそらく、デバッグログはいくつかの光を当てるでしょう。 2番目のserver_nameドメイン(somesite-live ..)を削除しようとしましたか?頑張って、あなたがそれを理解したら私たちに知らせてください!

0
CarpeNoctem