摆脱 nginx 配置中的 if 指令

摆脱 nginx 配置中的 if 指令

我有一个 Django 应用程序,它以 nginx 作为反向代理,以 gunicorn 作为应用程序 Web 服务器(上游)。

在我的 nginx 虚拟主机文件块中location /,我引用了 Web 应用程序服务器中的 unix 套接字,如下所示:

if (!-f $request_filename) {
    proxy_pass http://application_server;
    break;
}

想法是不需要让 gunicorn 来提供静态资产,nginx 应该会处理它们。

我有两个相关问题:1) 从性能角度来看,在 nginx 上进行这种类型if else检查可能会很昂贵。您在经验中见过这种情况吗?我的 Web 应用是一个高流量社交论坛,需要提供大量静态资产。您有什么想法、应该做什么和不应该做什么(如果有的话)?需要更多信息吗?

2)有充分证据表明if 是邪恶的在 nginx 上下文中。我如何if用一个来更改指令try_files?我自己试了一下;它看起来很简单。但每次都崩溃了。这是我尝试的:

  • 将整个if指令替换为try_files $uri @application_server;
  • 包括location @application_server下面的一个块location /;它包含proxy_pass http://application server
  • upstream application_server配置文件顶部(外面)有一个块server,它包含对 unix 套接字的引用和fail_timout=0;

应该有用,不是吗?如果你需要的话可以向我询问更多信息。

答案1

您发布的错误是由 Django 返回的,因为它无法找出 URL 的主机名部分。

当您从 Web 服务器代理时,您必须明确传递此标头。

您遗漏的关键一行是:

location @application_server {
    proxy_set_header Host $http_host;
    ...

另请参阅nginx 配置示例在 gunicorn 文档中。

相关内容