Install Nginx Mainline on Debian 11 Bullseye
You’ll learn how to pull the bleeding‑edge Nginx build into a stable Debian system without breaking your package manager or leaving dangling keys behind.
If you’ve ever had to jump from an older 1.18 release just so you could try HTTP/3, this will save you a few extra headaches.
Why you might want the Mainline build
I once ran a small site that needed TLS 1.3 and early hints for HTTP/3. The Debian bullseye repo only offered 1.18, which lacked those features. Switching to Nginx Mainline gave me the new APIs while still running on a rock‑solid OS.
Adding the Official Nginx Repository
Debian’s default repositories are intentionally conservative; they ship with older, thoroughly tested versions of software. To get Mainline you need to point APT at the official nginx.org repo, which is signed so you can trust the packages.
1. Import the GPG key
wget -qO- https://nginx.org/keys/nginx_signing.key | gpg --dearmor > /usr/share/keyrings/nginx-archive-keyring.gpg
Why this matters: The key lets APT confirm that nothing funky has been slipped into the package archive.
2. Create the source list file
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian/ bullseye nginx" | tee /etc/apt/sources.list.d/nginx-mainline.list
Why this matters: The signed‑by flag ties the source to the key you just stored, preventing MITM attacks on your package list.
Updating the Package Cache
sudo apt update
APT now knows about the new 1.24.x packages and will keep them separate from the old Debian ones.
Installing Nginx Mainline
sudo apt install nginx-full
nginx-full pulls in all modules, not just the tiny core that ships with Debian’s default nginx.
If you only need a subset, pick nginx-light or nginx-extras.
Verifying the Version
nginx -v
You should see something like nginx version: nginx/1.24.0. If it still says 1.18, double‑check that you updated after adding the repo and that no older package is overriding the new one.
Configuring for your first site
1. Create a minimal server block
sudo tee /etc/nginx/sites-available/example.com <<EOF
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
}
EOF
2. Enable it
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
3. Test and reload
sudo nginx -t && sudo systemctl reload nginx
Why this matters: Nginx’s -t flag validates your syntax before you break a live service.
Keeping the Mainline build fresh
Debian’s security updates don’t automatically bump nginx to 1.24.x, so if you want newer patches:
sudo apt install --only-upgrade nginx-full
Run that regularly or set up a cron job if you’re running a production server.
That’s the whole process in a nutshell. Drop the old version out of the way, pull in the fresh repo, and you’ll have all the latest HTTP goodies on a reliable Debian base.