Эксперимент: разворачиваем сайт на JAMstack и сравниваем с WordPress
Мы в ispmanager опробовали бессерверный подход к веб-разработке JAMstack: развернули сайты на этой технологии и сравнили производительность с аналогичным проектом WordPress. В статье расскажем, какая технология лучше в скорости отдачи контента: JAMstack или WordPress.
Что такое JAMstack простыми словами
JAMstack – это подход к веб-разработке, когда сайт заранее собирается в статические файлы и обслуживается через CDN. Такая архитектура делает сайт быстрее, стабильнее и безопаснее, чем классические CMS. Ключевая идея JAMstack в отсутствии сервера, который рендерит страницы в момент запроса. Все страницы сайта генерируются один раз во время сборки, а не динамически при каждом запросе пользователя. Технология подходит для проектов с преимущественно статическим контентом, где важна скорость загрузки: базы знаний, Wiki, API-документация, лендинги и товарные каталоги, портфолио и резюме.
JAMstack основан на трех принципах, зашифрованных в его названии:
- JavaScript – вся динамика реализуется на клиенте.
- APIs – данные поступают через внешние API.
- Markup – страницы генерируются заранее в статические HTML-файлы.
Сборка страниц и отдача контента пользователю происходит так:
Разработчик коммитит изменения → Автоматическая сборка → Генерация всех HTML-страниц → Загрузка на CDN → Пользователь получает HTML из CDN
Ответ на запрос пользователя должен поступить почти мгновенно, ведь готовый HTML уже лежит где-то на ближайшем CDN-сервере. Мы решили проверить, действительно ли все будет работать так быстро, и проверили стрессовое тестирование JAMstack.
Выбираем платформу для JAMstack
Существует довольно много платформ с поддержкой JAMstack. Большинство из них предполагает структуру SaaS панели на сайте проекта для разработки блога, сайта и деплоя на специализированных CDN хостингах: Vercel, Netlify, AWS Amplify, Cloudflare. Ни один из вышеперечисленных проектов не подходил, поскольку нашей задачей было развернуть блог на собственном сервере с ispmanager. После долгих поисков остановились на инструменте Prismic.
Prismic — это сервис для создания сайтов, где контент отделен от дизайна и отдается через быстрый API на статические фронтенды, например, Next.js.
Сайты на Prismic из кусочков-слайсов. Это переиспользуемые компоненты (например, тексты, изображения, галереи), которые можно комбинировать для быстрой сборки страниц.
Создаем сайт на JAMstack
Для нашего JAMstack-проекта в панели ispmanager был создан сайт с Node.js обработчиком последней доступной версии 25.5.0 и настроен для работы с Next.js приложениями, как описано в статье Установка Next.js в ispmanager 6.
Большинство Next.js проектов запускаются на 3000 порту, поэтому было внесено изменение в конфиг ispmanager — порт по умолчанию 10000 заменили на 3000:
| # grep NodeJsBackendBind /usr/local/mgr5/etc/ispmgr.conf NodeJsBackendBind 127.0.0.1:3000 |
На prismic.io был создан аккаунт с бесплатным тарифом и развернут репозиторий нашего проекта с именем ispmanager. Там удобно показана пошаговая инструкция по развертыванию проекта и DevTool slicemachine внутри него.
Здесь iii8 — название тестового репозитория, в нашем случае ispmanager.

Запускаются все эти команды внутри docroot нашего сайта — /var/www/www-root/data/www/changed.pavuk.space/
Slicemachine запускается на 9999 порту:
~/www/changed.pavuk.space/ispmanager$ npm run slicemachine
> my-prismic-site@0.1.0 slicemachine
> start-slicemachine
Slice Machine v2.21.1 → Running at http://localhost:9999Вот такой интерфейс для работы со слайсами нам предлагают:

После создания слайсов переходим в Review changes и кнопкой Push отправляем заготовки в панель нашего репозитория https://ispmanager.prismic.io для последующей сборки и компоновки нашего сайта.

