【发布时间】: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 并处理响应。