nginx负载均衡及详细配置方法

2025-05-05 18:50

本文主要是介绍nginx负载均衡及详细配置方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《nginx负载均衡及详细配置方法》Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中,:本文主要介绍nginx负载均衡及详细配置,需要的朋友可以参考下...

一、 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 bfxemwwCackend {
    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 也会应用相同的规则。这样的设置可以确保即使有一个服务器出现问题,用户China编程仍然能够被导向到另一个可用的服务器。

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
  • 当有服务器需要剔除,必须手动dohttp://www.chinasem.cnwn掉
  • 需要会话保持的场景(如电商购物车、用户登录状态),但服务器故障时可能导致会话丢失
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 -fxemwwCt             检查配置文件是否有语法错误
nginx -s reload       热加载,编程China编程重新加载配置文件
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 {
#        }
#    }
}

部分详细参数

https://www.jb51.net/server/340873teh.htm参考

#安全相关
    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负载均衡内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于nginx负载均衡及详细配置方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154483

相关文章

史上最全nginx详细参数配置

《史上最全nginx详细参数配置》Nginx是一个轻量级高性能的HTTP和反向代理服务器,同时也是一个通用代理服务器(TCP/UDP/IMAP/POP3/SMTP),最初由俄罗斯人IgorSyso... 目录基本命令默认配置搭建站点根据文件类型设置过期时间禁止文件缓存防盗链静态文件压缩指定定错误页面跨域问题

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发