Установка и запуск Hexo на Ubuntu 20.04

Hexo — это статический генератор блогов на базе Node.js. Hexo позволяет писать записи в Markdown; при генерации Markdown конвертируется в статические HTML-файлы с использованием заданной темы.
Почему Hexo отличается от традиционных движков, например WordPress: WordPress формирует страницы динамически, исполняя PHP при каждом запросе, тогда как Hexo генерирует статические файлы заранее. Статические сайты обычно безопаснее, проще в обслуживании и быстрее при доставке через CDN.
В этом руководстве вы пройдёте все шаги: от подготовки сервера до рабочего публичного сайта, включая примеры команд, конфигурации Nginx и автоматического обновления SSL.
Для кого это руководство
- Системные администраторы и разработчики, которые хотят быстро поднять статический блог.
- Люди, желающие заменить динамическую CMS статическим сайтом для повышения безопасности и производительности.
Ключевые термины в одну строку:
- Hexo: статический генератор сайтов на Node.js.
- Hexo CLI: утилита командной строки для создания и управления блогом.
- Netlify: платформа для статических сайтов с автоматическим SSL.
Содержание (кратко)
- Предварительные требования
- Настройка брандмауэра
- Установка Node.js и Hexo
- Настройка Hexo, тема и публикация поста
- Установка плагина и тестовый сервер
- Генерация статических файлов и конфигурация Nginx
- Установка SSL через Let’s Encrypt
- Обновление Hexo и развёртывание (Netlify и альтернативы)
- Чек-листы, безопасность, отладка, критерии приёмки
Предварительные требования
- Сервер на Ubuntu 20.04 с учетной записью не-root, имеющей sudo-привилегии.
- Установленный Git. Если Git ещё не установлен, выполните:
$ sudo apt install git
$ git config --global user.name 'Your Name'
$ git config --global user.email '[email protected]'- Аккаунт на GitHub (или другой Git-платформе) для хранения своих тем/резервных копий.
Важно: используйте сильный пароль и по возможности подключите двухфакторную аутентификацию для аккаунтов (GitHub/Netlify).
Настройка брандмауэра
Ubuntu 20.04 поставляется с Uncomplicated Firewall (UFW). Если он отсутствует, установите его:
$ sudo apt install ufwРазрешите SSH (рекомендуется делать это до включения брандмауэра, иначе вы рискуете потерять доступ):
$ sudo ufw allow 'OpenSSH'Включите UFW:
$ sudo ufw enableРазрешите порт 4000, который использует тестовый сервер Hexo:
$ sudo ufw allow 4000Откройте порты HTTP и HTTPS, которые понадобятся позже для Nginx/Let’s Encrypt:
$ sudo ufw allow http
$ sudo ufw allow httpsПроверьте статус брандмауэра:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
4000 ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
4000 (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)Важно: убедитесь, что ваши правила UFW соответствуют политике безопасности вашей организации. Если сервер находится за облачным балансировщиком, проверьте дополнительные правила у провайдера.
Установка Node.js
Hexo работает поверх Node.js, поэтому сначала добавим репозиторий NodeSource для стабильной ветки Node 14 (LTS на момент написания):
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install nodejsПроверьте версию Node.js:
$ node --version
v14.15.0Замечание: при обновлении Hexo и плагинов иногда требуется более новая версия Node.js. Если вы работаете над долгосрочным проектом, проверьте совместимость темы и плагинов с вашей версией Node.
Установка Hexo CLI и подготовка директории сайта
Установите глобально hexo-cli:
$ sudo npm install hexo-cli -gСоздайте рабочую директорию и задайте права:
$ sudo mkdir -p /var/www/hexo
$ sudo chown -R $USER:$USER /var/www/hexo
$ sudo chmod -R 755 /var/www/hexo
$ cd /var/www/hexoИнициализируйте проект Hexo:
$ hexo init
INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git
INFO Install dependencies
... (npm install лог)
INFO Start blogging with Hexo!Установите зависимости (если hexo init не сделал этого автоматически):
$ npm installПроверьте структуру директории:
$ ls
_config.yml node_modules package-lock.json package.json scaffolds source themesКороткая справка по ключевым папкам:
- _config.yml — главный конфигурационный файл Hexo.
- node_modules — зависимости проекта.
- source — содержимое сайта (публикуемые страницы и медиа).
- source/_posts и source/_drafts — папки для постов.
- themes — темы оформления.
Конфигурация Hexo
Откройте основной файл конфигурации:
$ nano _config.ymlНайдите секцию Site и отредактируйте основные параметры:
# Site
title: Hexo
subtitle: ''
description: ''
keywords:
author: John Doe
language: en
timezone: ''Рекомендации:
- title — название вашего сайта.
- description и keywords помогут при SEO и при импорте метаданных в некоторые темы.
- language и timezone установите в соответствии с регионом.
Проверьте секцию URL и permalink, чтобы корректно настроить структуру ссылок:
# URL
url: http://example.com
root: /
permalink: :year/:month/:day/:title/
permalink_defaults:
pretty_urls:
trailing_index: true
trailing_html: trueСовет: используйте https:// в значении url, если вы заранее планируете SSL. Для nicer URL отключите trailing_index и trailing_html.
Рекомендация по удобству: установите default_layout: draft и post_asset_folder: true, чтобы новые посты создавались как черновики и имели отдельную папку для медиа-файлов.
Сохраните изменения (Ctrl+X, Y).
Установка темы
По умолчанию Hexo поставляется с темой Landscape. Для более продвинутых возможностей можно установить стороннюю тему из репозитория на GitHub.
Пример: установка темы Next:
$ cd /var/www/hexo
$ git clone https://github.com/theme-next/hexo-theme-next themes/nextЗатем в /var/www/hexo/_config.yml замените theme: landscape на:
theme: nextДополнительные настройки темы хранятся в themes/next/_config.yml.
Важно: после смены темы изучите её документацию — часто требуется установка дополнительных плагинов или секций в конфиге.
Создание и публикация поста
Создадим первый пост:
$ hexo new first-post
INFO Validating config
INFO Created: /var/www/hexo/source/_drafts/first-post.mdОткройте файл для редактирования:
$ nano ./source/_drafts/first-post.mdКаждый пост должен содержать front-matter (YAML или JSON) в начале файла. Пример front-matter:
title: Howtoforge's First Post
tags:
- test
categories:
- Hexo
comments: true
date: 2020-11-14 00:00:00
---
## Markdown goes here.
This is our first post!Пример вставки изображения в пост (тег плагина asset_img используется темой):
{% asset_img "example.jpg" "This is an example image" %}Затем поместите файл example.jpg в папку source/_posts/first-post (или source/_drafts/first-post в зависимости от статуса).
Публикуем пост (перемещаем из drafts в posts):
$ hexo publish first-post
INFO Validating config
INFO Published: /var/www/hexo/source/_posts/first-post.mdПост станет виден после генерации статики или при запуске тестового сервера.
Установка плагина
Hexo имеет сотни плагинов. Все они — npm-пакеты. Для примера установим hexo-filter-nofollow:
$ cd /var/www/hexo
$ npm i hexo-filter-nofollow --saveДобавьте конфигурацию плагина в _config.yml:
nofollow:
enable: true
field: site
exclude:
- 'exclude1.com'
- 'exclude2.com'Опции:
- enable: включает плагин.
- field: область применения: site или post.
- exclude: белый список доменов.
Тестовый сервер Hexo
Hexo включает простой локальный сервер для проверки контента до генерации статики:
$ hexo serverОткройте в браузере http://yourserverIP:4000 — вы увидите стартовую страницу блога.

