Tutorial

How To Host Ghost with Nginx on DigitalOcean

Published on September 25, 2013
author

Alex LaFroscia

How To Host Ghost with Nginx on DigitalOcean

Introduction


In April 2013, John O’Nolan, no newcomer to the field of blog-making, launched a Kickstarter for a new kind of blog called Ghost, which could radically simplify writing and maintaining a blog. Here, we’ll walk through all of the steps to get Ghost set up and running on a DigitalOcean VPS.

Prerequisites


Before you get started, there are a few things that you should pull together

  1. Obtain a copy of Ghost

    • This tutorial will assume you already have a copy of Ghost on your local computer. Since it’s only available to Kickstarter backers right now, you should have been sent a link to the site where you can download it. <br/>
  2. Set up a VPS

    • This tutorial will assume that you’ve already set up a VPS. We’ll be using Ubuntu 12.04, but you should be fine with whatever you’d like. If you need help with this part, this tutorial will get you started. <br/>
  3. Point a domain at your VPS

    • This tutorial will assume that you’ve already pointed a domain at your VPS. This tutorial should help you out with that part, if you’re unsure of how to do that.

Step 1: Install npm


Before we get started, I highly recommend making sure your system is up-to-date. Start by SSHing into your VPS by running:

ssh root@*your-server-ip*

on your local machine, and running the following on your VPS:

apt-get update
apt-get upgrade

Once that is complete, we need to get npm installed. Running the following commands will install some dependancies for Node, add its repository to apt-get, and then install nodejs.

apt-get install python-software-properties python g++ make
add-apt-repository ppa:chris-lea/node.js
apt-get update
apt-get install nodejs

Note: You shouldn’t need to run the commands with sudo because you’re probably logged in as root, but if you’re deviating from this tutorial and are logged in as another user, remember that you’ll probably need sudo.

Now, if you run npm at the command line, you should see some help information printed out. If that’s all good, you’re ready to install Ghost!

Step 2: Install Ghost


The next thing to do will be getting your copy of Ghost onto the remote server. Please note that this step is only necessary for now, while Ghost is in beta. Once it is available to the public, it will be installable through npm (and this tutorial will likely be updated to reflect that).

You’re welcome to download the file directly to your VPS or transfer it via FTP. I will show you how to use SCP to copy the folder from your host to the server. The following commands are to be run in your local terminal:

cd /path/to/unzipped/ghost/folder
scp -r ghost-0.3 root@*your-server-ip*:~/

This will copy all of the contents of the ghost-0.3 folder to the home folder of the root user on the server.

Now, back on the remote server, move into the Ghost folder that you just uploaded and use npm to install Ghost. The commands will look something like this:

cd ~/ghost-0.3
npm install --production

Once this finishes, run the following to make sure that the install worked properly:

npm start

Your output should look something like the following:

> ghost@0.3.0 start /root/ghost-0.3
> node index

Ghost is running...
Listening on 127.0.0.1:2368
Url configured as: http://my-ghost-blog.com

If that is the case, congratulations! Ghost is up and running on your server. Stop the process with Control-C and move onto the next steps to complete the configuration.

Step 3: Install and Configure nginx


The next step is to install and configure nginx. Nginx (pronounced “engine-x”) is “a free, open-source, high-performance HTTP server and reverse proxy”. Basically, it will allow connections from the outside on port 80 to connect through to the port that Ghost is running on, so that people can see your blog.

Intallation is simple:

apt-get install nginx

Configuration is only a little more challenging. Start off by cding to nginx’s configuration files and removing the default file:

cd /etc/nginx/
rm sites-enabled/default

Now, make a new configuration file:

cd sites-available
touch ghost

And paste in the following code, modifying it to adapt to your own configuration (the only thing you should need to change is the domain name):

