Nginx 是否有可能阻止自身在同一个实例上请求另一个 URL?

Nginx 是否有可能阻止自身在同一个实例上请求另一个 URL?

我有一个在 Apache 中运行的设置,但现在它在使用 php-fpm 的 Nginx 中失败了:

  • 我有一个提供服务的 PHP 脚本,您可以调用 URL 并获取一些数据
  • 我有第二个 PHP 脚本正在尝试使用第一个脚本(通过调用 file_get_contents 或使用 curl 都无所谓)

  • 同一 Apache 服务器上的两个脚本均运行良好

  • 一个脚本在 Apache 上,另一个在 Nginx 上工作正常,无论哪个方向
  • Nginx 上的两个脚本均因超时时间过长(20-30 秒)而失败

我在某处读到过,Nginx 正在一个接一个地执行所有请求,因此一个长时间运行的脚本可能会阻止所有请求。

Nginx 自我阻塞是可能的/正常的吗?

给有积极性的读者的额外想法:

如果是的,并且您能提供解决方案,那就太好了,但目前,这是否是问题的可能原因还不清楚。

我考虑过路由问题,但使用第二个服务器间接调用脚本也行不通,而两个独立任务却可以。这让我很抓狂。

此外,第二个脚本有时只会在同一台机器上调用第一个脚本。通常它会使用其他服务器,因此我必须添加复杂的业务逻辑来区分这两种情况并采取不同的行动,而这正是我想要避免的。

我曾经考虑过在 Nginx 后面使用 Apache 来运行 PHP,但是如果 Nginx 是阻塞部分,我就会遇到同样的问题。

像所有地方建议的那样使用 curl 也没有解决问题。一切都归结为 Nginx 自身阻塞。

这也不是一个编码问题,它在其他所有情况下都能正常工作,除了 Nginx 再次调用自身时。已经用两个文件测试了它,一个执行echo "X";第二个echo file_get_contents($url1);

由于我的第一个问题因范围太广而被关闭,因此我已将其重新发布为是非问题。

答案1

Nginx 有一个事件驱动模型,所以它不会阻止请求处理。

但是如果您只运行一个工作进程,那么您应该设置multi_accept on;事件块,以便工作进程一次接受多个连接。

相关内容