繁体   English   中英

PDF损坏的Rails 5,Nginx,ElasticBeanstalk

[英]PDFs Corrupted Rails 5, Nginx, ElasticBeanstalk

我已经尝试了一切,但想法不多了。 请帮忙。

我们在AWS上部署了Elastic Beanstalks,并部署了运行Ruby 2.4(Puma)的64位Amazon Linux 2017.09 v2.7.1。 在它们上运行的是Nginx 1.12.1和Rails 5。

在控制器中,我正在从API下载PDF,然后尝试将其发送出去。

data = API::StatementPDF.new(id: params[:id]).result
    send_data data.force_encoding('BINARY'),
              :filename => "statement.pdf",
              :type => "application/pdf",
              :disposition => "attachment",
              stream: 'true',
              buffer_size: '4096',
              :x_sendfile => true

我尝试了是否使用force_encodingbuffer_sizex_sendfile 尝试将缓冲区大小增加到大量。 尝试在.ebextensions/nginx/conf.d/nginx-extensions.conf禁用.ebextensions/nginx/conf.d/nginx-extensions.conf gzip

# Configure GZIP compression
gzip              off;
gzip_min_length   1100;
gzip_types        application/pdf;
gzip_vary         on;

但是无论我做什么,PDF都将损坏,并且如果我在文本编辑器中打开文件,则许多字符的编码不正确。

左边是工作的PDF,右边是Beanstalk / Rails / Nginx服务器发送的PDF。

在本地运行Rails服务器时,PDF可以正常使用。 向应用程序中添加静态PDF并提供服务也会导致文件损坏。

send_file "#{Rails.root}/app/assets/statement.pdf", type: "application/pdf", x_sendfile: true

...所以我确信这是Nginx,Puma或Elastic Beanstalk的问题。 请帮忙。

问题最终出在API网关上。

  • Ruby on Rails
  • 彪马
  • NGINX
  • API网关

我认为NGINX之外没有什么。

NGINX实际上对二进制文件的编码并没有做任何奇怪的事情。

而且,这也不大可能与http://nginx.org/r/gzip相关,因为gzip压缩是在HTTP协议级别完成的请求中使用Accept-Encoding ,响应中使用 Content-Encoding ),并且产生的下载内容应在HTTP上下文之外以未压缩的形式呈现(与下载中不包含HTTP标头的方式相同)。

最后,尽管可能不适用于statement.pdf (大概是特定于用户的一次性使用语句,其大小可与普通网页相当),但通过代理服务器提供可下载二进制文件的最佳做法是使用X-Accel-Redirect对代理服务器的特殊处理,nginx完全按照http://nginx.org/r/proxy_ignore_headershttp://nginx.org/r/internal支持 ,从而消除了额外的瓶颈和服务效率低下的问题具有实际后端的大型文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM