Я запускаю приложение 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 ..)? Удачи, дайте нам знать, если разберетесь!