gpt4 book ai didi

ruby-on-rails - 通过 send_file 下载 Rails 文件很慢,puma 中是否提供 X-Sendfile 或类似文件?

转载 作者:行者123 更新时间:2023-12-02 01:12:41 25 4
gpt4 key购买 nike

下载公用文件夹需要 2 秒。
使用下面的 send_file 方法下载相同的文件需要将近一分钟。

  def download
file = FileUpload.find params[:id]
file_path = Rails.root.join('private', file.name)
send_file(file_path,
x_sendfile: true,
disposition: 'attachment')
end

我尝试过更改缓冲区大小等,但它仍然非常慢,比数据库和 send_data 组合慢。
除了完全放弃 Rails 之外,还有一个简单的解决方案吗?

最佳答案

经过一番搜索,我意识到我的问题有点愚蠢:
Puma 实际上是一个应用服务器
准确地说,Puma 称自己为 Web 服务器,但在使用方面,在大多数情况下,似乎 Apache 或 Nginx 被插入用户和 Puma 之间。
到目前为止,Puma 本身似乎既不支持 X-Sendfile 也不支持 X-Accel-Redirect。这取决于 Apache 或 Nginx。
让它在开发环境中与 rails5、puma、nginx 一起工作
步骤适用于 ubuntu 16lts、puma 版本 3.9.1、nginx/1.10.0 (Ubuntu)、Rails 5.1.1、ruby 2.4.0p0

sudo apt install nginx
sudo ufw allow 'Nginx HTTP'
sudo trash /etc/nginx/sites-enabled/defualt #renaming did not work
sudo touch /etc/nginx/sites-available/rails.conf
sudo ln -sf /etc/nginx/sites-available/rails.conf /etc/nginx/stes-enabled/rails.conf
已编辑:/etc/nginx/sites-available/rails.conf
upstream uploader {
server localhost:3000 fail_timeout=0;
}

server {
listen 80;
listen [::]:80;
#Your public folder path
root /home/d/WebApp/uploader/public;
location ~ ^/assets/ {
expires max;
gzip_static on;
gzip_vary on;
add_header Cache-Control public;
break;
}
location / {
proxy_pass http://uploader;# http://appNameYouChooseAbove
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#Inform rails how to ask nginx to deliver files.
#nginx does not take an absolute file path,
#it needs url.
#X-Accel-Mapping contains info needed to convert
#an absolute file path to an url.
proxy_set_header X-Accel-Mapping /home/d/WebApp/uploader/private=/available_only_when_redirected_here_by_upstream_server;
#The above is used by rails to translate:
#e.g.
# /home/d/WebApp/uploader/private/file.zip
# to
# available_only_when_redirected_here_by_upstream_server/file.zip
# When rails access the above, nginx delivers the file to the client
proxy_set_header X-Sendfile-Type X-Accel-Redirect;
}

location /available_only_when_redirected_here_by_upstream_server {
#without alias, nginx tries to open file at:
#"root + this location + filename"
#e.g.
# given file file.zip
# root of "/home/d/WebApp/uploader/public" as defined above.
# this lociation which is "available_only_when_redirected_here_by_upstream_server"
#
# /home/d/WebApp/uploader/public/ava...server/file.zip
#
alias /home/d/WebApp/uploader/private/;
# internal ensures this url in only available from upsteam location/application server
internal;
}

error_page 500 502 503 504 /500.html;
error_page 404 /404.html;
error_page 422 /422.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
将以下内容附加到 config/environment/development.rb
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
重启服务器
bundle exec rails s Puma
sudo service nginx restart
附言
直接访问 localhost:3000绕过 nginx;省略端口号以通过 nginx。
P.P.S
编辑了 Nginx 配置,因为它不起作用;我不知道为什么下载速度不应该提高!
“X-Accel-Mapping header 丢失”意味着 X-Accel-Redirect 不起作用。
X-Accel-Mapping 可以在内部上下文中定义,例如:
location / {
location /static {
proxy_pass http://uploader;# http://appNameYouChooseAbove
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Accel-Mapping /...=/...;
}
}
并且重定向目标可以根据需要创建任意多个,因此它并不像看起来那么糟糕。
但是请注意,Nginx 配置是一个疯狂的过程。如果没有 proxy_set_header 等,引入内部上下文会将 url 变形为根路径 + 位置形式,天哪,这不是很直观!

关于ruby-on-rails - 通过 send_file 下载 Rails 文件很慢,puma 中是否提供 X-Sendfile 或类似文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44370604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com