Eu quero permitir que os usuários baixem arquivos de um armazenamento remoto, mas eu quero primeiro autenticar o pedido através do meu aplicativo rails. Eu quero entregar o proxy do arquivo remoto para nginx quando o rails autenticou o pedido, para liberar o thread ruby / rails.
Eu tenho este arquivo conf nginx chamado proxy_download.conf:
# Proxy download
location ~* ^/internal_redirect/(.*?)/(.*) {
# Do not allow people to mess with this location directly
# Only internal redirects are allowed
internal;
# Location-specific logging
access_log logs/internal_redirect.access.log combined;
error_log logs/internal_redirect.error.log warn;
# Extract download url from the request
set $download_uri $2;
set $download_host $1;
# Compose download url
set $download_url http://$download_host/$download_uri;
# Set download request headers
proxy_set_header Host $download_host;
proxy_set_header Authorization '';
# The next two lines could be used if your storage
# backend does not support Content-Disposition
# headers used to specify file name browsers use
# when save content to the disk
proxy_hide_header Content-Disposition;
add_header Content-Disposition 'attachment; filename="$args"';
# Do not touch local disks when proxying
# content to clients
proxy_max_temp_file_size 0;
# Download the file and send it to client
proxy_pass $download_url;
}
Eu importo isso para o conf nginx principal da seguinte forma:
include $ROOT/TO/APP/nginx.conf.d/proxy_download.conf;
O aplicativo é implantado bem e é executado corretamente com essa configuração.
Estes são os métodos do controlador para iniciar o pedido de download:
def x_accel_url(url, file_name = nil)
uri = "/internal_redirect/#{url.gsub('http://', '').gsub('https://', '')}"
uri << "?#{file_name}" if file_name
return uri
end
def download
if auth_is_ok # do some auth logic here
headers['X-Accel-Redirect'] = x_accel_url('http://domain.com/file.ext')
render :nothing => true
end
end
Ao acertar este método de controle através do navegador, recebo o famoso erro nginx:
502 Bad Gateway
O que há de errado com minha configuração? Obrigado!
Tags nginx ruby-on-rails