【发布时间】:2018-11-20 11:24:08
【问题描述】:
最近为 nginx+rails 设置 sendfile 时遇到问题。我们有一种已经被 nginx 处理的文件下载,我们想添加第二条规则来处理另一个位置的另一种文件,但到目前为止我们没有成功。
Ruby 控制器:
def download_file
send_file("/srv/www/myapp/shared/tmp/directory/file.zip")
end
环境配置文件:
Rails.application.configure do
# ..
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
# ..
end
Nginx 配置:
upstream myapp {
server 127.0.0.1:9292;
}
server {
listen 80;
server_name myapp.tld;
client_max_body_size 10M;
root /srv/www/myapp/current/public;
# This first block works perfectly
location /__working_file {
internal;
alias /var/lib/myapp;
}
# This second block does not work at all
location /__new_files {
internal;
alias /srv/www/myapp/shared/tmp/directory;
}
location / {
root /srv/www/myapp/current/public;
try_files $uri @app;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
# This first rule works perfectly
proxy_set_header X-Accel-Mapping /var/lib/myapp/=/__working_file/;
# This second rule doesn't
proxy_set_header X-Accel-Mapping /srv/www/myapp/shared/tmp/directory/=/__new_files/;
proxy_pass_header Server;
proxy_read_timeout 300;
proxy_pass http://myapp;
}
}
结果
当访问控制器动作时,send_file 命令被触发,然后我们在浏览器中得到一个“找不到文件”,没有下载任何东西,rails 日志显示如下:
Sent file /srv/www/myapp/shared/tmp/directory/file.zip (0.4ms)
Completed 200 OK in 169ms (ActiveRecord: 37.5ms)
Started GET "/srv/www/myapp/shared/tmp/directory/file.zip" for 109.190.197.126 at 2018-11-20 11:34:44 +0100
ActionController::RoutingError (No route matches [GET] "/srv/www/myapp/shared/tmp/directory/file.zip"):
该文件确实存在并且可读,但 nginx 似乎无法访问它。有什么想法吗?
【问题讨论】:
标签: ruby-on-rails nginx x-accel-redirect