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.
Before You Start
Before setting up multiple Ghost blogs on one server, make sure your VPS can handle several Node.js processes at once. Running multiple Ghost instances with Nginx works best on servers with fast NVMe storage, stable networking, and enough RAM for caching and background tasks.
For smaller projects, even a basic VPS is usually enough. But if you plan to host several Ghost blogs with decent traffic, choosing reliable infrastructure early can save you from migration headaches later.
One option worth checking is Senko Digital — an EU-based VPS provider offering NVMe-powered servers, full root access, and locations in Germany, Finland, and the Netherlands.
Their servers are especially suitable for Ghost and Nginx setups because you can easily configure custom ports, reverse proxies, SSL, and multiple Node.js applications without platform restrictions.
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.
If you plan to scale further, make sure your VPS has enough RAM and fast NVMe storage for multiple Node.js processes. Using a provider with full root access and reliable EU networking — such as Senko Digital — can make long-term management much easier.
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.