Статьи

Настройка Nginx для ускорения вашего блога Ghost.io

Ghost — это новая горячая платформа для блогов. Он проще, чем WordPress, и ориентирован исключительно на ведение блога (а не на полноценную CMS, как WordPress). Как и WordPress, вы можете зарегистрироваться и разместить свой блог на их сайте (за плату), или вы можете загрузить и разместить Ghost самостоятельно. Мы сосредоточимся на последнем.

Почему призрак?

Недавно я установил блог для моей жены (которая пишет о наших путешествиях) на моем виртуальном сервере. Указанный VPS используется совместно с несколькими другими приложениями, поэтому я хотел сохранить эффективность. Самый эффективный способ обслуживания блога — использовать генератор статических сайтов, такой как Middleman или Jekyll , и обслуживать ваши статические ресурсы с помощью веб-сервера, такого как Nginx . Это хорошо для меня — мой личный блог использует Middleman, и я обновил его с помощью хитов Git post-receive — но моя жена не очень в командной строке, поэтому я подумал, что Ghost может быть лучше.

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

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

Сегодня я покажу вам, как я настроил свой сервер так, чтобы:

  • Ghost обслуживает страницы администратора (единственные динамические страницы)
  • Nginx обслуживает статические ресурсы (изображения, JavaScript, CSS)
  • Все неадминистративные страницы кэшируются Nginx, что еще больше снижает нагрузку

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

Прежде чем мы продолжим

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

Сконфигурируйте Ghost для работы на порту 2368. Мы подключим к нему порт 80 (то есть порт http по умолчанию) с помощью Nginx. Мы также предполагаем, что вы работаете на example.com

Настройка Nginx для обслуживания статических активов

Для начала у вас должна быть следующая конфигурация Nginx:

 server{
    listen 80;
    server_name example.com www.example.com;
}

Сначала мы позаботимся о том, чтобы обслужить блог, который работает на порте 2368. Для этого просто добавьте следующее:

 location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:2368;
}

Теперь убедитесь, что Ghost запущен, и перезапустите Nginx. Когда вы перейдете на свою домашнюю страницу по адресу example.com, вы должны увидеть пустой блог Ghost.

Мы хотим обслуживать изображения и ресурсы с Nginx. Призрак скрывает их в нескольких разных местах, поэтому вам нужно сделать несколько псевдонимов. Добавьте следующее (изменив путь к вашей установке Ghost и к вашей теме, соответственно):

 location /content/images {
    alias /path/to/ghost/content/images;
}

location /assets {
    alias /path/to/ghost/content/themes/<mytheme>/assets;
}

location /public {
    alias /path/to/ghost/core/built/public;
}

location /ghost/scripts {
    alias /path/to/ghost/core/built/scripts;
}

Настройка статического кэширования в стиле сайта

Чтобы использовать как можно меньше циклов, мы хотим быть очень агрессивными с кэшированием. Итак, для всех страниц без прав администратора мы настроим Nginx так, чтобы он полностью игнорировал заголовки управления кэшем и просто кэшировал каждую страницу в течение часа.

Выньте другой блок proxy_pass Нам нужно разделить его на две части. Первым будут запросы прокси к админке, которые мы не должны кэшировать. Вторым будет отдых, который будет кешироваться с удвоенной силой. Вот как это выглядит:

 location /ghost {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:2368;
}

location / {
    proxy_cache STATIC;
    proxy_cache_valid 200 60m;
    proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:2368;
}

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

Кстати, вы также захотите настроить путь кеша Nginx. Выше мы назвали нашу конфигурацию STATIChttp/etc/nginx/nginx.conf

 proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=512m;

Это говорит Nginx хранить файлы кэша по пути /data/nginx/cache Если вы когда-нибудь захотите очистить кеш, просто выполните rm -r /data/nginx/cache/*

Все все вместе

Вот вся конфигурация для справки:

 server{
    listen 80;
    server_name example.com www.example.com;

    location /content/images {
        alias /path/to/ghost/content/images;
    }

    location /assets {
        alias /path/to/ghost/content/themes/<mytheme>/assets;
    }

    location /public {
        alias /path/to/ghost/core/built/public;
    }

    location /ghost/scripts {
        alias /path/to/ghost/core/built/scripts;
    }

    location /ghost {
        proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }

    location / {
        proxy_cache STATIC;
        proxy_cache_valid 200 60m;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
        proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }

}

И это действительно все, что нужно сделать. При такой настройке вы сможете обслуживать тысячи посетителей даже с небольшого частного сервера.