我有一个烧瓶应用程序通过主管守护进程。我想将localhost上的子文件夹proxy_pass传递给烧瓶应用程序。烧瓶应用程序在直接运行时正确运行,但在通过代理调用时会出现404错误。这是nginx的配置文件:
upstream apiserver {
server 127.0.0.1:5000;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://apiserver;
proxy_next_upstream error timeout http_502;
proxy_buffering off;
}
例如,当我转到http://127.0.0.1:5000/me
时,我会从应用中获得有效回复。但是当我去http://127.0.0.1/api/me
时,我从烧瓶应用程序(不是nginx)获得了404。此外,烧瓶SERVER_NAME
变量设置为127.0.0.1:5000
,如果这很重要的话。
我真的很感激任何建议;我很难过!如果我还需要添加其他内容,请告诉我们!
答案 0 :(得分:8)
我建议不要设置SERVER_NAME。
如果设置了SERVER_NAME,则404将发出与该值不匹配的任何请求。
答案 1 :(得分:6)
由于Flask正在处理请求,您可以在404错误中添加一些信息,以帮助您了解传递给应用程序的内容,并为您提供有关nginx配置更改导致的影响的实际反馈。
from flask import request
@app.errorhandler(404)
def page_not_found(error):
return 'This route does not exist {}'.format(request.url), 404
因此,当您获得404页面时,它将有助于告诉您Flask正在处理的内容,这可以帮助您快速缩小问题范围。
答案 2 :(得分:4)
我遇到了同样的问题。烧瓶应该在这里提供更多冗长的错误,因为裸体404并不是非常有用。
就我而言,SERVER_NAME已设置为我的域名(例如example.com
)。
nginx在没有服务器名称的情况下转发请求,正如@Zoidberg所说,这导致Flask触发404。
解决方案是将nginx配置为使用与Flask相同的服务器名称
在您的nginx配置文件中(例如sites_available
或nginx.conf
,取决于您定义服务器的位置):
server {
listen 80;
server_name example.com; # this should match Flask SERVER_NAME
...etc...