Назад | Перейти на главную страницу

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

Я запускаю приложение Django, использую uWsgi за Nginx. Я занимался настройкой производительности и нагрузочным тестированием с помощью ApacheBench и обнаружил кое-что неожиданное, и мне интересно, может ли кто-нибудь мне объяснить. В моей конфигурации Nginx у меня есть директива перезаписи, которая перехватывает множество различных перестановок URL-адресов, а затем перенаправляет их на канонический URL-адрес, который я хочу использовать, например, он перехватывает www.mysite.com/whatever, www.mysite.co.uk/whatever и отправляет их всех 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;
    }
}

На самом деле ответ довольно прост. В вашем первом тесте (перенаправление) 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 одновременных запросов! ;)

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