我们的网站是各种图像存储库.每个图像都具有外部URL和内部URL的概念.外部URL由客户端看到,并且随着我们尝试SEO而改变.内部URL是永久URL,指向我们的图像托管服务.我们使用
Ruby on Rails应用程序提供URL转换.以下是请求的示例:
-------- ----- ------- ------- ------------ | | --eURL--> | | --> | | --> | | -iURL--> | | |client| |CDN| |Nginx| | RoR | |Image Host| | | <-------- | | <-- | | <-- | | <-IMG--- | | -------- ----- ------- ------- ------------
该架构正在运行,但通过RoR流式传输图像效率很低.我想让Nginx做代理.这就是它的用途.建议的架构看起来像这样:
-------- ----- ------- ------- | | --eURL--> | | --> | | ------> | RoR | |client| |CDN| |Nginx| <-????- | | | | <-------- | | <-- | | ------- -------- ----- | | ------------ | | -iURL-> |Image Host| | | <-IMG-- | | ------- ------------
我可以向Nginx发送什么样的响应让它代理数据?我不介意将Nginx模块添加到我的基础架构中,当然我可以更改我的Nginx.conf.
X-Sendfile是我发现的最接近的东西,但它只允许从本地文件系统流式传输.也许还有一些我不知道的其他模糊的HTTP响应头或状态代码.
解决方法
将x-accel-redirect标头与特殊的Nginx位置结合使用,可以将Nginx代理与远程文件配合使用.
# Proxy download location ~* ^/internal_redirect/(.*?)/(.*) { # Do not allow people to mess with this location directly # Only internal redirects are allowed internal; # Location-specific logging access_log logs/internal_redirect.access.log main; error_log logs/internal_redirect.error.log warn; # Extract download url from the request set $download_uri $2; set $download_host $1; # Compose download url set $download_url http://$download_host/$download_uri; # Set download request headers proxy_set_header Host $download_host; proxy_set_header Authorization ''; # The next two lines Could be used if your storage # backend does not support Content-disposition # headers used to specify file name browsers use # when save content to the disk proxy_hide_header Content-disposition; add_header Content-disposition 'attachment; filename="$args"'; # Do not touch local disks when proxying # content to clients proxy_max_temp_file_size 0; # Download the file and send it to client proxy_pass $download_url; }
现在,您只需在对Nginx的响应中设置x-accel-redirect标头:
# This header will ask Nginx to download a file # from http://some.site.com/secret/url.ext and send it to user x-accel-redirect: /internal_redirect/some.site.com/secret/url.ext # This header will ask Nginx to download a file # from http://blah.com/secret/url and send it to user as cool.pdf x-accel-redirect: /internal_redirect/blah.com/secret/url?cool.pdf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。