在Nginx中实现负载均衡主要有三种方式,每种方式都有其特定的应用场景和优缺点。以下是这三种方式:
1. 轮询(Round Robin)
基本原理:Nginx默认的负载均衡方式,它将客户端的请求按顺序轮流分配到每个后端服务器上。
配置示例:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 可以选择负载均衡策略,例如:
# least_conn;
# ip_hash;
# 后端服务器列表#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. 高级配置选项
健康检查