Сайт 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..)? Удачи, дайте нам знать, если вы это выясните!