为了用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端口

浙公网安备 33010602011771号