nginx负载均衡及详细配置

打印 上一主题 下一主题

主题 1931|帖子 1931|积分 5793

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、 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服务器会被以为停机的时间长度,默以为10sbackup标记该服务器为备用服务器。当主服务器停止时,哀求会被发送到它这里down标记服务器永久停机了,用于明白清除故障或维护中的服务器,避免无效哀求注意:

  • 在轮询中,假如服务器down掉了,会主动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。
  1. upstream backend {
  2.     server backend1.example.com fail_timeout=60s max_fails=2;
  3.     server backend2.example.com fail_timeout=60s max_fails=2;
  4. }
  5. max_fails=2; 表示如果在 fail_timeout 时间段内,Nginx 向某一个上游服务器发起请求失败次数达到 2 次,则认为该服务器不可用。
  6. fail_timeout=60s; 有两个作用:首先,它定义了上述 max_fails 中提到的时间窗口长度,在这个例子中是 60 秒;其次,一旦某个上游服务器被认为不可用,Nginx 将会在接下来的 60 秒内不再向这台服务器转发任何请求。
  7. 这种配置有助于提高服务的可靠性,通过自动禁用那些看起来已经失效的服务器,并在一段时间后重新尝试连接它们,从而避免将客户端请求发送到不健康的服务器上。
  8. 在这个配置中,如果 backend1.example.com 在 60 秒内连续失败 2 次请求,Nginx 会暂时停止向它转发请求 60 秒,并仅将请求转发给 backend2.example.com。同样地,对于 backend2.example.com 也会应用相同的规则。这样的设置可以确保即使有一个服务器出现问题,用户仍然能够被导向到另一个可用的服务器。
复制代码
2.权重:通过 weight 参数为服务器分配权重(weight=1 为默认值),权重越高分配的哀求越多


  • 权重越高分配到必要处理的哀求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比力适合服务器的硬件配置差别比力大的情况;比方: 捏造机和物理界混合部署
注意:
  1. upstream backend {
  2.     server 192.168.1.1:80 weight=10;  # 高性能服务器,处理更多请求
  3.     server 192.168.1.2:80 weight=5;   # 低性能服务器,处理较少请求
  4. }
复制代码
3.IP哈希:根据客户端 IP 地址举行哈希计算,确保同一 IP 的哀求始终转发到同一台服务器
注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
  • ip_hash不能与backup同时使用
  • 此策略适合有状态服务,比如session
  • 当有服务器必要剔除,必须手动down掉
  • 必要会话保持的场景(如电商购物车、用户登录状态),但服务器故障时可能导致会话丢失
  1. upstream backend {
  2. ip_hash; # 启用 IP 哈希策略
  3. server 192.168.1.1:80;
  4. server 192.168.1.2:80;
  5. }
  6. ------------------------------------------------------
  7. upstream fileserver {
  8.                 ip_hash;
  9.         server 192.19.31.91:32100 fail_timeout=60s max_fails=2;
  10.         server 192.19.31.92:32100 fail_timeout=60s max_fails=2;
  11.                 keepalive 100;
  12.     }
复制代码
4.最少毗连数:将哀求转发给当前毗连数最少的服务器,适应流量波动
注意:

  • 此负载均衡策略适合哀求处理时间长短不一造成服务器过载的情况。
  1. upstream backend {
  2.     least_conn;  # 启用最少连接策略
  3.     server 192.168.1.1:80;
  4.     server 192.168.1.2:80;
  5. }
复制代码
加权最少毗连数:在最少毗连的基础上,通过 weight 参数为服务器设置处理能力权重,均衡更精准

  • 公式:(当前毗连数) / (weight),值越小的服务器优先分配哀求。
注意:

  • 适用于服务器性能有差异,且需动态均衡毗连数的场景(如混合云部署)
  1. upstream backend {
  2.     least_conn;
  3.     server 192.168.1.1:80 weight=10;  # 高配服务器,权重更高,允许处理更多连接
  4.     server 192.168.1.2:80 weight=5;   # 低配服务器,权重较低,保护其负载
  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 官方模块,编译时需启用)
  1. upstream backend {
  2.     hash $request_uri consistent;  # 对 URL 哈希,`consistent` 启用一致性哈希(减少服务器变动时的哈希重分布)
  3.     server 192.168.1.1:80;
  4.     server 192.168.1.2:80;
  5. }
复制代码
1.3 策略对比

通过公道选择负载均衡策略,Nginx 可高效分配流量,提升后端服务的可用性和性能
策略焦点逻辑优势场景缺点轮询顺序分配服务器性能同等不思量负载状态加权轮询按权重分配服务器性能不同静态配置,不动态调解最少毗连毗连数最少优先长毗连或哀求耗时不均未思量服务器性能差异加权最少毗连毗连数与权重结合性能差异化且需动态均衡配置较复杂IP 哈希客户端 IP 绑定会话保持服务器故障时会话可能丢失URL 哈希URL 绑定服务器资源缓存加速需额外模块,仅适用特定场景二、 nginx配置

