Es gibt Situationen da möchte man in einem nginx reverse-proxy die Requests je nach Client IP zu einem anderen Server umleiten. Nützlich ist das beispielsweise bei einer Server Migration, wo man nur eine handvoll interner IPs zuerst auf den neuen Server proxy-en kann und wenn alles läuft dann alle.
Die Option mit „if Statements“ sollte man dabei möglichst nicht verwenden. Und es gibt auch eine viel elegantere Option.
Mit dem nxing Modul http_geo_module, welches eigentlich für GeoIP Location Verteilung gedacht ist, kann man wunderbar IP Adressen- oder Netze gruppieren und an ein backend weiterleiten.
Dazu werden zuerst die upstream Server (backends) definiert und danach die Gruppierung mit dem dem geo
gemacht:
/etc/nginx/conf.d/proxy-by-client.conf
# Upstream definitions
upstream server1 {
server 192.168.1.10:8080;
}
upstream server2 {
server 192.168.1.20:8080;
}
# Map IP to upstream
geo $remote_addr $backend {
default http://server1;
192.168.100.0/24 http://server2;
93.184.216.34 http://server2;
}
(falls das backend HTTPS (SSL) ist, ist anstelle von „http://“ entsprechend „https://“ zu verwenden)
Standardmässig (default) werden alle Clients zu http://server1 proxied.
Alle, welche vom IP Netz: 192.168.100.0/24 oder der IP: 93.184.216.34 kommen, gehen nach: http://server2.
In der location direktive des VirtualHosts kann man dann einfach auf die Variable $backend
verweisen:
server {
listen 80;
server_name example.com;
[...]
location / {
[...]
proxy_pass $backend;
}
}
Quelle: Different proxy_pass upstream depending on client ip address in Nginx