O Nginx certamente pode fazer isso, você só precisa especificar cada cabeçalho do host ( server_name ) e separar os upstreams para atribuir um para cada host.
Um snippet de servidor nginx como esse pode funcionar (fora da minha cabeça e não testado):
upstream one { server h1.abc.example.com; }
upstream two { server h2.abc.example.com; }
server {
listen 8080;
server_name abc-h1.abc.example.com;
location / {
proxy_pass one;
}
}
server {
listen 8080;
server_name def-h1.abc.example.com;
location / {
proxy_pass two;
}
}
Existem também outros manipuladores de proxy ( fastcgi_pass , uwsgi_pass , scgi_pass , memcached_pass ) se você quiser enviar tráfego para algo que não seja um endpoint HTTP
EDIT: corrija erroneamente server_name