Важно задать все переменные окружения проекта для успешной публикации сайта:
$ cat .env.local
PRISMIC_ENDPOINT=https://ispmanager.cdn.prismic.io/api/v2
NEXT_PUBLIC_SITE_NAME=ispmanager
NEXT_SERVER_ACTIONS_ENCRYPTION_KEY=mXXeFoGrXv22HyTMl0CzcUSzKDfdVZysgXrDaF1ZO+s=Ключ для Next.js сервера генерируем с помощью команды:
$ openssl rand -base64 32
mXXeFoGrXv22HyTMl0CzcUSzKDfdVZysgXrDaF1ZO+s=После этого запускаем проект в dev-режиме и начинаем создавать сайт:
~/www/changed.pavuk.space/ispmanager$ npm run dev
> my-prismic-site@0.1.0 dev
> next dev
▲ Next.js 16.1.6 (Turbopack)
- Local: http://localhost:3000
- Network: http://164.90.xxx.xxx:3000
- Environments: .env.local
✓ Starting...
✓ Ready in 3.3sЗапуск в dev-режиме — необязательное условие, сайт можно создавать и без этого. После запуска все изменения попадут в проект автоматически.
После того как сайт закончен, его нужно собрать для работы в режиме Production:
~/www/changed.pavuk.space/ispmanager$ npm run build
> my-prismic-site@0.1.0 build
> next build
▲ Next.js 16.1.6 (Turbopack)
- Environments: .env.local
Creating an optimized production build ...
✓ Compiled successfully in 38.8s
✓ Finished TypeScript in 16.4s
✓ Collecting page data using 1 worker in 1627.2ms
✓ Generating static pages using 1 worker (7/7) in 844.3ms
✓ Finalizing page optimization in 35.7ms
Route (app)
┌ ○ /
├ ○ /_not-found
├ ƒ /api/exit-preview
├ ƒ /api/preview
└ ƒ /api/revalidate
○ (Static) prerendered as static content
ƒ (Dynamic) server-rendered on demandИ уже после этого запускаем режим Production:
~/www/changed.pavuk.space/ispmanager$ npm run start
> my-prismic-site@0.1.0 start
> next start
▲ Next.js 16.1.6
- Local: http://localhost:3000
- Network: http://164.90.xxx.xxx:3000
✓ Starting...
✓ Ready in 1975msВ nginx-конфиге сайта в панели ispmanager мы прописали правильный порт проксирования во всех местах:
proxy_pass http://127.0.0.1:3000;
proxy_redirect http://127.0.0.1:3000 /;
Важная деталь: Next.js в режиме Production — не то же самое, что чистый JAMstack.
Мы видим, что проект использует Next.js с динамическими роутами (ƒ routes), а чистый JAMstack подразумевает полностью статическую генерацию (SSG). Таким образом, Next.js в режиме next start запускает Node.js сервер, что противоречит принципу «нет сервера». Вероятно, это связано с особенностями архитектуры Prismic.
Назовем созданный проект JAMEstack + Node.js. А для чистоты эксперимента создадим еще один проект — статичный проект без Next.js.
Создаем действительно статичный сайт на JAMstack
Попробуем использовать next export, чтобы создать полностью статический сайт, который генерирует в директорию ou статические файлы (HTML, CSS, JS) — их можно отдавать напрямую через веб-сервер nginx или apache без Node.js.
Мы собрали исключительно статический контент в out, создали сайт без обработчика, положили туда содержимое директории out и получил почти полноценный JAMstack-сайт, только CDN не хватает.
Сделали мы это в корне проекта ispmanager так:
1. Удалили все динамические роуты.
$ rm -rf app/api/2. Обновили конфиг next.config.js.
$ cat > next.config.js << 'EOF'
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
images: {
unoptimized: true,
},
}
module.exports = nextConfig
EOF3. Собрали проект.
$ npm run build4. Проверили результат.
$ ls -la out/Назовем созданный сайт JAMEstack Static.
В дальнейшем исследовании производительности будем участвовать три сайта:
- JAMEstack + Node.js — сайт с динамическими элементами;
- JAMEstack Static — статический сайт;
- WordPress — стандартный сайт с небольшим тестовым контентом, который мы создали стандартными средствами ispmanager.
Чтобы тестирование было честным, запустили проекты на одном и том же сервере ispmanager: Digital Ocean с 2Gb RAM, 1 CPU, 50Gb disk.
TTFB-тест — время до первого байта ответа от сервера
WordPress сайт:
# for i in {1..5}; do curl -o /dev/null -s -w "Замер $i - TTFB: %{time_starttransfer}s\n" https://jm.pavuk.space; done
Замер 1 - TTFB: 0.174238s
Замер 2 - TTFB: 0.124633s
Замер 3 - TTFB: 0.127694s
Замер 4 - TTFB: 0.113787s
Замер 5 - TTFB: 0.129179sСреднее значение: 0.134s (134ms)
JAMstack + Node.js:
# for i in {1..5}; do curl -o /dev/null -s -w "Замер $i - TTFB: %{time_starttransfer}s\n" https://changed.pavuk.space; done
Замер 1 - TTFB: 0.062486s
Замер 2 - TTFB: 0.046602s
Замер 3 - TTFB: 0.044713s
Замер 4 - TTFB: 0.037619s
Замер 5 - TTFB: 0.042070sСреднее значение: 0.047s (47ms)
JAMstack+Node.js сайт показывает почти в три раза более быстрый TTFB, чем WordPress, что говорит о значительно более быстром серверном отклике.
Он быстрее примерно на 65% (в ~2.8 раза), что подтверждает преимущество статической генерации и отсутствия серверной обработки при первом байте. Это напрямую улучшает восприятие скорости сайта и потенциально влияет на SEO.
JAMstack Static
# for i in {1..5}; do curl -o /dev/null -s -w "Замер $i - TTFB: %{time_starttransfer}s\n" https://rest.pavuk.space; doneЗамер 1 – TTFB: 0.052369s
Замер 2 – TTFB: 0.040621s
Замер 3 – TTFB: 0.060125s
Замер 4 – TTFB: 0.041981s
Замер 5 – TTFB: 0.046601s
Среднее значение: 0.048s (48ms) сопоставимо с JAMstack+Node.js.
Тестирование с Lighthouse
Lighthouse — это инструмент аудита сайта от Google, который прогоняется в Chrome и даёт числовые оценки от 0 до 100 и конкретные рекомендации по улучшению показателей. Он проверяет четыре ключевые области:
1. Performance — как быстро загружается сайт:
- LCP (Largest Contentful Paint);
- CLS (Cumulative Layout Shift);
- INP (Interaction to Next Paint);
- TTFB и др.
2. Accessibility — насколько сайт удобен для людей с ограниченными возможностями:
- контраст текста;
- alt-тексты для изображений;
- корректная навигация с клавиатуры.
3. Best Practices — безопасность и техническая корректность:
- HTTPS;
- отсутствие уязвимостей;
- корректные API и ресурсы.
4. SEO — базовая поисковая оптимизация:
- meta-теги;
- robots.txt;
- корректные заголовки страниц.
Тест проводился CLI-утилитой без запуска браузера с выводом результата в HTML файл:
JAMEstack+Node.js
# lighthouse https://jm.pavuk.space --chrome-flags="--headless" --output-path=./lighthouse-wordpress-report.htmlStatic JAMstack
# lighthouse https://сchanged.pavuk.space --chrome-flags="--headless" --output-path=./lighthouse-wordpress-report.htmlWordPress
# lighthouse https://rest.pavuk.space --chrome-flags="--headless" --output-path=./lighthouse-wordpress-report.html Полные детальные HTML файлы отчетов Lighthouse:
First Contentful Paint (FCP)
Быстрее всего у Jamstack Static (1.1 сек.), далее WordPress (1.2 сек.) и Jamstack + Node.js сервер (1.2 сек.).
Largest Contentful Paint (LCP)
Лучший результат у WordPress (1.6 сек.) и Jamstack + Node.js сервер (1.6 сек.), Jamstack Static незначительно отстает (1.7 сек.).
Speed Index
Jamstack + Node.js сервер показывает наилучшую скорость заполнения контента (1.8 сек.), WordPress — 2.0 сек., Jamstack Static — 2.1 сек..
Все три конфигурации демонстрируют максимально возможные оценки (100/100) по всем категориям Lighthouse. Различия в скоростных метриках (FCP, LCP, Speed Index) минимальны и находятся в пределах погрешности измерений. Это говорит о высоком уровне оптимизации каждой из представленных систем.
Нагрузочное тестирование с ApacheBench
Базовый тест (100 запросов, 1 одновременный)
Для WordPress
# ab -n 100 -c 1 https://jm.pavuk.space/
Time taken for tests: 10.991 seconds
Requests per second: 9.10 [#/sec] (mean)
Time per request: 109.907 [ms] (mean)
Transfer rate: 772.38 [Kbytes/sec] receivedДля JAMstack сайта с сервером Node.js
# ab -n 100 -c 1 https://changed.pavuk.space/
Time taken for tests: 3.985 seconds
Requests per second: 25.09 [#/sec] (mean)
Time per request: 39.850 [ms] (mean)
Transfer rate: 2920.93 [Kbytes/sec] receivedДля Static JAMstack
# ab -n 100 -c 1 https://rest.pavuk.space/
Time taken for tests: 3.786 seconds
Requests per second: 56.00 [#/sec] (mean)
Time per request: 17.859 [ms] (mean)
Transfer rate: 6439.06 [Kbytes/sec] receivedСтрессовое тестирование (1000 запросов, 50 одновременных)
Для WordPress
# ab -n 1000 -c 50 https://jm.pavuk.space/
Time taken for tests: 119.580 seconds
Requests per second: 8.36 [#/sec] (mean)
Time per request: 5979.022 [ms] (mean)
Transfer rate: 709.90 [Kbytes/sec] receivedДля JAMstack с сервером Node.js
# ab -n 1000 -c 50 https://changed.pavuk.space/
Time taken for tests: 40.512 seconds
Requests per second: 24.68 [#/sec] (mean)
Time per request: 2025.623 [ms] (mean)
Transfer rate: 2873.15 [Kbytes/sec] receivedДля Static JAMstack
# ab -n 1000 -c 50 https://rest.pavuk.space/
Time taken for tests: 11.196 seconds
Requests per second: 89.32 [#/sec] (mean)
Time per request: 559.789 [ms] (mean)
Transfer rate: 10271.12 [Kbytes/sec] receivedСравнительные результаты основных тестов
Потребление CPU при стрессовом тесте для JAMstack сайта с сервером Node.js доходит до 47%, для WordPress сайта до 100%, а для JAMstack сайта до 15% Потребление памяти во всех трех случаях возрастает незначительно.
Таким образом, результаты тестирования демонстрируют подавляющее преимущество JAMstack (Static) архитектуры по всем ключевым метрикам:
Производительность: чистый JAMstack обрабатывает запросы в 6 раз быстрее базового WordPress и в 3.5 раза быстрее решения на Node.js при стрессовой нагрузке.
Масштабируемость: при увеличении числа одновременных подключений (с 1 до 50) пропускная способность JAMstack (Static) выросла, в то время как WordPress показал деградацию производительности.
Эффективность ресурсов: WordPress полностью утилизирует CPU (100%), становясь «узким местом» системы. JAMstack (Static) потребляет всего 15% CPU, что обеспечивает колоссальный запас прочности и снижает затраты на инфраструктуру.
Сетевая эффективность: Transfer rate у JAMstack (Static) в 14 раз выше, чем у WordPress, что свидетельствует о минимальных задержках при отдаче контента.
Переход от монолитной архитектуры WordPress к JAMstack позволяет радикально снизить нагрузку на сервер и ускорить отклик системы для конечного пользователя.
Выводы
JAMstack является идеальным выбором для статических проектов с большим количеством контента, где критичны скорость и SEO. Он дает отличную скорость отклика, устойчив к нагрузкам и при этом экономит вычислительные мощности.
Однако для подавляющего числа современных сайтов требуется динамическое формирование страниц. В таким случаях классический WorPress выглядит практичным решением: он предлагает готовую экосистему, множество плагинов и инструментов из коробки, позволяя быстрее запускать и масштабировать проекты без глубокого погружения в современный JavaScript-стек


