【问题标题】:Nginx proxy_pass to dynamic hostNginx proxy_pass 到动态主机
【发布时间】:2013-12-06 05:51:53
【问题描述】:

目前,我有一个 PHP 脚本,其中设置了一段代码,该代码从动态位置(来自数据库)读取文件并将其以块的形式回显给用户。它基本上是一个文件流脚本,用于隐藏原始文件的位置。

但是,这会带来很大的开销,因为每次下载 PHP 都会阻塞我的服务器进程。相反,我想使用 nginx,我想知道是否可以将 proxy_pass 指令动态设置为我数据库中的值。

例如,如果我的网站有一个位于http://example.com/download?hash=abcd 的页面,我需要从我的 MySQL 数据库中查找哈希 abcd 的下载 URL,然后使用 nginx 和 proxy_pass 提供该文件。

有谁知道我如何做到这一点?

【问题讨论】:

  • 您的脚本中有什么代价如此高昂,以至于它阻塞了服务器? CPU 不会因下载文件而受到影响。从外观上看,您可能会遇到子进程限制问题,而不是脚本开销问题。尝试生成更多的 php-cgi/fcgi/fpm 进程和 nginx 工作人员,应该没问题。单独的 Nginx 无法连接到数据库。
  • 用于下载文件的 PHP 进程使用了​​大约 5% 的 CPU,但同时下载的次数也会增加。它不会引起这样的问题,因为我还没有经历过减速,但是让 nginx 做 grunt 工作会比使用 PHP 更有效率。我知道 nginx 无法连接到数据库,我正在考虑让 PHP 返回一个带有真实 URL 的标头,nginx 将使用该 URL 来下载文件,就像您可以使用 X-Accel-Redirect 实现的那样。
  • 那么您可能需要使用 lua 脚本 ngx.location.capture 来调用 php-fcgi 并处理响应。

标签: php mysql nginx


【解决方案1】:

你不能直接从 nginx 连接到 mysql,但是你可以像添加代理的位置

location ~ /proxy/(?<domain>[^/]*)(?<url>/.*) {
    internal;
    proxy_pass http://$domain$url;
}

并在您的应用程序中使用 X-Accel-redirect 标头,该标头将连接到数据库,通过哈希获取下载 url 并设置例如“X-Accel-Redirect:http://your.domain.com/proxy/other.domain.com/path/to/file.txt”。

【讨论】:

  • 不幸的是,这不会对用户隐藏原始下载 URL,对吗?
  • 是的,它会的。它将由内部重定向处理。
猜你喜欢
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2011-08-10
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2018-10-30
相关资源
最近更新 更多