server {
    listen 0.0.0.0:80;
    server_name *your-domain-name*;
    access_log /var/log/nginx/*your-domain-name*.log;

    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:2368;
        proxy_redirect off;
    }
}

Finally, create a symlink from the file in sites-available to sites-enabled:

cd ..
ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

This will listen for traffic incoming on port 80 and pass the requests along to Ghost, provided they are connecting to the domain that you provide.

Start up the server again (use the code from the end of Step 2) and visit your domain. If you see Ghost, you’re good to go!

ghost

Step 4: Configure Upstart


The last step is to make an Upstart task that will handle Ghost and make sure that, should your server get turned off for some reason, Ghost will get kicked back on. Start by making a new Upstart configuration file by doing the following:

cd /etc/init
nano ghost.conf

And paste in the following configuration:

# ghost

# description "An Upstart task to make sure that my Ghost server is always running"
# author "Your Name Here"

start on startup

script
    cd /root/ghost
    npm start
end script

This should ensure that Ghost gets started whenever your server does, and allow you to easily control Ghost using service ghost start, service ghost stop, and service ghost restart.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar
Alex LaFroscia

author

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
10 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

typo under symlinks?

‘sites-enabled-ghost’ should be ‘sites-enabled/ghost’

right?

joonas
DigitalOcean Employee
DigitalOcean Employee badge
October 14, 2013

This comment has been deleted

    “Step the process…” I presume that should read “Stop the process…”

    I don’t get it working… Perhaps here is a mistake? Don’t understand where the error is…

    root@SocialThoughtsGhostly:/etc/nginx# cd/etc/nginx rm sites-enabled/default -bash: cd/etc/nginx: No such file or directory root@SocialThoughtsGhostly:/etc/nginx# cd /etc/nginx rm sites-enabled/default root@SocialThoughtsGhostly:/etc/nginx# cd sites-available touch ghost root@SocialThoughtsGhostly:/etc/nginx/sites-available# server { listen 0.0.0.0:80; server_name social-thoughts.de; access_log /var/log/nginx/social-thoughts.de.log; 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:2368; proxy_redirect off; } } -bash: syntax error near unexpected token `}’

    @daniel.fuerg you need to run “nano ghost” before pasting the contents of the config file.

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    October 16, 2013

    @joesell89: Thanks, I’ve updated the article. :]

    There are issues with the Sqlite package if you head over to the Ghost forums. I am going to redo my droplet and try again. node v0.10.* is what is recommended. I don’t want to use the Ghost Application image as I will use my droplet for other purposes. I guess I could split it in half…hmmm

    I created ghost nginx configuration file and changed server_name to my ghost ip adress (i still don’t have a domain name), but I launch ghost, i’ve got the wrong url (127.0.0.1:2368). I changed url setting in config.js file, just below ‘production’. I’ve got the same issue. What did I missed?

    Kamal Nasser
    DigitalOcean Employee
    DigitalOcean Employee badge
    October 20, 2013

    @artenischloria: <pre>i’ve got the wrong url (127.0.0.1:2368).</pre>

    Where do you see that?

    @Kamal Nasser. Thanks helping a newbie! Here it is: <code>root@ghost:/var/www/ghost# npm start

    ghost@0.3.3 start /var/www/ghost node index

    Ghost is running… Listening on 127.0.0.1:2368 Url configured as: http://my-ghost-blog.com Ctrl+C to shut down</code> I changed config.js with my vps ip.

    I already tried ghost droplet, and it was fine. But I was curious to install ghost on ubuntu by myself. When I posted the first message, I had just installed ubuntu image. But now, i’ve got other apps on my vps.

    Try DigitalOcean for free

    Click below to sign up and get $200 of credit to try our products over 60 days!

    Sign up

    Join the Tech Talk
    Success! Thank you! Please check your email for further details.

    Please complete your information!

    Become a contributor for community

    Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

    DigitalOcean Documentation

    Full documentation for every DigitalOcean product.

    Resources for startups and SMBs

    The Wave has everything you need to know about building a business, from raising funding to marketing your product.

    Get our newsletter

    Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

    New accounts only. By submitting your email you agree to our Privacy Policy

    The developer cloud

    Scale up as you grow — whether you're running one virtual machine or ten thousand.

    Get started for free

    Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

    *This promotional offer applies to new accounts only.