Host Multiple Ghost Blogs on One Server with Nginx
Ghost is a great blogging platform – easy to use, quick for publishing, and pleasing. But, usually, it’s one server, one Ghost install, one site. What if you want to run a few sites without paying for lots of machines?
This guide will show you how to run multiple Ghost blogs on one server. Each blog will have its own domain, and Nginx will be the traffic controller, sending visitors to the right Ghost setup.
I’ll use two domains as an example, but you can use this for more, as many as your server can handle.
Once your Ghost blogs are up and running, you might also want to improve the user experience on each site by adding a Table of Contents in Ghost CMS: 4 Easy Steps (No Theme Edit) to your articles.
Table of Contents
What You Need Before We Start
Before you start changing things, make sure you have these ready:
- A new server you can access online
- Ghost is already set up and running (you need at least one working install)
- Two domain names are pointing to your server’s IP address
- Root access (or sudo privileges)
If you don’t have Ghost installed, do that first. This guide assumes Ghost is already up and running.
SPONSORED
Running multiple Ghost installs on one server requires solid performance — especially NVMe storage, stable networking, and full root access.
If you’re looking for an affordable EU-based VPS, Senko Digital offers:
- VPS locations in Germany, Finland, and the Netherlands
- Fast NVMe storage
- Full root access
- Quick server deployment
- 24/7 support
- 99.9% uptime guarantee
- Basic DDoS protection (Germany location)
Step-by-Step: Host Multiple Ghost Blogs on One Server
Step 1 – Temporarily Stop Ghost and Nginx
Before moving folders or splitting things up, let’s shut everything down This can prevent errors that will cause problems.
Stop Ghost:
service ghost stop
Stop Nginx:
service nginx stop
All clear! Now we can move things around.
Step 2 – Make Nginx Route Traffic to the Right Place
Right now, Nginx probably sends everything to one place. That works for one Ghost blog, but not for two. The fix is to give Nginx separate server blocks – one for each domain – so it can route traffic based on the domain name (server_name).
Go to the directory where your Nginx configs are:
cd /etc/nginx/sites-enabled
Rename the Ghost config to match your first domain (I’ll use example names below), and then copy it for the second domain:
mv ghost firstsite.confcp firstsite.conf secondsite.conf
Set Up the First Domain
Open the first file:
nano firstsite.conf
Set server_name to your first domain:
server_name firstsite.com;
Save it and close the file.
Set Up the Second Domain + Use a Different Port
Now open the second config:
nano secondsite.conf
Update the server_name:
server_name secondsite.com;
Here’s the important part: your second Ghost install needs to listen on a different port. If it doesn’t, both domains will go to the same Ghost process.
Find the proxy_pass line and change it to a free port (like this):
proxy_pass http://localhost:2777;
Save and exit.
Restart Nginx:
service nginx restart
Now, Nginx can send traffic to two different ports based on the domain name. Next, let’s set up Ghost to match.
Step 3 – Make Two Ghost Folders in /var/www
Go to the web root:
cd /var/www
Make a folder for each blog:
mkdir firstsite.commkdir secondsite.com
Now you need two Ghost installations. The easiest way is to copy the existing Ghost folder.
Copy Ghost to the first site’s folder:
cp -r ghost firstsite.com
Move the original Ghost folder to the second site’s folder:
mv ghost secondsite.com
Now you have:
/var/www/firstsite.com/ghost/var/www/secondsite.com/ghost
Two separate installs, two sets of configs, and two separate blogs.
Step 4 – Change Ghost’s Settings for Each Domain
Ghost needs to know its public URL. If it doesn’t, you’ll have broken links and other annoyances.
First Site: Set the URL
Edit the first site’s Ghost config:
nano /var/www/firstsite.com/ghost/config.js
Find the production section:
production: {
Update the url value:
production: { url: 'http://firstsite.com'}
Save and exit.
Second Site: Set the URL and Port
Now edit the second site’s config:
nano /var/www/secondsite.com/ghost/config.js
In the production section, set the URL:
production: { url: 'http://secondsite.com'}
Then, find the server: {} section inside production and change the port to the one you used in Nginx (2777 in the example):
port: '2777'
Save and exit.
Now your second Ghost install will use its own port.
Step 5 – Set Up Upstart Scripts to Control Each Ghost Blog
Managing multiple Ghost blogs can be a hassle if they all use the same controls. Upstart scripts give you separate controls for each site: start, stop, restart, etc.
If you have a System V init script at /etc/init.d/ghost, remove it to avoid issues:
rm /etc/init.d/ghost
Go to the Upstart config directory:
cd /etc/init
Make the First Upstart Script
Create a new file:
nano ghost-firstsite.conf
Add this:
# ghost-firstsitestart on startupscript cd /var/www/firstsite.com/ghost npm start --productionend script
Save and exit.
Copy It for the Second Site
Copy the first script:
cp ghost-firstsite.conf ghost-secondsite.conf
Edit the second one:
nano ghost-secondsite.conf
Change it to point to the second directory:
# ghost-secondsitestart on startupscript cd /var/www/secondsite.com/ghost npm start --productionend script
Save and exit.
Step 6 – Start Both Ghost Blogs
Start each service:
service ghost-firstsite startservice ghost-secondsite start
Open both domains in your browser. If everything’s set up, you should see the Ghost welcome page on each one – separately.
To make an admin user for each blog, go to:
firstsite.com/ghost/signupsecondsite.com/ghost/signup
Post something on each site to test. If the posts show up correctly and don’t mix between domains, you’ve done it!
Wrapping Up
You now have two different Ghost blogs running on one server. Nginx sends traffic based on the domain name, and each Ghost install has its own folder and port.
Want more blogs? Just repeat the steps:
- New domain → new Nginx server block
- New local port → new Ghost config port
- New directory → new Upstart script
Just remember that each additional blog uses more server resources.
FAQ Hosting Multiple Ghost Blogs on One Server
1. Can I run more than two Ghost blogs on one server?
Yes. You can run as many Ghost blogs as your server resources allow. Each blog needs its own domain, port, folder, and process.
2. Do all Ghost installs need different ports?
Yes. Each Ghost instance must listen on a unique local port so Nginx can route traffic correctly based on the domain.
3. Will posts or users mix between sites?
No. Each Ghost blog has its own installation and database, so content and users stay completely separate.
4. Can I use SSL (HTTPS) with multiple Ghost blogs?
Absolutely. You can use Let’s Encrypt with Nginx to issue separate SSL certificates for each domain.
5. Does this work with Ghost CLI installs?
This guide assumes a manual or older setup. If you’re using Ghost CLI, multi-site hosting is still possible but requires separate system users or Docker-based setups.
6. What happens if one Ghost blog crashes?
Only that specific blog goes down. The other Ghost instances will keep running normally.
7. How much RAM do I need?
A small Ghost blog typically needs around 300–500 MB of RAM. Add more memory as you add more sites, especially if traffic increases.
8. Is Docker a better option for this?
For many sites or long-term scaling, yes. Docker or Docker Compose can simplify isolation, upgrades, and maintenance—but this Nginx-based setup is perfectly fine for small to medium projects.