Docker Nginx 反向代理发送 404 后的 Flask 应用程序
Docker Flask app behind nginx reverse-proxy sending 404
Tl;DR:
我在 docker 容器中有一个 运行 Flask 应用程序。当我在主机上设置 nginx 反向代理以避免必须在 URL 中输入端口号时,每次我在定义的 nginx 位置访问主页时,应用程序都会发送 404。为什么?
上下文
我有一个原型 Flask 应用 运行 作为:
flask run --host 0.0.0.0 --port 5000
它是 dockerized and is exposed on port 8080 in a compose 个文件:
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 反向代理配置文件(尚未docker为简单起见进行了优化)并且在 sites-enabled/
中自动 sym-linked。该文件包含以下内容:
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
访问主页时,服务器 returns:
web_1 | 172.27.0.1 - - [24/Sep/2041 12:34:26] "GET /my-app HTTP/1.0" 404 -
如果有帮助,我noticed that the IP shown here is actually the Gateway
value of the my-app_default
docker network使用的服务。
问题
如何让我的 Flask 应用程序在 nginx 反向代理后正常工作?
我希望从答案中得到足够的理解,以便能够在之后使用 gunicorn 设置相同的东西。
那个
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(.*)$ last;
proxy_pass http://127.0.0.1:8080;
}
IIRC,但我从没用过。
顺便说一句:通常你把符号链接放在 sites-enabled
而不是 sites-available
.
Tl;DR:
我在 docker 容器中有一个 运行 Flask 应用程序。当我在主机上设置 nginx 反向代理以避免必须在 URL 中输入端口号时,每次我在定义的 nginx 位置访问主页时,应用程序都会发送 404。为什么?
上下文
我有一个原型 Flask 应用 运行 作为:
flask run --host 0.0.0.0 --port 5000
它是 dockerized and is exposed on port 8080 in a compose 个文件:
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 反向代理配置文件(尚未docker为简单起见进行了优化)并且在 sites-enabled/
中自动 sym-linked。该文件包含以下内容:
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
访问主页时,服务器 returns:
web_1 | 172.27.0.1 - - [24/Sep/2041 12:34:26] "GET /my-app HTTP/1.0" 404 -
如果有帮助,我noticed that the IP shown here is actually the Gateway
value of the my-app_default
docker network使用的服务。
问题
如何让我的 Flask 应用程序在 nginx 反向代理后正常工作?
我希望从答案中得到足够的理解,以便能够在之后使用 gunicorn 设置相同的东西。
那个
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(.*)$ last;
proxy_pass http://127.0.0.1:8080;
}
IIRC,但我从没用过。
顺便说一句:通常你把符号链接放在 sites-enabled
而不是 sites-available
.