Esse problema aqui é que eu estava configurando a variável de ambiente, bem como o cabeçalho. Remover esta linha corrigiu isso:
passenger_env_var HTTP_X_FORWARDED_PROTO $scheme;
Isso é causado pelo fato de que passenger_env_var
é avaliado em o início do aplicativo em vez de em cada solicitação. Porque $scheme
não está definido naquela época, foi definido lá.
Eu não sei porque o cabeçalho também foi pré-definido, mas eu suspeito que tenha algo a ver com o fato de que o Passenger tenta sincronizar os cabeçalhos e variáveis de ambiente para imitar um ambiente CGI.