Nginx支持的weight轮询(默认)、ip_hash、fair、url_hash这四种负载均衡调度算法
Nginx负载均衡策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,后端服务器分配的请求数基本一致,如果后端服务器“down 掉”,能自动剔除。
加权轮询
根据权重来进行轮询,权重高的服务器分配的请求更多,主要适应于后端服务器性能不均的情况,如新老服务器混用。
ip_hash
每个请求按访问 IP 的 hash 结果分配,这样每个访客固定访问一个后端服务器,主要用于
解决 session 的问题,如购物车类的应用。
fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配,能够最大化地平衡各后端服务器的压力,可以适用于后端服务器性能不均衡的情况,也可以防止某台后端服务器性能不足的情况下还继续接收同样多的请求从而造成雪崩效应。
url_hash
按访问 URL 的 hash 结果来分配请求,每个 URL 定向到同一个后端服务器,适用于后端服务器能够将 URL 的响应结果缓存的情况。
参考文档
配置示例
配置效果是:
访问 http://10.130.135.bb:9888/nabs-route-api/route/getTestOne 时,会按权重访问
http://172.16.62.aa:9082/nabs-route-api/route/getTestOne 和 http://172.16.62.aa:9083/nabs-route-api/route/getTestOne
nginx.conf 文件配置
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
worker_priority -10;
error_log /opt/logs/nginx/error.log;
pid /var/run/nginx.pid;
include modules.conf;
events {
worker_connections 10240;
}
http {
include mime.types;
server_tokens off;
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;
log_format json_log escape=json '{'
'"http_host": "$host",'
'"remote_addr": "$remote_addr",'
'"local_time": "$time_iso8601",'
'"scheme": "$scheme",'
'"request_method": "$request_method",'
'"request_uri": "$uri",'
'"request_args": "$args",'
'"status": $status,'
'"body_bytes_sent": $body_bytes_sent,'
'"http_referer": "$http_referer",'
'"http_user_agent": "$http_user_agent",'
'"request_time": $request_time,'
'"upstream_addr": "$upstream_addr",'
'"upstream_status": "$upstream_status",'
'"upstream_response_length": "$upstream_response_length",'
'"upstream_response_time": "$upstream_response_time",'
'"server_addr": "$server_addr:$server_port",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"connection_requests": $connection_requests,'
'"unix_milliseconds": "$msec",'
'"http_version": "$server_protocol",'
'"istest": "$http_istest"'
'}';
access_log /opt/logs/nginx/access.log json_log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 20;
keepalive_requests 100;
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript ;
gzip_disable 'MSIE [1-6]\.';
gzip_vary on;
resolver_timeout 3s;
large_client_header_buffers 4 8k;
client_max_body_size 20m;
proxy_buffer_size 8k;
proxy_buffering on;
proxy_buffers 8 8k;
proxy_busy_buffers_size 16k;
include conf.d/*.conf;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
## 测试测试
upstream mytest {
server 172.16.62.aa:9082 weight=1;
server 172.16.62.aa:9083 weight=1;
}
server {
listen 9888;
## nginx 安装服务器地址
server_name 10.130.135.bb;
location = /nabs-route-api/route/getTestOne {
proxy_pass http://mytest/nabs-route-api/route/getTestOne;
index index.html index.htm;
}
}
####
}
相关文档
a. PartOne 匹配模式: [=|||^~|@]
= : 表示精确匹配后面的url
~ : 表示正则匹配,但是区分大小写
~ : 正则匹配,不区分大小写
^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
@ : “@” 定义一个命名的 location,使用在内部定向时,例如 error_page
上面定义了几个不同的符号,表示不同的匹配规则,那么先后顺序呢?
- =前缀的指令严格匹配这个查询。如果找到,停止搜索。
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
- 正则表达式,在配置文件中定义的顺序。
- 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。