NGINX 是现代 Web 架构中最常用的高性能 Web 服务器和反向代理服务器之一。它不仅能高效处理静态资源,还能通过负载均衡功能将流量分发到多个后端应用服务器,提升系统的并发能力和高可用性。本文将详细介绍 NGINX 的负载均衡原理,并通过 Flask 服务进行实战验证。
一、NGINX 负载均衡原理
NGINX 作为反向代理服务器,可以将客户端请求分发到后端多台服务器(上游服务器),实现负载均衡。其主要负载均衡算法包括:
- 轮询(Round Robin):默认方式,依次将请求分发到每个后端服务器。
- 最少连接(Least Connections):优先分发到当前连接数最少的服务器。
- IP 哈希(IP Hash):同一 IP 的请求分发到同一服务器,适合会话保持。
NGINX 还支持健康检查,自动剔除故障节点,保证高可用。
二、NGINX 负载均衡配置示例
假设有两台后端应用服务器,IP 分别为 127.0.0.1:8001
和 127.0.0.1:8002
,可以这样配置 NGINX:
nginx
# /etc/nginx/nginx.conf
http {
upstream flaskapp {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 8080;
location / {
proxy_pass http://flaskapp;
}
}
}
你也可以根据需求选择不同的负载均衡算法:
-
最少连接:
nginxupstream flaskapp { least_conn; server 127.0.0.1:8001; server 127.0.0.1:8002; }
-
IP 哈希:
nginxupstream flaskapp { ip_hash; server 127.0.0.1:8001; server 127.0.0.1:8002; }
修改配置后,重载 NGINX:
pwsh
nginx -s reload
三、使用 Flask 服务验证 NGINX 负载均衡
下面通过两个 Flask 服务实例,验证 NGINX 的负载均衡效果。
1. 启动多个 Flask 服务
分别在不同端口启动两个 Flask 实例:
python
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f'Hello from Flask! PID: {os.getpid()}'
if __name__ == '__main__':
app.run(port=8001)
复制一份,修改端口为 8002:
python
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f'Hello from Flask! PID: {os.getpid()}'
if __name__ == '__main__':
app.run(port=8002)
分别运行:
pwsh
python app.py
python app2.py
2. 配置 NGINX 负载均衡
如上文所示,配置 NGINX 的 upstream
和 proxy_pass
,将流量分发到两个 Flask 服务。
3. 验证负载均衡效果
多次访问 NGINX 端口(如 http://localhost:8080/
),你会看到返回的 PID 不同,说明请求被分发到了不同的 Flask 实例。
pwsh
curl http://localhost:8080/
多次执行,返回结果会在两个 Flask 服务之间切换。
四、总结
NGINX 通过反向代理和多种负载均衡算法,将流量分发到多个后端服务器,显著提升系统的并发能力和高可用性。通过简单的 Flask 服务实例,可以直观验证 NGINX 的负载均衡效果。无论是生产环境还是开发测试,NGINX 都是实现高性能和高可用架构的首选工具。
欢迎留言交流更多 NGINX 负载均衡与 Python 服务实战经验!