0
0
Nginxdevops~5 mins

Blue-green deployment routing in Nginx - Commands & Configuration

Choose your learning style9 modes available
Introduction
Blue-green deployment routing helps you switch traffic between two versions of your app smoothly. It avoids downtime by running both versions and directing users to one at a time.
When you want to update your website without making it unavailable to users.
When you want to test a new app version with real users before fully switching.
When you want to quickly roll back to the old version if the new one has problems.
When you want to reduce risks during app updates by having two live environments.
When you want to control traffic routing at the web server level for deployments.
Config File - nginx.conf
nginx.conf
worker_processes 1;
events { worker_connections 1024; }
http {
    upstream blue_backend {
        server 127.0.0.1:8081;
    }
    upstream green_backend {
        server 127.0.0.1:8082;
    }

    server {
        listen 80;

        # Change this to switch traffic between blue and green
        set $active_backend blue_backend;

        location / {
            proxy_pass http://$active_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

This config defines two backend groups: blue_backend and green_backend, each pointing to a different app version on ports 8081 and 8082.

The set $active_backend blue_backend; line controls which backend receives traffic. Change it to green_backend to switch.

The proxy_pass directive sends incoming requests to the active backend.

Commands
Check if the nginx configuration file syntax is correct before applying changes.
Terminal
sudo nginx -t
Expected OutputExpected
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Reload nginx to apply the new configuration without stopping the server, so traffic routing changes take effect immediately.
Terminal
sudo systemctl reload nginx
Expected OutputExpected
No output (command runs silently)
Send a request to nginx to verify it routes traffic to the active backend (blue or green).
Terminal
curl -I http://localhost
Expected OutputExpected
HTTP/1.1 200 OK Server: nginx Date: Thu, 01 Jan 1970 00:00:00 GMT Content-Type: text/html Content-Length: 1234 Connection: keep-alive
-I - Fetch only HTTP headers to quickly check server response
Switch the active backend from blue to green by editing the nginx config file directly.
Terminal
sed -i 's/set \$active_backend blue_backend;/set \$active_backend green_backend;/' /etc/nginx/nginx.conf
Expected OutputExpected
No output (command runs silently)
Reload nginx again to apply the backend switch so traffic now goes to the green version.
Terminal
sudo systemctl reload nginx
Expected OutputExpected
No output (command runs silently)
Key Concept

If you remember nothing else from this pattern, remember: blue-green deployment routing switches user traffic between two live app versions by changing the backend target in the web server.

Common Mistakes
Forgetting to reload nginx after changing the config file.
Nginx keeps using the old config until reloaded, so traffic won't switch as expected.
Always run 'sudo systemctl reload nginx' after editing the config to apply changes.
Setting both blue and green backends to the same port or server.
Traffic won't actually switch because both backends point to the same app version.
Ensure blue and green backends point to different app instances on separate ports or servers.
Not testing nginx config syntax before reload.
A syntax error can cause nginx to fail reloading, leading to downtime.
Always run 'sudo nginx -t' to verify config syntax before reloading.
Summary
Define two backend groups in nginx config for blue and green app versions.
Use a variable to control which backend receives traffic and change it to switch versions.
Test nginx config syntax and reload nginx to apply routing changes without downtime.