Остановить сервер можно комбинацией Ctrl+C в терминале.
Генерация статических файлов
Тестовый сервер показывает сайт в режиме разработки. Чтобы получить готовые файлы для раздачи через Nginx или CDN, сгенерируйте статические файлы:
$ hexo generateГотовые файлы находятся в /var/www/hexo/public.
Установка и настройка Nginx
Установим Nginx и настроим виртуальный хост для раздачи содержимого из /var/www/hexo/public.
$ sudo apt install nginx
$ sudo nano /etc/nginx/sites-available/hexo.confПример конфигурации (отредактируйте server_name и пути под ваш домен):
server {
server_name hexo.example.com;
root /var/www/hexo/public;
index index.html index.htm;
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/letsencrypt/live/hexo.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hexo.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES25>
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
location / {
try_files $uri $uri/ =404;
}
}
server {
if ($host = hexo.example.com) {
return 301 https://$host$request_uri;
}
server_name hexo.example.com;
listen 80;
listen [::]:80;
return 404;
}Активируйте конфигурацию:
$ sudo ln -s /etc/nginx/sites-available/hexo.conf /etc/nginx/sites-enabled/Отредактируйте /etc/nginx/nginx.conf — увеличьте server_names_hash_bucket_size и types_hash_max_size, если Nginx жалуется:
Добавьте перед include /etc/nginx/conf.d/*.conf:
server_names_hash_bucket_size 64;И обновите types_hash_max_size до 4096:
types_hash_max_size 4096;Проверка синтаксиса и перезапуск:
$ sudo nginx -t
$ sudo systemctl restart nginxСовет: используйте systemd timer или watch файлов на предмет изменений конфигурации, если вы часто меняете виртуальные хосты.
Установка SSL через Let’s Encrypt (Certbot)
Установим Certbot, остановим Nginx на время выдачи сертификата, создадим dhparam и настроим автоматическое обновление.
$ sudo apt install certbot
$ sudo systemctl stop nginx
$ sudo certbot certonly --standalone -d hexo.yourdomain.com --preferred-challenges http --agree-tos -n -m [email protected] --keep-until-expiring
$ sudo systemctl start nginx
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048Настройка автоматического обновления сертификата в crontab (пример запуска certbot каждый день в 02:25):
$ sudo crontab -eДобавьте строку:
25 2 * * * /usr/bin/certbot renew --quiet --pre-hook 'systemctl stop nginx' --post-hook 'systemctl start nginx'Важно: используйте прямые одинарные кавычки в crontab для корректной подстановки команд.
Обновление Hexo
Перейдите в папку проекта:
$ cd /var/www/hexoПри обновлении на мажорную версию Hexo вручную измените package.json, например:
{"hexo": "^5.0.0"}(Отредактируйте зависимость hexo до нужной версии, затем запустите):
$ npm updateПримечание: всегда делайте резервную копию package.json и package-lock.json перед крупным обновлением.
Развёртывание: Nginx vs. Netlify и другие варианты
Hexo можно раздавать несколькими способами:
- Nginx/Apache на собственном сервере (как в этом руководстве).
- Платформы для статических сайтов: Netlify, Vercel — простая интеграция и автоматический SSL.
- Облачные хранилища + CDN (GitHub Pages, S3 + CloudFront).
- Контейнеры: собрать и раздавать через Docker.
Пример публикации на Netlify с использованием CLI (быстрый способ развернуть /var/www/hexo/public):
$ sudo npm install netlify-cli -g
$ netlify login
$ cd /var/www/hexo/public
$ netlify deploy
# При проверке, если всё хорошо
$ netlify deploy --prodNetlify имеет автоматическое управление SSL — если вы используете Netlify, конфигурация Nginx и Certbot не потребуется.
Отладка и часто встречаемые проблемы
- Проблема: 403/404 при доступе к статическим файлам. Проверьте права файлов и root в конфигурации Nginx.
- Проблема: тема ломает сборку. Верните package.json и node_modules из резервного состояния, удалите node_modules и выполните npm install.
- Проблема: Certbot не может получить доступ к порту 80 — убедитесь, что Nginx остановлен или укажите –webroot и укажите корректную папку.
Полезная команда для очистки и повторной генерации:
$ hexo clean
$ hexo generateБезопасность и жёсткая настройка
- Обновляйте Ubuntu и пакеты: sudo apt update && sudo apt upgrade.
- Используйте ограниченные права для файлов сайта, например 755 для директорий и 644 для файлов.
- Закройте ненужные порты и доступ по SSH только с доверенных IP или через VPN.
- Если используете Netlify, включите двухфакторную аутентификацию в аккаунте.
- Периодически проверяйте зависимости npm на уязвимости: npm audit.
Чек-листы (быстрое действие)
Чек-лист для первоначальной настройки сервера:
- Добавлен и настроен non-root пользователь с sudo.
- Установлен Git и настроен git config.
- Настроен UFW и разрешён OpenSSH, http, https, 4000.
- Установлен Node.js и hexo-cli.
- Создана папка /var/www/hexo и заданы права.
- Инициализирован Hexo и установлены зависимости.
Чек-лист перед выходом в продакшн:
- Сгенерированы статические файлы в public.
- Nginx настроен и протестирован (nginx -t).
- Получен SSL сертификат и настроено автоматическое обновление.
- Проверены права доступа и SELinux/AppArmor политики (если применимо).
Чек-лист обновления Hexo:
- Сделана резервная копия package.json и source.
- Обновлены зависимости в тестовом окружении.
- Прогнан hexo generate и проверена сборка.
Модель принятия решений при выборе способа хостинга
Mermaid-диаграмма выбора способа развёртывания:
flowchart TD
A[Нужен контролируемый сервер?] -->|Да| B[Использовать Nginx на VPS]
A -->|Нет| C[Использовать Netlify / Vercel]
B --> D[Настроить Let's Encrypt]
C --> E[Настроить CI/CD деплой из Git]
D --> F[Мониторинг и автообновление сертификата]
E --> FКритерии приёмки
- Сайт доступен по HTTPS и возвращает 200 при запросе главной страницы.
- Сгенерированные статические файлы находятся в /var/www/hexo/public.
- После публикации новой записи и вызова hexo generate содержимое обновилось и доступно.
- Автообновление SSL работает (проверить после симуляции истечения сертификата или вручную вызвать certbot renew –dry-run).
Плейбук: развёртывание и откат
Плейбук для развёртывания:
- На локальной машине: git pull; hexo generate.
- Скопировать public на сервер (rsync/scp) или запустить CI, который пушит в Netlify.
- На сервере: sudo systemctl reload nginx.
- Проверить страницу и логи /var/log/nginx/error.log.
Откат:
- Если новая версия сломала сайт, восстановите public из резервной копии.
- sudo systemctl reload nginx.
- Если проблема в зависимости — восстановите package-lock.json и node_modules и перезапустите сборку.
Тесты и критерии приёмки (коротко)
- Open http://localhost:4000 и проверить, что тестовый сервер отвечает.
- Проверить, что все статические ресурсы (css/js/images) возвращают код 200.
- Проверить корректную работу плагина nofollow при включённой опции.
Совместимость и миграционные заметки
- Если у вас старая версия Hexo (v3/v4), перед обновлением на мажорную версию внимательно читайте changelog темы и плагинов.
- При переходе между версиями Node используйте nvm для тестирования: nvm install
&& nvm use .
Локальные альтернативы и подводные камни
- GitHub Pages — простая и бесплатная альтернатива для простых блогов, но ограничена в настройке HTTPS/доменов.
- S3 + CloudFront — хорош для глобальной доставки, но потребует управления сертификатами и политиками.
- Если тема использует сборщики фронтенда (webpack, gulp), убедитесь, что все dev-зависимости установлены локально при генерации.
Маленькая сводка ключевых чисел
- Порт тестового сервера: 4000
- Порты для WWW: 80 (HTTP), 443 (HTTPS)
- Рекомендуемый DH параметр: 2048 бит
- Рекомендуемая версия Node: LTS (например, 14.x на момент примера)
Краткий глоссарий (1 строка каждый)
- front-matter: метаданные поста в YAML/JSON в начале Markdown-файла.
- draft: черновик поста, не опубликован в папке _posts.
- public: директория с готовыми статическими файлами, которые раздаёт Nginx.
Советы по SEO и предпросмотру в соцсетях
- Укажите title, description и keywords в _config.yml.
- Темы часто поддерживают Open Graph мета-теги — проверьте настройки темы.
Social preview suggestion (пример):
- OG title: Hexo на Ubuntu 20.04 — быстрый старт
- OG description: Полное руководство по установке Hexo, настройке Nginx и SSL, плюс варианты развертывания и чек-листы.
Короткое объявление (100–200 слов)
Hexo — лёгкий и быстрый статический генератор блогов на Node.js. Это руководство подробно описывает установку Hexo на сервер с Ubuntu 20.04: от подготовки окружения и настройки брандмауэра до публикации постов, настройки Nginx и автоматического SSL с помощью Let’s Encrypt. Также рассматриваются варианты развёртывания через Netlify, чек-листы перед публикацией, меры безопасности и план отката. Рекомендуется для разработчиков и администраторов, стремящихся к быстрому, безопасному и простому в обслуживании блогу.
Если вам нужна помощь с конкретной темой, шаблоном или CI/CD для автоматизации сборки и выкладки — напишите, укажу конфигурацию для вашего случая и подготовлю пример рабочего CI-пайплайна.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента