Nginx / uWsgi / Django 网站可以通过重写 URL 处理更多流量

Nginx / uWsgi / Django 网站可以通过重写 URL 处理更多流量

我正在运行一个 Django 应用程序,在 Nginx 后面使用 uWsgi。我一直在使用 ApacheBench 进行一些性能调优和负载测试,发现了一些意想不到的事情,我想知道是否有人可以为我解释一下。在我的 Nginx 配置中,我有一个重写指令,它可以捕获许多不同的 URL 排列,然后将它们转发到我希望使用的规范 URL,例如,它会捕获 www.mysite.com/whatever、www.mysite.co.uk/whatever 并将它们全部转发到http://mysite.com/whatever

如果我对列出的任何带有重定向的 URL(即,不是最终转发到的规范 URL)进行加载测试,它可以轻松服务 15000 个并发连接。

如果我针对规范 URL 进行加载测试(我预计上述测试无论如何都会被转发到该 URL),它几乎无法处理那么多。它将丢弃 15000 个请求中的大约 4000 个,并且只能可靠地处理大约 9000 个。

这是我用来测试的命令行:

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

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

我尝试了几种不同的类型 - 无论我按照哪种顺序执行,都没有区别。这对我来说没有意义 - 我可以理解为什么涉及重定向的请求可能无法处理如此多的并发连接,但情况恰恰相反。有人能解释一下吗?如果规范 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;
    }
}

答案1

其实答案很简单。在第一个测试(重定向)中,ab 仅对“301 永久移动”请求进行基准测试。第二个测试是测试您的实际内容。

为了说明我的意思,请卷曲您的重定向 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 个并发请求并不难!;)

答案2

您是否已将此提交给开发邮件列表?肯定非常有趣。您是否尝试过启用完整调试;您可能必须在编译期间启用它。启用后,向规范发出一个请求,向另一个请求发出另一个请求。也许调试日志会提供一些线索。您是否尝试过删除第二个 server_name 域(somesite-live..)?祝您好运,如果您弄明白了,请告诉我们!

相关内容