Nginx: пропускается ли post_action, когда Rails возвращает используемый заголовок X-Accel-Redirect?
post_action
в конфиге для моего экземпляра Nginx 1.4.2 не стреляет (или не похоже). Мне интересно, если это потому, что Rails возвращает X-Accel-Redirect
заголовок. Конечная цель - отслеживать, когда загрузки, размещенные на S3, завершены.
Шаг 1: Запрос попадает в nginx по адресу http://host/download/...
location ~ /download/ {
proxy_pass http://rails-app-upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
post_action @finished;
}
Шаг 2: После проверки подлинности запроса файла загрузки и пометки начала загрузки в базе данных, Rails возвращает запрос со следующими заголовками:
{
'X-Accel-Redirect' => '/s3-zip/my-bucket.s3.amazonaws.com/downloads/0001.jpg`
'Content-Disposition' => "attachment; filename=download.jpg",
'X-Download-Log-Id' => log.id.to_s,
'X-Download-Mem-Id' => log.membership_id.to_s
}
Шаг 3: Nginx ловит x-accel-redirect
заголовок и попадает в это местоположение, которое определено:
location ~ "^/s3-zip/(?<s3_bucket>.[a-z0-9][a-z0-9-.]*.s3.amazonaws.com)/(?<path>.*)$" {
# examples:
# s3_bucket = my-bucket.s3.amazonaws.com
# path = downloads/0001.mpg
# args = X-Amz-Credentials=...&X-Amz-Date=...
internal;
access_log /var/log/nginx/s3_assets-access.log main;
error_log /var/log/nginx/s3_assets-error.log warn;
resolver 8.8.8.8 valid=30s; # Google DNS
resolver_timeout 10s;
proxy_http_version 1.1;
proxy_set_header Host $s3_bucket;
proxy_set_header Authorization '';
# remove amazon headers
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header Set-Cookie;
proxy_ignore_headers "Set-Cookie";
# no file buffering
proxy_buffering off;
# bubble errors up
proxy_intercept_errors on;
proxy_pass https://$s3_bucket/$path?$args;
}
Пропущенный шаг: следующее местоположение вызывается post_action
на шаге 1 никогда не срабатывает. Это из-за x-accel-redirect
или потому что шаг 3 использует proxy_pass
, или что-то другое? Это последнее местоположение снова вызывает маршрут рельсов после того, как nginx завершит запрос, чтобы пометить загрузку как завершенную.
location @finished {
internal;
rewrite ^ /download/finish/$sent_http_x_download_log_id?bytes=$body_bytes_sent;
}