Esta linha:
proxy_pass http://$server_name:9000;
Deve ser:
proxy_pass http://127.0.0.1:9000;
Essa alteração roteará o tráfego de maneira eficiente e segura para o back-end por meio da interface de loopback local.
Além disso, o Gunicorn deve ser configurado para vincular-se à porta 127.0.0.1, já que ele destina-se apenas a ser acessado por meio do Nginx. Você está convidando problemas adicionais, expondo-o ao público, se você não precisa.
Veja o que pode dar errado com sua configuração atual. Alguém pode enviar uma solicitação ao seu servidor com um nome de host de terceiros como este:
curl -H 'Host: example.com' http://1.2.3.4/Hello
Seu server_name
aceitará solicitações correspondentes a qualquer nome de host, portanto, as solicitações serão processadas e, em seguida, a solicitação será intermediada por proxy para "example.com" em sua porta "9000". Vamos dizer que este é o servidor Gunicorn de outra pessoa que também deixou a porta 9000 aberta. Agora, há potencialmente um tráfego de ataque sendo enviado para esse servidor Gunicorn, originado de seu endereço IP, já que você está executando uma forma de proxy aberto.
É por isso que é bom usar valores explícitos para server_name
, para o host proxy_pass
e por que seus servidores de back-end devem se vincular explicitamente à porta 127.0.0.1.