导航

nginx负载均衡flask项目

Posted on 2021-05-24 22:07  old_dog~  阅读(1082)  评论(0)    收藏  举报

为了用Nginx实现Flask项目的负载均衡配置,网上看了好多好多的帖子。

但是,帖子不是一模一样,就是极其相似。

今天终于完成了配置,写篇帖子记录一下。

***************************************************上面都是废话***************************************************

内容分为3部分:

(1)Nginx。

(2)反向代理Flask项目

(3)负载均衡搭建Flask项目。

一、Nginx。

  nginx我就不说了,简单的聊一聊代理、反向代理、负载均衡。访问流程如下图所示,为方便说明。做个角色扮演:

学生:我(普通学生)

班长:服务器A

辅导员:服务器B,B1,B2

  代理:我让班长去找辅导员盖个章。班长回我辅导员盖章情况。我知道盖章是辅导员盖,但是我就是想让班长替我办事。

  反向代理:我让班长给我盖章,班长去找辅导员给我盖章。班长回我他盖章情况。我只知道班长可以盖章,至于他怎么盖,我不清楚。

  负载均衡:还是我让班长盖10个章,班长去找辅导员盖章,班长会来事,害怕辅导员累着,就按照自己的想法让2个辅导员盖完这10个章。班长回我他盖章情况,我也不清楚他怎么盖的。

  不知道,我说清楚没?

  

 

二、Nginx反向代理Flask项目

  (1)Flask程序,命名为“run.py”

from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def index():
	return u"index"


@app.route("/ip") 
def IP():
	return request.headers["X-Forwarded-For"]  # 返回请求头“"X-Forwarded-For”字段


if __name__ == "__main__":
    # 云服务器上,host一定得写 “0.0.0.0”。	
    app.run(host="0.0.0.0", debug=True) 
    

  运行程序:python3 run.py 。

  假设服务器IP:1.12.13.14,那么浏览器访问“http://1.12.13.14:5000”就会返回 “indx”。Flask项目运行(Flask项目默认5000端口)。

  如果不能访问,需要考虑防火墙问题。

  (2)nginx反向代理。

  具体安装就不说了,网上一找一大堆。修改配置(linux系统一般是“/etc/nginx/nginx.conf”),添加如下字段:

proxy_set_header   X-Real-IP  $remote_addr;  # 在请求头中添加“X-Real-IP” 键值对,值为nginx服务器中$remote_addr的值。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 客户端IP 。解释同上
proxy_pass http:
//127.0.0.1:5000; # 转发请求
这段配置的作用是:
  接收客户端的请求,然后对请求头新增字段,将请求发送给
http://127.0.0.1:5000;也就是代理功能。
$remote_addr 、$proxy_add_x_forwarded_for    当你需要客户端IP时,一定看看这两个字段。详细介绍,请自行百度。简单的对二者做个对比。
 
$remote_addr
$proxy_add_x_forwarded_for
含义 最近访问机器IP 客户端IP
代理 代理IP 客户端IP
无代理 客户端IP 客户端IP

  配置修改相对位置可以参考下图。

 

   (3)反向代理完成。

重启Nginx服务器。nginx -s reload

假设服务器ip为:1.12.13.14, 此时直接访问1.12.13.14就可以访问原来的“1.12.13.14:5000”。

 

三、负载均衡。

  nginx内置负载均衡有三种“轮询”、“权重”、“绑定”,具体不介绍,请百度。以“权重”为例负载均衡。

  (1)新增运行为web项目,端口设置为5001.源码如下,命名为run2.py:

from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def index():
        return u"index"


@app.route("/ip")
def IP():
        return request.headers["X-Forwarded-For"]

@app.route("/ip1")
def IP1():
        return request.headers["X-Real-IP"]

if __name__ == "__main__":
        app.run(host="0.0.0.0", port=5001, debug=True) # 与上面python程序唯一的却别是 新增“port”

  运行程序 python3 run2.py。此时应该有两个Flask项目,端口分别是5000,、5001。

  (2)修改nginx配置(一般位置在“/etc/nginx/nginx.conf”),新增字段:

upstream web{
        server 127.0.0.1:5000 weight=2; # weight权重。 访问2次5000就会访问一次5001端口
        server 127.0.0.1:5001 weight=1;
    }
##################################################
# 上面新增, 下面修改
##################################################
proxy_pass http://web;

  相对位置参考下图:

 

   (3)重启nginx。nginx -s reload。

   假设ip为:1.12.13.14。连续访问10次,5001端口至少3次被访问。

5000端口

 

5001端口