gpt4 book ai didi

nginx:当 proxy_pass 失败时回退到 try_files 需要异常配置

转载 作者:行者123 更新时间:2023-12-01 18:03:45 32 4
gpt4 key购买 nike

我正在使用 Nginx 来服务器单页应用程序。基本上我们只需要服务 index.html当没有找到匹配的文件时,页面。该位置如下所示并且一直运行良好:

location / {
try_files $uri $uri/ /index.html
}

现在我想查询上游服务器,只有当失败时,才使用 try_files指令如上

如果try_files只是移动到后备位置,例如

location @fallback {
try_files $uri $uri/ /index.html;
}

location / {
proxy_pass http://127.0.0.1:8080;
proxy_intercept_errors on;
error_page 400 403 502 503 504 @fallback;
}

然后 - 当上游服务器不可用时 - 客户端会看到 Nginx 502 错误页面,而不是从文件系统提供的文件。

我终于找到了一个解决方案,可以在/index.html 后备前面使用双斜杠。这是整个配置文件,可以与官方 nginx docker 镜像一起使用进行测试

events {
}

http {

error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;

server {

listen 80;

root /usr/share/nginx/html/;

location / {
proxy_pass http://127.0.0.1:9990;
proxy_intercept_errors on;
error_page 400 403 502 503 504 = @fallback;
}

location @fallback {
try_files $uri?$args /index.html //index.html;
}
}
}

可以使用类似的命令运行

docker run -v /path/to/www/folder:/usr/share/nginx/html:ro -v /path/to/config/nginx.conf:/etc/nginx/nginx.conf -d -p 8080:80 nginx

如果最后一个 index.html 之前不存在双斜杠后备就像

location @fallback {
try_files $uri?$args /index.html;
}

然后 nginx 在文件系统上构建一个路径,如 <root>index.html ,其中缺少分隔符,而不是正确的 <root>/index.html ,每当请求一个不是根 url 的 url 时。

最后一个问题:为什么此设置需要在 try_files 指令中使用双斜杠?为什么不能只使用常规配置中的 try_files 部分并将其移动到拦截错误时使用的后备位置?

最佳答案

我遇到了类似的情况,我使用 common pitfalls 此页面的建议以相反的方式解决了这个问题。 。也就是说,首先提供静态文件,然后回退到代理:

location / {
try_files $uri $uri/ @proxy;
}
location @proxy {
proxy_pass http://127.0.0.1:9990;
}

在这种情况下,这将首先在根目录中查找文件是否作为静态文件存在,然后将请求代理到 http://127.0.0.1:9000 。这在功能上是等效的除非您希望来自代理的文件隐藏静态文件。

关于nginx:当 proxy_pass 失败时回退到 try_files 需要异常配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55764444/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com