2.1 基本命令
  1. nginx -t             检查配置文件是否有语法错误
  2. nginx -s reload       热加载,重新加载配置文件
  3. nginx -s stop         快速关闭
  4. nginx -s quit         等待工作进程处理完成后关闭
复制代码
若在Linux系统可以配置nginx.service文件
  1. [Unit]
  2. Description=Nginx Web Server
  3. After=network.target
  4. [Service]
  5. Type=forking
  6. ExecStart=/usr/local/nginx/sbin/nginx  -c /usr/local/nginx/conf/nginx.conf    #修改nginx目录
  7. ExecReload=/usr/local/nginx/sbin/nginx -s reload
  8. ExecStop=/usr/local/nginx/sbin/nginx -s stop
  9. KillMode=process
  10. Restart=always
  11. RestartSec=5s
  12. StartLimitInterval=0
  13. [Install]
  14. WantedBy=multi-user.target
复制代码
  1. 启动安装(开机自启动)nginx
  2. sudo systemctl daemon-reload   //重新加载systemd服务
  3. sudo systemctl enable nginx.service
  4. sudo systemctl start nginx.service
  5.    
  6. systemctl status nginx.service
  7. systemctl restart nginx.service
复制代码
2.2 nginx默认配置详解
  1. user nginx;   # Nginx 工作进程运行的用户(默认:nginx,可改为其他用户)
  2. worker_processes auto;   # 工作进程数,通常设为 CPU 核心数(默认:1,建议设为 auto 或实际核心数)
  3. error_log /var/log/nginx/error.log;    #错误日志
  4. pid /run/nginx.pid;
  5. # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
  6. include /usr/share/nginx/modules/*.conf;
  7. events {
  8.     worker_connections 1024;    # 定义每个工作进程的最大连接数。此处设置为 1024,表示每个进程最多处理 1024 个并发连接
  9. }
  10. http {
  11.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  12.                       '$status $body_bytes_sent "$http_referer" '
  13.                       '"$http_user_agent" "$http_x_forwarded_for"';
  14. #定义日志格式 main,用于记录访问日志
  15. #$remote_addr:客户端 IP 地址
  16. # $time_local:请求时间。
  17. #$request`:客户端请求的原始行(如 `GET /index.html HTTP/1.1)
  18. #$status:响应状态码(如 200、404)
  19. #$body_bytes_sent:发送给客户端的字节数(不包括响应头)
  20. #$http_referer:请求来源页面
  21. #$http_user_agent:客户端浏览器标识
  22. #$http_x_forwarded_for:代理链中的客户端 IP(用于反向代理场景)
  23.     access_log  /var/log/nginx/access.log  main;
  24.     sendfile            on;    #启用高效文件传输模式(直接从磁盘发送文件到网络)
  25.     tcp_nopush          on;    #优化 TCP 数据传输(结合使用可减少延迟)
  26.     tcp_nodelay         on;    #优化 TCP 数据传输(结合使用可减少延迟)
  27.     keepalive_timeout   65;    #设置客户端连接保持时间(单位:秒),减少 TCP 握手开销
  28.     types_hash_max_size 2048;  #定义 MIME 类型哈希表的大小,避免哈希冲突
  29.     include             /etc/nginx/mime.types;
  30.     default_type        application/octet-stream;
  31.     # Load modular configuration files from the /etc/nginx/conf.d directory.
  32.     # See http://nginx.org/en/docs/ngx_core_module.html#include
  33.     # for more information.
  34.     include /etc/nginx/conf.d/*.conf;   #加载 /etc/nginx/conf.d/ 目录下的所有 .conf文件。通常用于组织多个虚拟主机或模块化配置
  35. #作用:定义监听 80 端口的 HTTP 服务器
  36.     server {
  37.         listen       80 default_server;   #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
  38.         listen       [::]:80 default_server;  #监听 IPv4 的 80 端口,并作为默认服务器(未匹配其他 `server_name` 时使用)
  39.         server_name  _;   # _ 表示通配符,匹配所有未指定的域名
  40.         root         /usr/share/nginx/html;   #设置网站根目录,静态文件(如 `index.html`)需放在此目录下
  41.         
  42.      
  43.         # Load configuration files for the default server block.
  44.         include /etc/nginx/default.d/*.conf;   #  加载默认服务器的额外配置文件(通常用于覆盖或扩展默认配置)
  45. #作用:定义根路径 `/` 的处理规则。当前为空,表示使用默认行为(返回 `root` 目录下的文件)。
  46. #扩展建议:可在此添加代理、重定向或静态文件处理逻辑
  47.         location / {
  48.         }
  49. #  定义 404 错误页面为 `/404.html`。`location = /40x.html` 表示精确匹配 `/40x.html` 路径(需确保文件存在)
  50.         error_page 404 /404.html;
  51.             location = /40x.html {
  52.         }
  53. #  定义 5xx 错误页面为 `/50x.html`(如服务器内部错误、网关错误等)。
  54.         error_page 500 502 503 504 /50x.html;
  55.             location = /50x.html {
  56.         }
  57.     }
  58. # 启用 HTTPS 服务(注释掉的部分需要取消注释并配置)
  59. #关键配置
  60. #listen 443 ssl http2;  监听 443 端口并启用 SSL/TLS 和 HTTP/2。
  61. #ssl_certificate 和 ssl_certificate_key指定 SSL 证书和私钥路径。
  62. #ssl_ciphers: 定义加密套件(PROFILE=SYSTEM 表示使用系统默认配置)。
  63. #ssl_prefer_server_ciphers on;   优先使用服务器端的加密套件
  64. #LS 服务器配置(注释部分)
  65. # Settings for a TLS enabled server.
  66. #
  67. #    server {
  68. #        listen       443 ssl http2 default_server;
  69. #        listen       [::]:443 ssl http2 default_server;
  70. #        server_name  _;
  71. #        root         /usr/share/nginx/html;
  72. #
  73. #        ssl_certificate "/etc/pki/nginx/server.crt";
  74. #        ssl_certificate_key "/etc/pki/nginx/private/server.key";
  75. #        ssl_session_cache shared:SSL:1m;
  76. #        ssl_session_timeout  10m;
  77. #        ssl_ciphers PROFILE=SYSTEM;
  78. #        ssl_prefer_server_ciphers on;
  79. #
  80. #        # Load configuration files for the default server block.
  81. #        include /etc/nginx/default.d/*.conf;
  82. #
  83. #        location / {
  84. #        }
  85. #
  86. #        error_page 404 /404.html;
  87. #            location = /40x.html {
  88. #        }
  89. #
  90. #        error_page 500 502 503 504 /50x.html;
  91. #            location = /50x.html {
  92. #        }
  93. #    }
  94. }
复制代码
部分详细参数
https://www.cnblogs.com/hanease/p/15890509.html  参考
  1. #安全相关
  2.     add_header X-Frame-Options SAMEORIGIN; # 只允许本站用 frame 来嵌套
  3.     add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
  4.     add_header X-XSS-Protection "1; mode=block"; # # XSS 保护
  5.     add_header Content-Security-Policy "script-src * 'unsafe-inline' 'unsafe-eval'";
  6.     add_header Referrer-Policy 'origin';
  7.     add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
  8.         add_header X-Download-Options noopen;
  9.         add_header X-Permitted-Cross-Domain-Policies none;
  10.        
  11.     server_tokens off;
  12.    
  13.     access_log off;
  14.    
  15.    
  16.    
  17.     proxy_http_version 1.1;
  18.     proxy_set_header Connection "";
  19.    
  20.     proxy_connect_timeout 6000;                     #nginx跟后端服务器连接超时时间(代理连接超时)
  21.     proxy_send_timeout 6000;                     #后端服务器数据回传时间(代理发送超时)
  22.     proxy_read_timeout 6000;                     #连接成功后,后端服务器响应时间(代理接收超时)  
  23.     proxy_buffer_size 1024k;                      #设置代理服务器(nginx)保存用户头信息的缓冲区大小
  24.     proxy_buffers 16 1024k;                       #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
  25.     proxy_busy_buffers_size 2048k;                   #高负荷下缓冲大小(proxy_buffers*2)
  26.     proxy_temp_file_write_size 2048k;             #设定缓存文件夹大小,大于这个值,将从upstream服务器传
  27.    
  28.     client_max_body_size 2048m; #允许客户端请求的最大单文件字节数
  29.     client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
  30.     server_names_hash_bucket_size 128; #服务器名字的hash表大小
  31.     proxy_intercept_errors on;
  32.     client_header_buffer_size 512k; #解决请求头大小get请求太长
  33.     large_client_header_buffers 4 512k; #解决请求头大小get请求太长
  34.     gzip on; #开启gzip压缩输出
  35.     gzip_min_length 1k; #不压缩临界值,大于1K的才压缩,一般不用改
  36.     gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
  37.     gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
  38.     gzip_comp_level 2; #压缩等级
  39.     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;
  40.     gzip_disable "MSIE [1-6]\.";
  41.    
  42. # 根据文件类型设置过期时间
  43.     location ~.*\.css$ {
  44.     expires 1d;
  45.     break;
  46. }
  47. location ~.*\.js$ {
  48.     expires 1d;
  49.     break;
  50. }
  51. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  52.     access_log off;
  53.     expires 15d;    #保存15天
  54.     break;
  55. }
  56. # curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I #测试图片的max-age
  57. 复制代码复制代码
  58. # 禁止文件缓存
  59. #开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果。这是我们可以禁止浏览器缓存提高效率
  60. location ~* \.(js|css|png|jpg|gif)$ {
  61.     add_header Cache-Control no-store;
  62. }复制代码
  63.    
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表