Nginx如何根据前缀路径转发到不同的Flask服务

 更新时间:2023年01月06日 09:50:30   作者:Bear_beat  
这篇文章主要介绍了Nginx如何根据前缀路径转发到不同的Flask服务,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

开端

想通过不同的前缀路径经过nginx转发到不同的服务上,比如 /user/转发到用户服务,/other/转发到其他服务。

首先配置nginx的location根据前缀匹配。

server {
    listen 80;
    server_name localhost;

    location /user/ {
            proxy_pass http://127.0.0.1:5000; # 用户服务
    }

	  location /other/ {
            proxy_pass http://127.0.0.1:5001; # 其他服务
    }
}

这样访问http://127.0.0.1:5000/user/xxx/就会转发到用户服务,访问http://127.0.0.1:5000/other/xxx/就会转发到其他服务。

这样就会有一个问题,flask application并不知道有前缀,所以使用url_for构造url的时候并不会自己添加前缀,要构造出正确带前缀的url就需要把前缀加入到WSGI环境中的SCRIPT_NAME去。

解决一(设置SCRIPT_NAME)

gunicorn文档上:

可以把SCRIPT_NAME设置到环境变量中或者HTTP header中。

通过docker部署设置SCRIPT_NAME在环境变量中,可以在docker-compose.yml中加入

environment:
  - SCRIPT_NAME=/user/

或者把SCRIPT_NAME设置在header中可以在nginx配置中加上

proxy_set_header SCRIPT_NAME /user/;

gunicorn.wsgi处理请求的时候是这样处理PATH_INFO和SCRIPT_NAME的:

解决二(设置头部X-Forwarded-Prefix再用ProxyFix调整WSGI环境)

同样的也可以ProxyFix中间件来调整WSGI环境,设置SCRIPT_NAME。

来自werkzeug ProxyFix文档:

通过nginx设置头部信息X-Forwarded-Prefix:

proxy_set_header X-Forwarded-Prefix /user/;

使用ProxyFix:

from werkzeug.middleware.proxy_fix import ProxyFix
app = ProxyFix(app, x_prefix=1)

还需要把nginx的proxy_pass修改下:

server {
    listen 80;
    server_name example.com;

    location /user/ {
            proxy_pass http://127.0.0.1:5000/; # 用户服务
    }

	  location /other/ {
            proxy_pass http://127.0.0.1:5001/; # 其他服务
    }
}

两种解决的区别

nginx proxy_pass配置的区别

区别在于nginx的proxy_pass中结尾是否带/。

如果proxy_pass不带uri,就是不带/,则请求会原封不动的转发给下一个服务。

如果proxy_pass带uri,则匹配的uri部分将会被修改为该proxy_pass中的uri。

为什么需要这样处理

以我的理解是这样的,请求进来通过gunicorn处理请求,gunicorn.wsgi中会根据SCRIPT_NAME来制定PATH_INFO,所以当解决一带着SCRIPT_NAME=/user/,PATH_INFO=/user/xxx/经过处理后PATH_INFO会变成/xxx/

而解决二中当gunicorn.wsgi处理请求时ProxyFix还没对WSGI环境进行处理,所以SCRIPT_NAME是为空的,PATH_INFO则会一直是带着SCRIPT_NAME前缀为/user/xxx/,是不能正确匹配到route的,所以把nginx proxy_pass改为uri形式使PATH_INFO能正确匹配。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nginx 502、413和404错误原因排查和解决办法总结

    nginx 502、413和404错误原因排查和解决办法总结

    这篇文章主要给大家介绍了NGINX 502错误排查,办法总结,Nginx 413错误的排查以及Nginx 400错误排查,文中通过代码示例给出了详细的排查方法和解决方案,需要的朋友可以参考下
    2023-12-12
  • 基于Nginx禁止指定IP、国外IP访问我的网站

    基于Nginx禁止指定IP、国外IP访问我的网站

    这篇文章主要介绍了用Nginx禁止指定IP、国外IP访问我的网站,想要实现这个功能方法有很多种,这里基于 Nginx 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站,需要的朋友可以参考下
    2022-05-05
  • Nginx中map指令的具体使用

    Nginx中map指令的具体使用

    Nginx的map指令是一个强大的工具,用于根据变量的值来设置另一个变量的值,本文就来介绍一下Nginx中map指令的具体使用,感兴趣的可以了解一下
    2024-07-07
  • nginx配置proxy_pass中url末尾带/与不带/的区别详解

    nginx配置proxy_pass中url末尾带/与不带/的区别详解

    这篇文章主要介绍了nginx配置proxy_pass中url末尾带/与不带/的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Nginx访问慢问题解决办法(慢1s)

    Nginx访问慢问题解决办法(慢1s)

    这篇文章主要给大家介绍了关于Nginx访问慢问题解决办法的相关资料,访问速度对网站是极为关键的因素,而服务器对其影响最为深远,需要的朋友可以参考下
    2023-08-08
  • Nginx配置之location的匹配优先级浅析

    Nginx配置之location的匹配优先级浅析

    这篇文章主要给大家介绍了关于Nginx配置之location的匹配优先级的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • nginx中proxy_pass各种用法详解

    nginx中proxy_pass各种用法详解

    nginx中配置location代理转发规则的时候不同写法对应不同转发规则。本文就介绍几种常见的匹配情况,感兴趣的可以了解一下
    2021-11-11
  • Windows设置nginx启动端口的方法

    Windows设置nginx启动端口的方法

    在服务器配置与开发过程中,nginx 作为一款高效的 HTTP 和反向代理服务器,被广泛应用,而在 Windows 系统中,合理设置 nginx 的启动端口,是确保其正常运行与满足业务需求的关键步骤,本文将详细介绍 Windows 设置 nginx 启动端口的方法,需要的朋友可以参考下
    2025-02-02
  • 教你使用Nginx限制百度蜘蛛频繁抓取的问题

    教你使用Nginx限制百度蜘蛛频繁抓取的问题

    这篇文章主要介绍了使用Nginx限制百度蜘蛛频繁抓取的问题,百度蜘蛛对网站的抓取频率高和抓取量骤增导致服务器负载高,经常收到警告信息,每分钟允许百度蜘蛛抓取200次,超过频率限制的返回503,对Nginx限制蜘蛛频繁抓取相关知识感兴趣的朋友一起看看吧
    2022-01-01
  • HipChat上传文件报未知错误的原因分析及解决方案

    HipChat上传文件报未知错误的原因分析及解决方案

    HipChat的功能类似于Campfire、Sazneo等在线协同工具,并且和Yammer以及Salesforce的Chatter等企业社交平台有一定相似之处。你可以为单个项目或者小组搭建自有的聊天室,也可以很方便的发起一对一聊天
    2016-01-01

最新评论