一、 nginx负载均衡策略
nginx作为一种高效的web服务器和反向代理服务器,广泛应用于网站的负载均衡中。负载均衡是指将接收到的网络请求分配到多个后端服务器上,这样可以提高网站的处理能力,避免单个服务器过载,同时也提高了网站的可用性和可靠性。
1.1 基本负载均衡策略
- 轮询(round robin) :这是最基本的负载均衡方法,也是nginx默认的策略。它按照请求的顺序依次将请求分配给每个服务器。如果某个服务器宕机,它会自动被排除在分配队列之外
- 权重(weighted round robin) :在轮询的基础上,可以为每个服务器设置一个权重,根据权重的不同,服务器被分配请求的概率也不同。权重越高,分配到的请求越多
- ip哈希(ip hash) :通过客户端的ip地址进行哈希计算,然后根据哈希值将请求分配给特定的服务器。这种方法可以确保来自同一ip地址的客户端用户会被分配到同一台服务器,适用于需要会话保持的应用场景
- 最少连接数(least connections) :将请求分配给当前连接数最少的服务器。这种策略适用于处理时间不均匀的请求,可以避免某些长时间占用连接的请求导致服务器负载过高
1.轮询:每个请求会按时间顺序逐一分配到不同的后端服务器
参数 | 备注 |
---|---|
fail_timeout | 与max_fails结合使用。 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了 |
fail_time | 服务器会被认为停机的时间长度,默认为10s |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里 |
down | 标记服务器永久停机了,用于明确排除故障或维护中的服务器,避免无效请求 |
注意:
- 在轮询中,如果服务器down掉了,会自动剔除该服务器。
- 缺省配置就是轮询策略。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
upstream backend { server backend1.example.com fail_timeout=60s max_fails=2; server backend2.example.com fail_timeout=60s max_fails=2; } max_fails=2; 表示如果在 fail_timeout 时间段内,nginx 向某一个上游服务器发起请求失败次数达到 2 次,则认为该服务器不可用。 fail_timeout=60s; 有两个作用:首先,它定义了上述 max_fails 中提到的时间窗口长度,在这个例子中是 60 秒;其次,一旦某个上游服务器被认为不可用,nginx 将会在接下来的 60 秒内不再向这台服务器转发任何请求。 这种配置有助于提高服务的可靠性,通过自动禁用那些看起来已经失效的服务器,并在一段时间后重新尝试连接它们,从而避免将客户端请求发送到不健康的服务器上。 在这个配置中,如果 backend1.example.com 在 60 秒内连续失败 2 次请求,nginx 会暂时停止向它转发请求 60 秒,并仅将请求转发给 backend2.example.com。同样地,对于 backend2.example.com 也会应用相同的规则。这样的设置可以确保即使有一个服务器出现问题,用户仍然能够被导向到另一个可用的服务器。
2.权重:通过
weight
参数为服务器分配权重(weight=1
为默认值),权重越高分配的请求越多
- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况;例如: 虚拟机和物理界混合部署
注意:
upstream backend { server 192.168.1.1:80 weight=10; # 高性能服务器,处理更多请求 server 192.168.1.2:80 weight=5; # 低性能服务器,处理较少请求 }
3.ip哈希:根据客户端 ip 地址进行哈希计算,确保同一 ip 的请求始终转发到同一台服务器
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
- ip_hash不能与backup同时使用
- 此策略适合有状态服务,比如session
- 当有服务器需要剔除,必须手动down掉
- 需要会话保持的场景(如电商购物车、用户登录状态),但服务器故障时可能导致会话丢失
upstream backend { ip_hash; # 启用 ip 哈希策略 server 192.168.1.1:80; server 192.168.1.2:80; } ------------------------------------------------------ upstream fileserver { ip_hash; server 192.19.31.91:32100 fail_timeout=60s max_fails=2; server 192.19.31.92:32100 fail_timeout=60s max_fails=2; keepalive 100; }
4.最少连接数:将请求转发给当前连接数最少的服务器,适应流量波动
注意:
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
upstream backend { least_conn; # 启用最少连接策略 server 192.168.1.1:80; server 192.168.1.2:80; }
加权最少连接数:在最少连接的基础上,通过
weight
参数为服务器设置处理能力权重,均衡更精准
- 公式:
(当前连接数) / (weight)
,值越小的服务器优先分配请求。
注意:
- 适用于服务器性能有差异,且需动态均衡连接数的场景(如混合云部署)
upstream backend { least_conn; server 192.168.1.1:80 weight=10; # 高配服务器,权重更高,允许处理更多连接 server 192.168.1.2:80 weight=5; # 低配服务器,权重较低,保护其负载 }
1.2 第三方策略
- fair:根据后端服务器的响应时间来分配请求,响应时间短的服务器优先分配
- url_hash:根据访问url的哈希结果来分配请求,确保同一个url请求总是被分配到同一台服务器,有助于提高缓存命中率
5.fair(公平策略):将请求转发给响应速度最快的服务器,优化用户体验
注意:
原理(非官方标准策略,需 upstream_fair模块)
- 需要第三方插件
- 将请求转发给响应速度最快的服务器,优化用户体验。
- 动态感知服务器处理能力,适合请求耗时差异大的场景。
6.url哈希:对请求的 url 进行哈希计算,相同 url 的请求始终转发到同一台服务器(常用于缓存场景)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取
注意:
- 依赖模块:需加载 ngx_http_upstream_hash_module(nginx 官方模块,编译时需启用)
upstream backend { hash $request_uri consistent; # 对 url 哈希,`consistent` 启用一致性哈希(减少服务器变动时的哈希重分布) server 192.168.1.1:80; server 192.168.1.2:80; }
1.3 策略对比
通过合理选择负载均衡策略,nginx 可高效分配流量,提升后端服务的可用性和性能
策略 | 核心逻辑 | 优势场景 | 缺点 |
---|---|---|---|
轮询 | 顺序分配 | 服务器性能一致 | 不考虑负载状态 |
加权轮询 | 按权重分配 | 服务器性能不同 | 静态配置,不动态调整 |
最少连接 | 连接数最少优先 | 长连接或请求耗时不均 | 未考虑服务器性能差异 |
加权最少连接 | 连接数与权重结合 | 性能差异化且需动态均衡 | 配置较复杂 |
ip 哈希 | 客户端 ip 绑定 | 会话保持 | 服务器故障时会话可能丢失 |
url 哈希 | url 绑定服务器 | 资源缓存加速 | 需额外模块,仅适用特定场景 |
二、 nginx配置
2.1 基本命令
nginx -t 检查配置文件是否有语法错误 nginx -s reload 热加载,重新加载配置文件 nginx -s stop 快速关闭 nginx -s quit 等待工作进程处理完成后关闭
若在linux系统可以配置nginx.service文件
[unit] description=nginx web server after=network.target [service] type=forking execstart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #修改nginx目录 execreload=/usr/local/nginx/sbin/nginx -s reload execstop=/usr/local/nginx/sbin/nginx -s stop killmode=process restart=always restartsec=5s startlimitinterval=0 [install] wantedby=multi-user.target
启动安装(开机自启动)nginx sudo systemctl daemon-reload //重新加载systemd服务 sudo systemctl enable nginx.service sudo systemctl start nginx.service systemctl status nginx.service systemctl restart nginx.service
2.2 nginx默认配置详解
user nginx; # nginx 工作进程运行的用户(默认:nginx,可改为其他用户) worker_processes auto; # 工作进程数,通常设为 cpu 核心数(默认:1,建议设为 auto 或实际核心数) error_log /var/log/nginx/error.log; #错误日志 pid /run/nginx.pid; # load dynamic modules. see /usr/share/doc/nginx/readme.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; # 定义每个工作进程的最大连接数。此处设置为 1024,表示每个进程最多处理 1024 个并发连接 } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #定义日志格式 main,用于记录访问日志 #$remote_addr:客户端 ip 地址 # $time_local:请求时间。 #$request`:客户端请求的原始行(如 `get /index.html http/1.1) #$status:响应状态码(如 200、404) #$body_bytes_sent:发送给客户端的字节数(不包括响应头) #$http_referer:请求来源页面 #$http_user_agent:客户端浏览器标识 #$http_x_forwarded_for:代理链中的客户端 ip(用于反向代理场景) access_log /var/log/nginx/access.log main; sendfile on; #启用高效文件传输模式(直接从磁盘发送文件到网络) tcp_nopush on; #优化 tcp 数据传输(结合使用可减少延迟) tcp_nodelay on; #优化 tcp 数据传输(结合使用可减少延迟) keepalive_timeout 65; #设置客户端连接保持时间(单位:秒),减少 tcp 握手开销 types_hash_max_size 2048; #定义 mime 类型哈希表的大小,避免哈希冲突 include /etc/nginx/mime.types; default_type application/octet-stream; # load modular configuration files from the /etc/nginx/conf.d directory. # see http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; #加载 /etc/nginx/conf.d/ 目录下的所有 .conf文件。通常用于组织多个虚拟主机或模块化配置 #作用:定义监听 80 端口的 http 服务器 server { listen 80 default_server; #监听 ipv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用) listen [::]:80 default_server; #监听 ipv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用) server_name _; # _ 表示通配符,匹配所有未指定的域名 root /usr/share/nginx/html; #设置网站根目录,静态文件(如 `index.html`)需放在此目录下 # load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # 加载默认服务器的额外配置文件(通常用于覆盖或扩展默认配置) #作用:定义根路径 `/` 的处理规则。当前为空,表示使用默认行为(返回 `root` 目录下的文件)。 #扩展建议:可在此添加代理、重定向或静态文件处理逻辑 location / { } # 定义 404 错误页面为 `/404.html`。`location = /40x.html` 表示精确匹配 `/40x.html` 路径(需确保文件存在) error_page 404 /404.html; location = /40x.html { } # 定义 5xx 错误页面为 `/50x.html`(如服务器内部错误、网关错误等)。 error_page 500 502 503 504 /50x.html; location = /50x.html { } } # 启用 https 服务(注释掉的部分需要取消注释并配置) #关键配置 #listen 443 ssl http2; 监听 443 端口并启用 ssl/tls 和 http/2。 #ssl_certificate 和 ssl_certificate_key指定 ssl 证书和私钥路径。 #ssl_ciphers: 定义加密套件(profile=system 表示使用系统默认配置)。 #ssl_prefer_server_ciphers on; 优先使用服务器端的加密套件 #ls 服务器配置(注释部分) # settings for a tls enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:ssl:1m; # ssl_session_timeout 10m; # ssl_ciphers profile=system; # ssl_prefer_server_ciphers on; # # # load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
部分详细参数
#安全相关 add_header x-frame-options sameorigin; # 只允许本站用 frame 来嵌套 add_header x-content-type-options nosniff; # 禁止嗅探文件类型 add_header x-xss-protection "1; mode=block"; # # xss 保护 add_header content-security-policy "script-src * 'unsafe-inline' 'unsafe-eval'"; add_header referrer-policy 'origin'; add_header strict-transport-security "max-age=63072000; includesubdomains; preload"; add_header x-download-options noopen; add_header x-permitted-cross-domain-policies none; server_tokens off; access_log off; proxy_http_version 1.1; proxy_set_header connection ""; proxy_connect_timeout 6000; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 6000; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 6000; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 2048k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 client_max_body_size 2048m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 server_names_hash_bucket_size 128; #服务器名字的hash表大小 proxy_intercept_errors on; client_header_buffer_size 512k; #解决请求头大小get请求太长 large_client_header_buffers 4 512k; #解决请求头大小get请求太长 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #不压缩临界值,大于1k的才压缩,一般不用改 gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json; gzip_disable "msie [1-6]\."; # 根据文件类型设置过期时间 location ~.*\.css$ { expires 1d; break; } location ~.*\.js$ { expires 1d; break; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { access_log off; expires 15d; #保存15天 break; } # curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -i #测试图片的max-age # 禁止文件缓存 #开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果。这是我们可以禁止浏览器缓存提高效率 location ~* \.(js|css|png|jpg|gif)$ { add_header cache-control no-store; }
到此这篇关于nginx负载均衡及详细配置的文章就介绍到这了,更多相关nginx负载均衡内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论