![](/img/trans.png)
[英]ElasticBeanstalk and Rails - Deploying app but only getting 404 Not Found nginx/1.4.3
[英]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_encoding
, buffer_size
, x_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网关上。
我认为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_headers和http://nginx.org/r/internal支持 ,从而消除了额外的瓶颈和服务效率低下的问题具有实际后端的大型文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.