Сайт Nginx / uWsgi / Django может обрабатывать больше трафика с помощью перезаписи URL

Я использую приложение Django, использующее uWsgi за Nginx. Я занимался настройкой производительности и нагрузочным тестированием с использованием ApacheBench и обнаружил нечто неожиданное, и мне интересно, кто-нибудь сможет мне это объяснить. В моей конфигурации Nginx у меня есть директива перезаписи, которая перехватывает множество различных перестановок URL, а затем перенаправляет их на канонический URL, который я хочу использовать, например, он перехватывает www.mysite.com/wh независимо, www.mysite.co.uk/whwhat и пересылает их всех на http://mysite.com/whatever.

Если я загружаю тест по любому из URL-адресов, перечисленных с перенаправлением (т. Е. НЕ по каноническому URL-адресу, на который он в конечном итоге перенаправляется), он может обслуживать 15000 одновременных соединений без проблем.

Если я загружу тест по каноническому URL, который, как я и ожидал, отправил вышеупомянутый тест, он все равно не сможет обработать почти столько же. Он отбросит около 4000 из 15000 запросов и сможет надежно обработать только около 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;
    }
}

2 ответа

Решение

Ответ довольно прост, на самом деле. В вашем первом тесте (перенаправление) ab только сравнивает запрос "301 Moved Permanently". Второй тест проверяет ваш фактический контент.

Чтобы проиллюстрировать, что я имею в виду, сверните свой 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 одновременных запросов!;)

Вы представили это в списке рассылки разработчиков? Очень интересно точно. Вы пробовали включить полную отладку; возможно, вам пришлось включить его во время компиляции. После включения сделайте один запрос на канонический и один на другой. Возможно, журналы отладки проливают некоторый свет. Вы пытались удалить второй домен server_name (somesite-live..)? Удачи, дайте нам знать, если вы это выясните!

Другие вопросы по тегам