我有一个 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 文档中。