【问题标题】:Docker Flask app behind nginx reverse-proxy sending 404nginx反向代理后面的Docker Flask应用程序发送404
【发布时间】:2021-05-04 02:56:10
【问题描述】:

Tl;DR:
我在 docker 容器中有一个正在运行的 Flask 应用程序。当我在主机上设置 nginx 反向代理以避免必须在 URL 中输入端口号时,每次我在定义的 nginx 位置点击主页时,应用程序都会发送 404。为什么?

上下文

我有一个原型 Flask 应用程序运行为:

flask run --host 0.0.0.0 --port 5000

它是 dockerized,并在 compose 文件中的 8080 端口上公开:

ports:
  - "8080:5000"

一切正常,当我点击主页http://my-server.org:8080时,服务器高兴地说:

web_1  | in route /
web_1  | 166.24.119.203 - - [24/Sep/2041 10:29:20] "GET / HTTP/1.1" 200 -
web_1  | 166.24.119.203 - - [24/Sep/2041 10:29:21] "GET /static/css/style.css HTTP/1.1" 200 -
web_1  | 166.24.119.203 - - [24/Sep/2041 10:29:21] "GET /static/favicon.ico HTTP/1.1" 200 -

现在,为了避免在 URL 中输入端口,我在主机上的 /etc/nginx/sites-available/ 中设置了一个简单的 MWE nginx 反向代理配置文件(为简单起见尚未 dockerized),它是自动sym-linkedsites-enabled/。该文件包含以下内容:

server {
    listen 80;
    listen [::]:80;

    server_name my-server.org;

    location /my-app {
        proxy_pass http://127.0.0.1:8080;
    }
}

请注意nginx 正在正常运行:

# service nginx status
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-01-30 10:48:17 CET; 54min ago
   ...

现在,我现在每次点击http://my-server.org/my-app的主页,服务器都会返回:

web_1  | 172.27.0.1 - - [24/Sep/2041 12:34:26] "GET /my-app HTTP/1.0" 404 -

如果有帮助,我noticed 认为这里显示的 IP 实际上是服务使用的 my-app_default docker networkGateway 值。

问题

如何让我的 Flask 应用程序在 nginx 反向代理后面正常工作?
我希望能够从答案中充分理解,以便能够在之后使用gunicorn 设置相同的东西。

【问题讨论】:

    标签: docker nginx flask docker-compose nginx-reverse-proxy


    【解决方案1】:

    那个

        location /my-app {
            proxy_pass http://127.0.0.1:8080;
        }
    

    /my-app 添加到http://127.0.0.1:8080

    修复:在端口后添加斜杠/

        location /my-app/ {
            proxy_pass http://127.0.0.1:8080/;
        }
    

    是的,结尾的斜线在 Nginx 中通常会产生很大的不同。

    相当于:

        location /my-app/ {
            rewrite ^/my-app(.*)$ $1 last;
            proxy_pass http://127.0.0.1:8080;
        }
    

    IIRC,但我从不使用它。

    顺便说一句:通常你把符号链接放在sites-enabled而不是sites-available

    【讨论】:

    • 我修复了 sites-enabled 的反转 sites-available,这是一个错误。我将测试您的解决方案并在之后进行所有必要的更新。 /my-app/ 中的斜杠是否也是强制性的?
    • 听起来不错,但我注意到没有提供 CSS 和 JS 文件(静态文件夹)...
    • 当然。您必须更改路径(通过浏览器中的按键 F12 -> Network 查看),或者您必须使用 sub_filtersubs_filter on-the-fly 重写代码中的路径。
    • 这真的很有帮助
    猜你喜欢
    • 2020-11-28
    • 2021-05-15
    • 2021-07-15
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多