У меня есть веб-сайт, на котором все страницы обслуживаются из http-кеша nginx и редко становятся недействительными или просрочены.
Средний общий размер загрузки страницы составляет около 2 МБ. Но, несмотря на то, что это статический сайт без забавной логики, мой ответ сервера составляет около секунды.
Я записал nginx $request_time
и это примерно 400 миллисекунд от сервера
и каждый файл в среднем 20-30 КБ
400 миллисекунд кажутся абсурдными.
Я позади Cloudflare и
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_timeout 300s;
keepalive_requests 10000;
Что мне делать, чтобы снизить время отклика до диапазона 150 миллисекунд?
Редактировать: Первая часть моего тюнинга.
Я понял, что у меня не включен SSL OSCP. Изменен код для
# https://github.com/autopilotpattern/wordpress/issues/19
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_certificate /etc/letsencrypt/live/site.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/site.com/chain.pem;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
Я сообщу об улучшении.
Изменить 2:
Вот результат теста веб-страницы для подключения 3G из Индии к серверу на западном побережье США.
Не думаю, что вы подходите к вопросу оптимизации. Для начала нужно узнать, куда идет время.
Я не думаю, что вы говорите о времени для отображения в вашем браузере, поэтому пока не используйте его. Используйте легкие инструменты командной строки, такие как curl и ab, для сбора информации о времени. Использование таких инструментов со своего рабочего стола или хорошо подключенного сервера, отличного от того, который обслуживает этот сайт, может быть полезным для исключения проблем с вашей локальной системой, сетью или браузером.
Запустите несколько тестов с помощью ab (поставляется с инструментами apache) или curl, запустив их на своем сервере, так что вы исключите сетевые задержки и облачные вычисления. вам нужно будет поиграть с параметрами подключения к локальному http-серверу, а не к тому месту, на которое указывает DNS, и при этом использовать правильную Host
заголовок. Как сейчас выглядит ваша задержка? Это должно сказать вам, в вашем веб-сервере или вне его. Он включает в себя преимущества вашего кеша nginx, но не кеширование от Cloudflare.
Если этот бит на вашем сервере быстрый, то вы смотрите на облачную вспышку и сеть. В противном случае продолжайте смотреть на свой сервер.
Помимо рассмотрения того, сколько времени занимает запрос с точки зрения клиента, вы также можете изменить формат журнала nginx, чтобы получить больше информации о времени в ваших журналах. Обычно я использую что-то вроде:
log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time" "$msec"';
Я оставляю это ведение журнала на постоянной основе для большинства серверов, с которыми я работаю, если позволяют обстоятельства.
Если вы все еще видите свою задержку, записанную в $request_time
поле в ваших журналах, тогда top
или atop
или подобное может помочь вам определить, тратится ли время на nginx или он ожидает какого-то другого процесса.
Когда вы выясните, какой процесс имеет задержку, вы, вероятно, сможете выяснить, что происходит, используя strace
. ltrace
иногда столь же полезно, а иногда необходимо перейти к полному профилю или трассировке с информацией о времени с помощью отладчика, хотя обычно это довольно трудоемкий подход. Определенно начнем с strace
.
Я ожидаю, что у вас возникнут еще несколько вопросов, но вместо того, чтобы сосредоточиться на деталях всех возможных областей, которые могут вызывать беспокойство, как насчет того, чтобы вы попробовали описанное выше, а затем добавили некоторые подробности того, что вы узнали?