Установить Ghost в Debian

Мне давно хотелось пощупать Node.js поближе, но все время не было повода для этого. В этой статье решил рассказать о первом опыте работы с этой платформой. Свое знакомство с работой Node.js мне пришлось начать с установки Ghost на Debian.

Хотелось бы упомянуть интересные факты из истории Ghost. Ghost был создан Джоном О’Ноланом, который в свое время выполнял функции заместителя руководителя разработки пользовательского интерфейса WordPress. Изначально Ghost создавался как альтернатива WordPress, но со временем он вырос из движка для блога и превратился в сложную CMS.

Если использовать Ghost в качестве блог-платформы, то его можно считать одним из основных конкурентов WordPress. Одно из преимуществ Ghost — его лаконичность, простота и скорость работы. Что касается функциональности этих CMS, Ghost сильно уступает возможностям WordPrees.

Как вариант, можно использовать Ghost вместе с Nginx. Веб-сервер Nginx будет прослушивать трафик, поступающий на порт 80, а затем передавать все запросы платформе Ghost. Благодаря разнообразию вариантов установки Ghost, вам нет необходимости обязательно устанавливать MySQL или Nginx.

Из недостатков Ghost, хочу отметить потребление ресурсов плаформой Node.js. В моем случае, на сервере Debian 8 х64, под виртуализацией KVM я увидел следующую картину:

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 9135 root      20   0 1039856 120372  10348 S  0.0 23.8   0:05.46 node
 9128 root      20   0  836588  28992   8792 S  0.0  5.7   0:00.32 npm

Под нагрузкой процесс Ghost создает сильную нагрузку на процессор. Этот недостаток устраняется кэшированием в Nginx. Потребление памяти должно компенсироваться за счет отсутствия необходимости держать в системе процессы PHP и MySQL, но это не устраняет проблем с ее утечками.

Как я уже говорил, чтобы установить Ghost в Debian, вам не нужно устанавливать PHP, MySQL и Nginx. Платформа Ghost выполняет функции движка и веб-сервера одновременно. За хранение данных по умолчанию отвечает SQLite, вы можете ее изменить на MySQL или PostgreSQL при необходимости.

Установить Ghost в Debian

Установить Ghost достаточно просто. Вам нужно установить пакеты nodejs, npm и их зависимости. Запустите в консоли команды ниже:

apt-get install nodejs npm
# Необходимо для Node.js в Debian, подробнее /usr/share/doc/nodejs/README.Debian
ln -s /usr/bin/nodejs /usr/bin/node

Чтобы установить Ghost на сервер, используйте npm:

cd /home
npm install ghost
cd node_modules/ghost
npm install

После завершения установки Ghost, важно выполнить первый запуск, после чего можно переходить к изменению настроек.

npm start --production

Фрагмент результата выполнения команды:

Ghost is running in production...
Your blog is now available on http://my-ghost-blog.com
Ctrl+C to shut down

Остановите процесс при помощи клавиш Ctrl-C. Откройте файл:

nano config.js

Здесь необходимо изменить адрес и порт на котором Ghost будет принимать входящие соединения. Находим секцию и меняем значения параметров на свои:

production: {
    url: 'http://test.codebeer.ru',
    mail: {},
    database: {
        client: 'sqlite3',
        connection: {
            filename: path.join(__dirname, '/content/data/ghost.db')
        },
        debug: false
    },

    server: {
        host: '95.213.199.106',
        port: '80'
    }
}

Повторно запускаем Ghost:

npm start --production

Автоматический запуск Ghost

После установки Ghost, необходимо добавить добавить запуск платформы в автозагрузку. Для контроля запуска и управления работой Ghost я буду использовать пакет supervisor:

apt-get install supervisor

Создадим файл с параметрами запуска Ghost:

nano /etc/supervisor/conf.d/ghost.conf

Добавьте в него следующие строки:

[program:ghost]
command = node /home/node_modules/ghost/index.js
directory = /home/node_modules/ghost
user = ghost
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/ghost.log
stderr_logfile = /var/log/supervisor/ghost_err.log
environment = NODE_ENV="production"

В целях безопасности, создадим отдельного пользователя, под которым будем выполнять запуск Ghost:

useradd -r ghost -U

Дадим пользователю права на каталог установки Ghost:

chown -R ghost:ghost /home/node_modules/ghost/

После установки supervisor и изменения настроек, обязательно нужно перезагрузить сервер. Теперь для управления процессом Ghost вручную, можно использовать следующие команды:

supervisorctl start ghost
supervisorctl stop ghost

Подробнее о различных способах управления процессом Ghost, можно прочитать на этой странице.

Установить Ghost вместе с Nginx

Когда Ghost установлен и работает, займемся оптимизацией работы сервера. В качестве примера я настрою Nginx в роли фронтенда. Веб-сервер Nginx, который запущен на внешнем интерфейсе, будет принимать и передавать соединения от клиентов к серверу Ghost. Затем в обход сервера Ghost, Nginx будет отдавать из кэша статику клиентам. Использование Nginx позволит нам более гибко настроить работу сервера.

Для начала меняем host и port в конфигурационном файле Ghost:

production: {
    url: 'http://test.codebeer.ru',
    mail: {},
    database: {
        client: 'sqlite3',
        connection: {
            filename: path.join(__dirname, '/content/data/ghost.db')
        },
        debug: false
    },

    server: {
        host: '127.0.0.1',
        port: '8080'
    }
}

Устанавливаем веб-сервер Nginx:

apt-get install nginx

Создайте конфигурационный файл Nginx и добавьте в него следующие строки:

server {
    listen 95.213.199.106:80;

    server_name test.codebeer.ru;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header HOST $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
    }
}

Чтобы применить настройки, выполните команду:

service nginx reload

После изменения настроек Nginx перестал запускаться:

2015/12/10 22:34:38 [emerg] 9714#0: bind() to 95.213.199.106:80 failed (98: Address already in use)

В качестве решения проблемы, мне помог перезапуск сервера.