首页 > 系统相关 >提升网站响应速度与可靠性:Nginx负载均衡最佳实践 转载

提升网站响应速度与可靠性:Nginx负载均衡最佳实践 转载

时间:2024-10-10 14:45:41浏览次数:7  
标签:负载 http server 响应速度 Nginx proxy upstream 服务器 上游

负载均衡配置

作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。

1.1 upstream 块

语法: upstream name {...}
配置块: http

  • upstream块定义了一个上游服务器的集群,便于反向代理中的 proxy_pass 使用。例如

    upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    }

    server {
    location / {
    proxy_pass http://backend;
    }

    }

1.2 server

语法: server name [parameters];
配置块: upstream

  • server 配置项 指定了一台上游服务器的名字,这个名字可以是域名IP地址端口UNIX句柄等,在其后还可以跟下列参数。

    • weight=number: 设置向这台上游服务器转发的权重,默认为1。

    • max_fails=number: 该选项与 fail_timeout 配合使用,指在 fail_timeout 时间段内,如果向当前的上游服务器转发失败次数超过 number,则认为在当前的 fail_timeout 时间段内这台上游服务器不可用。max fails 默认为1,如果设置为 0,则表示不检查失败次数。

    • fail_timeout=time: fail_timeout 表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。fail_timeout 默认为10秒。

    • down: 表示所在的上游服务器永久下线,只在使用ip_hash 配置项时才有用

    • backup: 在使用 ip_hash 配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。

upstream backend {
server backendl.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}

1.3 ip_hash

语法: ip_hash;
配置块: upstream

  • 在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源的浪费,也会难以有效地管理缓存信息。ip_hash 就是用以解决上述问题的,它首先根据客户端的 IP 地址计算出一个 key,将 key 按照 upstream 集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。

  • ip_hash与weight(权重)配置不可同时使用。如果 upstream 集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要 down 参数标识,确保转发策略的一贯性。例如:

    upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
    }

1.4 记录日志时支持的变量

  • 如果需要将负载均衡时的一些信息记录到 access_log 日志中,那么在定义日志格式时可以使用负载均衡功能提供的变量。

变量名意义
$upstream_ addr 处理请求的上游服务器地址
$upstream_cache_status 表示是否命中缓存,取值范围: MISSEXPIREDUPDATINGSTALEHIT
$upstream_status 上游服务器返回的响应中的 HTTP 响应码
$upstream_response_time 上游服务器的响应时间,精度到毫秒
$upstream_http_$HEADER HTTP的头部,如upstream_http_host
log_format timing '$remote_addr - $remote_user [$time_local] $request ' 'upstream_response_time $upstream_response_time' 'msec $msec request_time $request time';

log_format up_head '$remote_addr - $remote_user [$time_local] $request ' 'upstream_http_content_ type $upstream_http_content_type';

2.反向代理基本配置

2.1 proxy_pass

语法: proxy_pass URL;
配置块: location、if

  • 此配置项将当前请求反向代理到 URL 参数指定的服务器上,URL 可以是主机名或 IP 地址加端口的形式,例如:

    proxy_pass http://localhost:8000/uri/;

    也可以是UNIX句柄:

    proxy_pass http://unix:/path/to/backend.socket:/uri/;

    还可以如上节负载均衡中所示,直接使用 upstream 块,例如:

    upstream backend {
    ...
    }
    server {
    location / {
    proxy_pass http://backend;
    }
    }

    用户可以把HTTP 转换成更安全的 HTTPS,例如:

    proxy_pass https://192.168.0.1;

    默认情况下反向代理是不会转发请求中的 Host 头部的。如果需要转发,那么必须加上配置:

    proxy_set header Host $host;

2.2 proxy method

语法: proxy_method method;

配置块: http、server、location

此配置项表示转发时的协议方法名。例如设置为:

proxy_method POST;

那么客户端发来的 GET 请求在转发时方法名也会改为 POST。

2.3 proxy_hide_header

语法: proxy_hide_header the_header;
配置块: http、server、location

  • Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP 头部字段: DateServerX-PadX-Accel-*。使用proxy_hide_header 后可以任意地指定哪些HTTP头部字段不能被转发。例如:

proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftofficeWebServer;

2.4 proxy_pass_header

语法: proxy_pass_header the_header;

配置块: http、server、location

  • 与proxy_pass_header功能相反,proxy_pass header 会将原来禁止转发的header设置为允许转发。例如:

    proxy_pass_header X-Accel-Redirect;

2.5 proxy_pass_request_body

语法: proxy_pass_request_body on|off;
默认: proxy_pass_request_body on;
配置块: http、server、location

  • 作用为确定是否向上游服务器发送 HTTP 包体部分

2.6 proxy_pass_request_headers

语法: proxy_pass_request_headers on|off;
默认: proxy_pass_request_headers on;
配置块:http、server、location

  • 作用为确定是否转发 HTTP 头部。

2.7 proxy_redirect

语法: proxy_redirect [ default | off | redirect replacement ];
默认: proxy_redirect default;
配置块: http、server、location

  • 当上游服务器返回的响应是重定向或刷新请求(如HTTP 应码是 301 或者 302)时,proxy_redirect 可以重设 HTTP 头部的 locationrefresh字段。例如,如果上游服务器发出的响应是 302重定向请求,location 字段的URI是 http://1ocalhost:8000/two/some/uri/,那么在下面的配置情况下,实际转发给客户端的location是 http://frontend/one/some/uri/

