Want HTTPS on your home server? One web server hands it to you automatically. The other makes you request certificates, renew them, and paste in cipher settings you don't understand.
That's the real gap between Caddy and Nginx. Let's settle it.
The two-line difference
Here's a working Caddy config that serves your app over HTTPS:
app.yourdomain.com {
reverse_proxy localhost:8080
}
That's it. Caddy fetches a free certificate from Let's Encrypt, installs it, and renews it forever. No cron job. No extra commands.
Now the same job in Nginx:
server {
listen 443 ssl;
server_name app.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/app/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app/privkey.pem;
location / {
proxy_pass http://localhost:8080;
}
}
And those certificate files? You have to get them yourself with Certbot, then set up auto-renewal. More steps, more places to trip.
Where Caddy wins for beginners
Automatic HTTPS. This is the headline. Your padlock just works.
Sane defaults. Modern security settings ship on by default. You don't need to copy a stranger's cipher list from a 2019 forum post.
Readable config. The file looks like plain instructions, not a programming language.
For a first home server, Caddy removes the exact things that make people quit on day one.
Where Nginx still wins
It's everywhere. Every tutorial, every Stack Overflow answer, every Docker image assumes Nginx. When you hit a problem, someone else already solved it.
Raw speed under heavy load. If you're serving thousands of visitors, Nginx squeezes out more performance. But your home Jellyfin server has three users. This won't matter to you.
Fine control. Complex routing, caching rules, rate limits — Nginx gives you every dial. That's power you probably don't need yet.
The privacy angle nobody mentions
Any reverse proxy is your front door. It logs every request by default — IP addresses, timestamps, what people visited. On a home server, that log is a diary of your habits.
Caddy lets you turn logging off with one block:
app.yourdomain.com {
log {
output discard
}
reverse_proxy localhost:8080
}
Nginx needs access_log off; inside each server block. Either way — check this. Most people leave logs running for months and never look at them. That's data sitting around for no reason. Delete-by-default beats keep-by-accident.
Pick this
Starting out? Install Caddy. You'll have working HTTPS before your coffee gets cold, and you'll spend your energy on the apps you actually want to run — not on certificate errors.
Switch to Nginx later only if you hit a wall Caddy can't handle. Most home labs never do.
Your move today: Spin up Caddy, point one subdomain at one app, and watch the padlock appear on its own. That single win is what keeps you self-hosting.