Category Archives: Nginx

Updating ghost-cli process name

Imagine you’ve created your new Ghost install but have set it up with the incorrect process name. The official documentation does not tell us how to update it, it just tells us that it can be set using the --pname flag during initial installation. Let’s look at how we can update the process name after we’ve installed our site.

Run ghost ls

Ghost ls output

So in this case, I wanted to rename bitsnbytes-thecurlybraces-com to bitsnpieces-thecurlybraces-com

First stop the running server process using ghost stop bitsnbytes-thecurlybraces-com.

Open the .ghost-cli file in the folder where the site / server is deployed. You’ll see the following content,

Change the name key to the following – bitsnpieces-thecurlybraces-com.

Restart with ghost restart bitsnpieces-thecurlybraces-com and you should now see the updated name in the ghost ls.

After you do this, you might have to reconfigure systemd. To do that, run the following command –

Incase you forget to stop the server before renaming the ghost-cli file, and you had configured systemd, you’ll not be able to start the server. You might be shown the following error –

To fix this, you’ll have to go through some extra steps.

Disable systemd for the blog and restart

Delete this file from the ghost site installation folder first –

Also remove a symlink from under /etc/systemd/system/ that was created by ghost-cli.

Restart systemd.

Stop the old server process

Now that we’ve disabled systemd, killing the node process will not cause it to restart.

Use a software like htop to kill the running server process. If you don’t do this and try to start the new server, you’ll get an error stating that the port is already in use.

Once done, you should be able to start your server again.

Note that if you are doing this, you might also have to do the following,

  1. Update the virtual host in nginx from to Click here to find out how to do that.
  2. Add or update the domains under your Let’s Encrypt certificate. Click here to find out how to do that.

Renewing Let’s Encrypt certificate

Have the following command setup in my crontab to renew the certificate for this blog, and for the main website –

This causes the command to run,

At 03:30 on day-of-month 1 in every 2nd month.


Incase you want to add more domains to an existing certificate, you can use the following command –

This assumes that you have only a single certificate. If you’ve more, you’ll have to use --cert-name. Read more here.

Just putting this here for reference, and with the hope that it might be useful for someone else.

Setting up a blog using Ghost on Debian

My web hosting’s annual payment date was drawing close, and instead of renewing it, I decided I’d rent a server on Digital Ocean for 10$ a month. It turns out to be a lot more expensive but gives me the option to use the server for something other than just blogging and running PHP application.

After shifting to this new server, the first thing to do was to migrate my blog here. WordPress is an amazing platform, but over the years it has evolved to something a lot more than just a blogging tool. Besides the new kid on the block – Ghost, was creating a lot of buzz for its simplicity. I wanted to give it a try.

I setup my Digital Ocean server with Debian (Jessie 8.2). Node.js is required to run Ghost. Since I wanted to use this server for multiple applications, I decided I’d put nginx as a front facing proxy/compression server.

This blog item is a guide for setting up Ghost on a server running Debian. Let’s start,

Setting up the server

After logging onto the server for the first time, I noticed that sudo was missing, so this was the first thing to do.

Next, I decided to create a normal sudo user to do my work as, working as the root user at all times is probably not the best idea.

I then proceeded to install nginx-light since the features in it sufficed my needs.

I decided to build the Node.js source and for this, I needed g++ and make

I then grabbed the Node.js source from their website, and proceeded to build it. Do note that this approach does take a while, for me it took about 30 minutes. Ghost.js recommends that we use the LTS version of Node.js

Ok, so that’s the base setup done, let’s now setup Ghost.

Setting up Ghost

Let’s first grab Ghost from their website

We’ll need to install unzip to run Ghost.

Then move the whole extracted folder to the /var/www/html folder where web applications are traditionally kept.

Running your Node.js application as a root user is generally a bad idea. If your website gets hacked, the hacker will have root access to your machine. We’ll create a system user that will run just our website. We will then shift to that user to work with our website. For our guide purpose, let’s name the user as website-user

Install the modules that Ghost needs to run in production mode.

Start and then stop the server, so that it creates a base config.js file that we will then tweak.

Ok, time to make modifications to the config.js file. The following needs to be modified –

  • Set the url to
  • Under connection, set filename to
  • Under server, set the host as
  • Under server, set the port as 3001
  • Turn off gzipping, set compress as false. We’ll set it up using nginx later.

Change the website-user’s .profile file and add the following at the end of it to run Ghost in production mode. This file is usually in the home directory of the user.


Now change to the sudo user (abijeet) that we had added initially and install pm2. We’ll use pm2 to monitor our app, and restart it in case of a crash.

Start running the server using pm2

Finally, we’ll instruct pm2 to restart the Ghost application whenever the server is restarted.

Next, its time to setup routing and compression on nginx.

Setting up nginx

Create a file under /etc/nginx/sites-available

Put the following content in the file,

Create a symbolic link to this file under /etc/nginx/sites-enabled.

Remember to remove the default file present under /etc/nginx/sites-enabled/ and /etc/nginx/sites-available/.

Turn on gzipping for nginx. The following goes into the /etc/nginx/nginx.conf

This section might already be present under the nginx.conf file, so search before you add it.

Also add the following to nginx, to prevent it from sending the version number in HTTP response headers.

Alright, once all that is done, time to restart nginx. But first we’ll check the configurations.

We’re done. Type in the URL of your website in a browser, and you should see Ghost’s startup page.