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

Nginx: оптимизация времени отклика сервера для веб-сайта с кешированием HTTP

У меня есть веб-сайт, на котором все страницы обслуживаются из 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.

Я ожидаю, что у вас возникнут еще несколько вопросов, но вместо того, чтобы сосредоточиться на деталях всех возможных областей, которые могут вызывать беспокойство, как насчет того, чтобы вы попробовали описанное выше, а затем добавили некоторые подробности того, что вы узнали?