proxy_redirect http://localhost:8000/two/ http://frontend/one/;
  • 这里还可以使用 ngx-http-core-module 提供的变量来设置新的location字段。例如:

    proxy_redirect http://localhost:8000/  http://$host:$server_port/;
  • 也可以省略 replacement 参数中的主机名部分,这时会用虚拟主机名称来填充。例如:

    proxy_redirect http://localhost:8000/two/ /one/;

    使用 off 参数时,将使 location 或者 refresh 字段维持不变。例如:

    proxy_redirect off;
  • 使用默认的 default参数时,会按照 proxy_pass 配置项和所属的 location 配置项重组发往客户端的 location 头部。例如,下面两种配置效果是一样的:

location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect default;
}

location /one/ {
proxy_pass http://upstream:port/two/;
proxy_redirect http://upstream:port/two/ /one/;
}

2.8 proxy_next_upstream

语法: proxy_next [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_404 | off ];
默认: proxy_next_upstream error timeout;
配置块: http、server、location

  • 此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。上游服务器一旦开始发送应答,Nginx 反向代理服务器会立刻把应答包转发给客户端。因此,一旦 Nginx 开始向客户端发送响应包,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求

    • error: 当向上游服务器发起连接、发送请求、读取响应时出错

    • timeout: 发送请求或读取响应时发生超时。

    • invalid_header: 上游服务器发送的响应是不合法的。

    • http_500:上游服务器返回的HTTP 响应码是500

    • http_502:上游服务器返回的HTTP响应码是502

    • http 503:上游服务器返回的HTTP 响应码是503。

    • http _504:上游服务器返回的HTTP 响应码是504。

    • http_404:上游服务器返回的HTTP 响应码是404。

    • off:关闭proxy_next_upstream功能一出错就选择另一台上游服务器再次转发

Nginx的反向代理模块还提供了很多种配置,如设置连接的超时时间、临时文件如何存储,以及最重要的如何缓存上游服务器响应等功能。

链接:https://www.cnblogs.com/ccblblog/p/17956729

标签:负载,http,server,响应速度,Nginx,proxy,upstream,服务器,上游
From: https://www.cnblogs.com/testzcy/p/18456343

相关文章

  • Unbuntu nginx 安装
    1.下载源码下载页面:https://nginx.org/en/download.html下载地址:https://nginx.org/download/nginx-1.27.2.tar.gzcurl-Ohttps://nginx.org/download/nginx-1.27.2.tar.gz2.依赖配置sudoaptinstallgccmakelibpcre3-devzlib1g-devopenssllibssl-dev3.编译解压......
  • Django使用uwsgi和nginx进行手动部署
    在Django项目中使用uWSGI和Nginx进行部署是一种常见的生产环境配置。以下是一个详细的步骤指南,帮助你完成这个过程。前提条件有一个已经开发好的Django项目。服务器已安装Python、pip、Nginx和uWSGI。有一个有效的域名(可选,但推荐)。步骤一:准备Django项目收集静态文件:在项......
  • 响应速度相关知识
    在讨论Android性能问题的时候,卡顿、响应速度、ANR这三个性能相关的知识点通常会放到一起来讲,因为引起卡顿、响应慢、ANR的原因类似,只不过根据重要程度,被人为分成了卡顿、响应慢、ANR三种,所以我们可以定义广义上的卡顿,包含了卡顿、响应慢和ANR三种,所以如果用户反馈说手机......
  • 快速编译安装nginx服务
    文章目录1软件包下载2安装编译依赖环境3编译安装Nginx4将Nginx做成服务5启动Nginx服务6访问Nginx页面7其他配置1、软件包下载nginx官网下载地址:https://nginx.org/en/download.html2、安装编译依赖环境1、安装编译环境yum -y install gcc gcc-c++2......
  • nginx server_name配置文件覆盖不生效
    目录nginxserver配置文件覆盖不生效如果不加server_name会发生什么除了不加server_name还有可能有其他情况导致配置失效怎么1个nginx配置两个域名nginxserver配置文件覆盖不生效背景:要在1个nginx上加两个域名解析,dns解析已经做了,按正常来说,当访问不同的域名的时候,可以分别跳......
  • 弃用 Nginx,他们选择这款工具!
    Cloudflare公司弃用nginx,转用自研的新一代反向代理服务Pingora,并号称比nginx更快、更高效、更安全,下面通过Cloudfare官方网站的一篇文章来了解下Pingora比Nginx强在哪里。简介今天,我们很高兴有机会在此介绍Pingora,这是我们使用Rust在内部构建的新HTTP代理,它每天处理超过......
  • Ribbon负载均衡原理、负载均衡策略以及懒加载
    目录负载均衡流程问题分析执行流程底层源码分析进入LoadBalancerInterceptor进入ClientHttpRequestInterceptor重新回到LoadBalancerInterceptor负载均衡策略通过定义IRule实现可以修改负载均衡规则代码方式配置文件方式饥饿加载总结负载均衡流程问题分析or......
  • LVS负载均衡群集
    目录一、群集概述二、群集的分类1.负载均衡群集(LoadBalanceCluster)2.高可用群集(HighAvailabilityCluster)3.高性能运算群集(HighPerformanceComputerCluster)三、负载均衡的结构四、LVS负载均衡群集工作模式1.NAT地址转换2.TUNIP隧道3.DR直接路由五、LVS虚......
  • nginx 配置文件
    server{listen80default_server;server_namewww.example.com;location/{root/usr/share/nginx/html;#alias/usr/share/nginx/html;indexindex.htmlindex.htm;}} root和alisa的区别root指令定义了处理位于根路径(即"/")下的请求时,服务器应该从哪个目......
  • 在安装nginx时,./configure的作用
    configure命令做了大量的“幕后”工作,包括检测操作系统内核和已经安装的软件,参数的解析,中间目录的生成以及根据各种参数生成一些C源码文件、Makefile文件等。configure脚本功能:检查编译环境是否满足编译需求,并定义当前程序编译时启用哪个特性或功能,以及安装路径的定义等等; (1)GC......