nginx负载均衡的三种方式
在Nginx中实现负载均衡主要有三种方式,每种方式都有其特定的应用场景和优缺点。以下是这三种方式:
1. 轮询(Round Robin)
基本原理:Nginx默认的负载均衡方式,它将客户端的请求按顺序轮流分配到每个后端服务器上。
配置示例:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 可以选择负载均衡策略,例如:
# least_conn;
# 后端服务器列表
#server 127.0.0.1:8080 weight=3; # 权重3,处理更多请求
#server 127.0.0.1:8081;
#server 127.0.0.1:8082 backup; # 备份节点,主节点故障时启用
}
server {
location / {
proxy_pass http://backend;
}
}
}
优点:简单易用,无需额外配置。
缺点:不适合所有类型的服务器,例如,如果服务器处理能力不同,可能导致某些服务器过载而其他服务器空闲。
2. 权重(Weighted)
基本原理:允许你为后端服务器指定不同的权重,权重高的服务器将获得更多的请求。
配置示例:
http {
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=1;
server backend3.example.com weight=2;
}
server {
location / {
proxy_pass http://backend;
}
}
}
优点:可以根据服务器的处理能力进行灵活分配,提高资源利用率。
缺点:配置稍显复杂,需要手动设置权重。
3. IP Hash
基本原理:根据客户端的IP地址进行哈希计算,将同一个IP地址的请求定向到同一台服务器上,适用于需要会话保持(session persistence)的场景。
配置示例:
http {
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
}
优点:确保来自同一用户的请求始终被路由到同一台服务器,适用于需要会话保持的应用。
缺点:如果后端服务器发生故障或需要增加新的服务器,可能导致某些用户被永久路由到故障服务器上,除非手动调整配置或重启Nginx。
总结选择
轮询(Round Robin):适用于简单的负载均衡需求,无需过多配置。
权重(Weighted):适用于需要根据服务器性能分配负载的情况。
IP Hash(IP-based Session Persistence):适用于需要会话保持的应用,确保同一用户的请求始终被路由到同一台服务器。
选择哪种方式取决于你的具体需求和应用场景。通常,结合使用这些方法可以满足大多数负载均衡需求。例如,你可以使用权重来优化资源分配,同时利用IP Hash来保证用户的会话一致性。
======================= 实例 ====================================
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream backend {
server localhost:8011;
server localhost:8014;
server localhost:8015;
# 可以选择负载均衡策略,例如:
least_conn;
# ip_hash;
}
server {
listen 8012; #平台API
server_name localhost;
location / {
#禁止浏览器缓存 index.html 和 version.json
if ($request_filename ~* .*\.(htm|html|json)$)
{
expires -1;
#add_header Cache-Control "no-store";
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
client_max_body_size 1024m;
client_body_buffer_size 1024m;
root "D:\web\admin\dist";
try_files $uri $uri/ @router;
index index.html index.htm;
error_page 405 =200 http://$host$request_uri;
}
location /api/ {
client_max_body_size 1024m;
client_body_buffer_size 1024m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_pass http://localhost:8011/; #http://localhost:8011/ http://192.168.1.104:8011/;
proxy_pass http://backend/;
}
location @router {
rewrite ^.*$ /index.html last;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include iot.conf;
}
负载 要留意域名后,是否有/
4. 高级配置选项
健康检查
-
被动检查:Nginx默认检测后端响应,标记不可用实例。
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
2022-02-11 Visual Studio 2022 初探 (vs2022 码)
2010-02-11 Flex :直接显示ToolTip和errorTip(不需要将鼠标移到组件上)