将带有gunicorn的Flask应用程序放在Caddy反向代理后面

问题描述 投票:0回答:1

我有一个 Flask 应用程序,正在使用 Gunicorn 运行。它自己工作。我可以通过

localhost/
访问该应用程序,然后从那里转到其他链接。该应用程序假设其根路径为
/
并相应地生成所有相对 URL。

现在我想把它放在反向代理后面,为此我使用 Caddy。但我也希望它位于子路径上。因此,用户会将

example.com/myapp/
视为根页面,以及类似
example.com/myapp/profile
的页面。但是,Flask 应用程序的代码将继续包含
<a href="/profile">
之类的内容。我假设 Caddy 可以简单地重写 URL 并使其全部工作,因为我使用过的其他服务器都能够以这种方式工作,尽管它们通常采用某种“根 URL”配置参数。

但是,当我使用反向代理运行我的应用程序时,URL 被破坏。它尝试将用户从

example.com/myapp/
发送到
example.com/profile
,而不是
example.com/myapp/profile
。我的 Caddyfile 目前只是说:

handle_path /myapp/* {
    reverse_proxy internal.app.url:8000
}

如何才能使链接正常工作?这是应该在 Caddyfile、gunicorn 配置或我的 Flask 应用程序中解决的问题吗?

Gunicorn 有一个 nginx 配置示例,其中设置了一些代理标头:https://docs.gunicorn.org/en/latest/deploy.html 但是,根据我的经验,nginx 有一些愚蠢的默认值,并且配置最终变得冗长,因为它的。我需要在我的 Caddyfile 中复制多少这些内容,以及如何复制?

Flask 显然有一个

url_for
方法可以动态生成 URL。但是,我可以简单地在应用程序中定义一个
ROOT_URL
参数,并将其添加到所有相对 URL 的前面。我很确定它会起作用,但它会让所有 URL 看起来很难看,而且我无法再通过
localhost/profile
访问我的应用程序页面(用于测试),我必须使用
localhost/myapp/profile
。另外,我的“推荐”
url_for
似乎比自己做更多工作,所以我觉得我在这里错过了一些东西。

flask reverse-proxy gunicorn caddy
1个回答
0
投票

无论如何,我相信问题出在

Caddyfile
。您应该使用
handle
而不是
handle_path
,以免从 url 中删除前缀。

来自

handle_path
的 Caddy 文档:

与handle指令的工作方式相同,但隐式使用uri strip_prefix来去除匹配的路径前缀。

© www.soinside.com 2019 - 2024. All rights reserved.