Nginx配置负载均衡

Nginx负载均衡配置

负载均衡,单从字面上的意思来理解就可以理解为 N 台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。那么负载均衡的前提就是要两台以上服务器才能实现。

Nginx 除了可以用作 web 服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx 可以用轮询、IP 哈希、URL 哈希等方式调度后端服务器,同时也能提供健康检查功能。

Nginx负载均衡图解

负载均衡是扩展应用程序并提高其性能和冗余的绝佳方法。Nginx 是一种流行的 Web 服务器软件,可以配置为简单但功能强大的负载均衡器,以提高服务器资源的可用性和效率。在负载 均衡配置中,nginx 充当在多个单独服务器上工作的分布式 Web 应用程序的单个入口点。

73_nginx负载均衡.png

Nginx负载均衡五种模式

轮询

这是默认的策略,把每个请求逐一分配到不同的 server,如果分配到的 server 不可用,则分配到下一个,直到可用,具体配置如下:

upstream haicoder.net { server 192.168.8.143; server 192.168.8.144; }

最少连接

把请求分配到连接数最少的 server,具体配置如下:

upstream haicoder.net { least_conn; server 192.168.8.143; server 192.168.8.144; }

权重

weight 默认值为 1,值越大则代表被访问的几率越大,如下配置,144 的访问数量是 143 的 2 倍,具体配置如下:

upstream haicoder.net { server 192.168.8.143 weight=1; server 192.168.8.144 weight=2; }

ip_hash

根据访问客户端 ip 的 hash 值分配,这样同一客户端的请求都会被分配到同一个 server 上,如果牵扯到 session 的问题,用这个是最好的选择,具体配置如下:

upstream haicoder.net { ip_hash; server 192.168.8.143; server 192.168.8.144; }

Nginx负载均衡配置参数详解

Nginx 负载均衡是通过 upstream 模块来实现的,内置实现了三种负载策略。

轮循

轮循大体配置如下:

http { # ... 省略其它配置 upstream haicoder { server 192.168.0.100:8080; server 192.168.0.101:8080; server example.com:8080; } server { listen 80; location / { proxy_pass http://haicoder; } } # ... 省略其它配置 }
  1. proxy_pass http://haicoder:表示将所有请求转发到 haicoder 服务器组中配置的某一台服务器上。

  2. upstream 模块:配置反向代理服务器组,Nginx 会根据配置,将请求分发给组里的某一台服务器。haicoder 是服务器组的名称。

  3. upstream 模块下的 server 指令:配置处理请求的服务器 IP 或域名,端口可选,不配置默认使用 80 端口。通过上面的配置,Nginx 默认将请求依次分配给 100,101,102 来处理,可以通过修改下面这些参数来改变默认的分配策略。

weight

weight 默认为 1,将请求平均分配给每台 server,具体配置如下:

upstream haicoder { server 192.168.0.100:8080 weight=2; # 2/6次 server 192.168.0.101:8080 weight=3; # 3/6次 server 192.168.0.102:8080 weight=1; # 1/6次 }

上例配置,表示 6 次请求中,100 分配 2 次,101 分配 3 次,102 分配 1 次。

max_fails

默认为 1。某台 Server 允许请求失败的次数,超过最大次数后,在 fail_timeout 时间内,新的请求将不会分配给这台机器。如果设置为 0,Nginx 会将这台 Server 置为永久无效状态,然后将请求发给定义了 proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream 指令来处理这次错误的请求。

fail_timeout

默认为 10 秒。某台 Server 达到 max_fails 次失败请求后,在 fail_timeout 期间内,nginx 会认为这台 Server 暂时不可用,不会将请求分配给它,大体配置如下:

upstream haicoder { server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15; server 192.168.0.101:8080 weight=3; server 192.168.0.102:8080 weight=1; }

192.168.0.100 这台机器,如果有 3 次请求失败,nginx 在 15 秒内,不会将新的请求分配给它。

backup

备份机,所有服务器挂了之后才会生效,大体配置如下:

upstream haicoder { server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15; server 192.168.0.101:8080 weight=3; server 192.168.0.102:8080 backup; }

在 100 和 101 都挂了之前,102 为不可用状态,不会将请求分配给它。只有当 100 和 101 都挂了,102 才会被启用。

down

标识某一台 server 不可用。可能能通过某些参数动态的激活它吧,要不真没啥用,具体配置如下:

upstream haicoder { server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15; server 192.168.0.101:8080 down; server 192.168.0.102:8080 backup;}

表示 101 这台 Server 为无效状态,不会将请求分配给它。

max_conns

限制分配给某台 Server 处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为 0,表示不限制。注意:1.5.9 之后的版本才有这个配置,大体配置如下:

upstream haicoder { server 192.168.0.100:8080 max_conns=1000;}

表示最多给 100 这台 Server 分配 1000 个请求,如果这台 Server 正在处理 1000 个请求,nginx 将不会分配新的请求给到它。假如有一个请求处理完了,还剩下 999 个请求在处理,这时 nginx 也会将新的请求分配给它。

resolve

将 server 指令配置的域名,指定域名解析服务器。需要在 http 模块下配置 resolver 指令,指定域名解析服务,大体配置如下:

http { resolver 10.0.0.1; upstream u { zone ...; ... server example.com resolve; }}

表示 example.com 域名,由 10.0.0.1 服务器来负责解析。

案例

我们首先,使用 vim 修改 nginx 的配置,具体命令如下:

vim /etc/nginx/conf.d/default.conf

此时,如下图所示:

74_nginx负载均衡.png

现在,我们修改配置如下:

upstream haicodernet { server 192.168.8.143; server 192.168.8.144;}server { listen 80; server_name haicodernet; location / { proxy_pass http://haicodernet; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

配置修改成功后,如下图所示:

75_nginx负载均衡.png

修改成功后,我们直接重新加载配置即可。

Nginx负载均衡配置总结

Nginx 除了可以用作 web 服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx 可以用轮询、IP 哈希、URL 哈希等方式调度后端服务器,同时也能提供健康检查功能。