1. 基于反向代理的功能,Nginx 作为负载均衡主要有以下几点理由:
- 高并发连接。
- 采用 epoll nio 的形式。
- 内存消耗少。
- 使用了大量自带的数据结构(自己设计的)。
- 数据拷贝采用类零拷贝的形式降低内存的使用。
- 配置文件非常简单。
- 成本低廉。
- 开源免费。
- 支持 Rewrite 重写规则。
- 内置的健康检查功能。
- 节省带宽。
- 稳定性高。
2. 正向代理和反向代理
正向代理
- 正向代理类似一个跳板机,代理访问外部资源。
反向代理
- 实际运行方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外表现为一个服务器。
反向代理的作用
- 保证内网的安全,可以使用反向代理提供 WAF 功能,阻止 web 攻击。大型网站,通常将反向代理作为公网访问地址,web 服务器是内网。
- 负载均衡,通过反向代理服务器来优化网站的负载。
3. 负载均衡原理
负载均衡,单从字面的意思来理解就可以解释 N 台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。那么负载均衡的前提就是要 2 台以上服务器才能实现。
1. 4 种配置方案
-
轮询。
- 轮询即 Round Robin,根据 Nginx 配置文件中的顺序,依次把客户端的 Web 请求分发到不同的后端服务器上。
-
最少连接 least_conn。
- Web 请求会被转发到连接数最少的服务器上。
-
IP 地址哈希 ip_hash。
- 前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话 Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。
-
基于权重 weight。
- 基于权重的负载均衡即 Weighted Load Balancing,这种方式下,我们可以配置 Nginx 把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
4. 负载均衡配置
1. 配置基于 Round Robin 轮询的负载均衡
- 缺省配置就是轮询策略;
- nginx 负载均衡支持 http 和 https 协议,只需要修改
proxy_pass
后协议即可; - nginx 支持 FastCGl,uwsgi,SCcl,memcached 的负载均衡,只需将
proxy_pass
改为fastcgi-pass
,uwsgi_pass
,scgi_pass
,memcached_pass
即可。 - 此策略适合服务器配置相当,无状态且短平快的服务使用。
user www-data;
worker_processes auto;
pid /run/nginx.pid
events {
use epoll;
worker_connections 65535;
}
http {
upstream zp.com {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
server {
listen 80;
server_name zp.com;
location / {
proxy_pass http://zp.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
2. 配置基于 ip_hash 的负载均衡
- ip 哈希负载均衡使用 ip_hash 指令定义;
- nginx 使用请求客户端的 ip 地址进行哈希计算,确保使用同一个服务器的请求;
- 此策略适合有状态的服务,比如 session。
user www-data;
worker_processes auto;
pid /run/nginx.pid
events {
use epoll;
worker_connections 65535;
}
http {
upstream zp.com {
ip_hash;
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
server {
listen 80;
server_name zp.com;
location / {
proxy_pass http://zp.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
3. 配置基于 least_conn 的负载均衡
- 最少链接负载均衡 least_conn 指令定义;
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
user www-data;
worker_processes auto;
pid /run/nginx.pid
events {
use epoll;
worker_connections 65535;
}
http {
upstream zp.com {
least_conn;
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}
server {
listen 80;
server_name zp.com;
location / {
proxy_pass http://zp.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
4. 配置基于权重的负载均衡
- 权重负载均衡需要使用 weight 指令定义;
- 权重越高分配到需要处理的请求越多;
- 此策略可以与最少链接负载和 ip 哈希策略结合使用;
- 此策略比较适合服务器的硬件配置差别比较大的情况。
user www-data;
worker_processes auto;
pid /run/nginx.pid
events {
use epoll;
worker_connections 65535;
}
http {
upstream zp.com {
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882 weight=2;
server 127.0.0.1:8883 weight=1;
}
server {
listen 80;
server_name zp.com;
location / {
proxy_pass http://zp.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}