Isso é normal. Você não precisa do HAProxy, embora o HAProxy possa fornecer um balanceamento de carga "mais justo" entre os servidores de aplicativos do que o balanceamento de carga do nginx.
Assim, nos seus servidores de aplicativos, defina Unicorn para ouvir uma interface de rede. Isso deve ser preferencialmente um endereço IP privado. Para este exemplo, digamos que seus servidores de aplicativos sejam 192.168.1.100, 192.168.1.101 e 192.168.1.102. Configure o unicórnio para ouvir a porta 8000 em todos os servidores de aplicativos.
No lado nginx, você terá um bloco "upstream" como:
upstream unicorn {
server 192.168.1.100:8000;
server 192.168.1.101:8000;
server 192.168.1.102:8000;
}
Então você terá sua definição de servidor virtual com um bloco como:
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X_FORWARDED_PROTO $scheme;
proxy_set_header Host $host;
proxy_connect_timeout 3;
proxy_read_timeout 60;
proxy_send_timeout 60;
proxy_redirect off;
proxy_max_temp_file_size 0;
if (!-f $request_filename) {
proxy_pass http://unicorn;
}
}
Você pode precisar de outras declarações de proxy para fazer as coisas funcionarem como quiser, mas isso deve ser feito essencialmente. A instrução proxy_pass usará o bloco definido no bloco upstream e distribuirá tarefas aos servidores de aplicativos listados. Verifique a documentação do nginx em outras opções que possam ser apropriadas.