nginx反向代理及负载均衡使用说明
文章目录
集群介绍
简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群种的每台计算机)都是运行各自服务的独立服务器,这些服务器之间可以彼此通信,协同向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理,当用户客户机请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。
用一句话描述集群:
即一堆服务器合作做同一件事!
负载均衡架构图
为什么要使用集群
1.高性能计算
2.价格有效性
3.可伸缩性
4.高可用性
集群概念的特点说明:高可用,高性能(核心特点)
集群种类
(1) 负载均衡集群,简称LBC或者LB
—解决调度问题
- 硬件设备
F5 : 硬件设备
A10 : 硬件设备
- 软件实现
Nginx : 工作在7层,1.9版本之后也支持4层负载
LVS : 工作在4层
Haproxy(大公司常用) : 兼容4层负载和7层负载,有图形化界面
(2) 高可用性集群,简称HAC或者HA
—解决单点故障问题(keepalived)
(3) 高性能计算集群,简称HPC或者HP
—不常用:主要处理复杂的运算,算法,建模,科研常用
(4) 网络计算 —不常用:云计算有关
负载均衡概念说明
-
对用户的访问请求进行
调度管理
-
对用的的访问请求进行
压力分担
-
调度管理示例
-
压力分担示例
压力测试
- 软件apache,ab(Apache Bench)功能
拿到服务器先进行压力测试,查看最大值是多少!!!按最大值进行搭建web服务器数量(要有一定冗余量,做到一半的机器坏了,另一半能继续支撑没有异常,
防止雪崩的情况
)
- 解决负载均衡单点故障
再加一台备负载均衡服务器,主和备之间用一根心跳线相连,主的挂掉以后,备的立马顶替,实现高可用服务器集群。
及解决了负载的压力分担又解决了单点故障的问题!
- 压力测试软件ab(Apache Bench)的原理:
ab命令会创建多个并发访问线程,
模拟多个访问者同时对某一URL地址进行访问。
它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
反响代理概念说明
接收用户请求替代用户想后端访问。
反向代理图解
第一步: 客户端发送请求到反向代理负载均衡服务器
第二步: 反向代理服务器接收到请求后,代替客户端向后端web服务器发起访问请求(这里对于web服务器来说反向代理服务器就是客户端!对于客户端来说反向代理是服务端!)
第三步: web服务器把响应的请求发送给反向代理服务器
第四步: 反向代理接收到请求后,把请求发送给客户端
数据转发图解
主要运用在LVS上
第一步 : 客户端发送请求到数据转发负载均衡服务器
第二步 : 负载均衡服务器不做处理,直接转发给后方节点服务器
第三步 : web服务器接收到请求后,返回给负载均衡服务器响应请求
第四步 : 负载均衡服务器接收到响应请求后,不做处理,直接转发给客户端!还有一种情况是,在web服务器返回数据的时候,不经过负载均衡服务器,直接通过网络找到客户端返回响应请求!
实践环境准备
- 安装依赖包(pcre-devel openssl-devel)
yum install -y pcre pcre-devel openssl openssl-devel
- 下载Nginx软件
使用命令下载:
wget -q http://nginx.org/download/nginx-1.14.0.tar.gz
说明:软件很小,用心查看一下!
- 解压软件
tar xf nginx-1.14.0.tar.gz
创建一个管理nginx进程的用户:
useradd -s /sbin/nologin -M nginx
id nginx
- 进入目录
cd nginx-1.14.0
- 配置安装
./configure --prefix=/application/nginx-1.14.0 --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
- 编译安装
make && make install
- 创建软链接
ln -s /application/nginx-1.14.0 /application/nginx
ln -s -f /application/nginx-1.16.0 /application/nginx
- 启动软件全路径
/application/nginx/sbin/nginx
- 加入环境变量
vim /etc/bashrc
export NGINX_HOME=/application/nginx
export PATH=$PATH:$NGINX_HOME/sbin
- 统一配置文件(web01/web02)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bss.log main;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_bss.log main;
}
}
- 创建配置文件中的环境(所有web服务都做)
# 创建目录
mkdir -p /application/nginx/html/{bbs,www}
# 创建html文件
for name in www bbs; do echo $name `hostname` > /application/nginx/html/$name/ceshi.html;done
# 查看文件是否写入
for name in www bbs; do cat /application/nginx/html/$name/ceshi.html;done
# 重启nginx
nginx -s reload
- 在LB01服务器上测试
curl 10.0.0.7/ceshi.html
curl 10.0.0.8/ceshi.html
模块功能总结
ngx_http_status_module : 状态模块
ngx_http_ssl_module : ssl模块
ngx_http_log_module : 日志模块
ngx_http_upstream_module : 负载均衡模块
ngx_http_proxy_module : 调用负载均衡模块
配置负载均衡服务
proxy_next_upstream参数
当nginx接收后端服务器返回proxy_next_upstream参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如:500、502、503、504、此参数可以提升用户的访问体验,具体配置如下:
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://static_pool;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy.cnf
}
}
说明:
次参数先去访问后端节点,如果接受到了500这样的报错,在用户请求过来的时候,不会将请求发送给后端故障节点,相当于一个探路的.
ngx_http_upstream_module模块常用功能
- 定义后端可调度节点信息
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream server_pools {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
listen 80;
server_name bbs.etiantian.org;
location / {
proxy_pass http://server_pools;
}
}
}
# server_pools这个是随意定义的名称
# proxy_pass模块调取上面的server_pools地址池
测试是否成功
# 这里curl的地址 应该是负载均衡服务器的地址,不要在curl,web服务器的地址了
curl 10.0.0.5
- 实现全中值负载访问功能(weight)
用于比如服务器一批性能好一批性能不好,性能好的就多分担请求,性能差的就少分担请求.
upstream server_pools {
server 10.0.0.7:80 weight=1;
server 10.0.0.8:80 weight=2;
}
#通过weight=xxx更改分担数量
- 定义后端访问的失败次数(max_fails)
(1)作用是后端节点负载高或者网络有点不稳定抖动的情况,可能会出现负载均衡服务器抛送请求失败的情况,如果抛送不过去就会给下面的节点,设置上此参数后,就定义了一个失败次数,抛送3次,如果3次都不行就往下面一个节点抛送请求!
(2)对用户体验不好,在请求的时候用户看到的网页会卡一会,才会出现网页内容
企业场景:京东2~3次,蓝汛10次,根据业务需求配置
upstream server_pools {
server 10.0.0.7:80 weight=1 max_fails=3;
server 10.0.0.8:80 weight=2 max_fails=3;
}
- 定义后端失败重试的间隔(fail_timeout)
作用是抛送3次请求都失败了,可能服务器出现问题了,配置上fail_timeout参数后设置一个超时时间,抛送3次失败就等xx秒后再次抛送请求,如果还是抛送失败继续等待xx秒后继续抛送!
upstream server_pools {
server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10;
server 10.0.0.8:80 weight=2 max_fails=3 fail_timeout=10;
}
- 定义后端服务的热备节点(backup)[负载节点服务器都挂掉后,使用备份节点服务器]
设置上备份节点服务器,在所有服务器节点宕机后,负载均衡服务器才会把所有请求继续提供给备份服务使用,相当于超级备胎
当调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup,也就是说这两个参数不能配置上去.
upstream server_pools {
server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10;
server 10.0.0.8:80 weight=2 max_fails=3 fail_timeout=10 backup;
}
ngx_http_upstream_module模块调度算法
- 定义轮询调度算法(rr-默认调度算法)
一台一个请求,轮询整个配置上的服务器
- 定义权重调度算法(wrr)
指定某一台性能好的服务器,可以多承担一些请求,性能差的服务器少承担一些请求
- 定义静态调度算法(ip_hash)
(1)Nginx中的ip_hash技术能够将某个ip 的请求定向到同一台后端web机器中,这样一来这个ip 下的客户端和某个后端 web机器就能建立起稳固的session.
ip_hash机制能够让某一客户机在相当长的一段时间内只访问固定的后端的某台真实的web服务器,这样会话就会得以保持,在网站页面进行login的时候就不会在后面的web服务器之间跳来跳去了,也不会出现登录一次的网站又提醒重新登录的情况.
(2)配置 ip_hash算法后不得出现:weight/backup这两个参数
弊端就是会导致后方某个节点负载过大,但是在不会session共享技术的情况下,可以先用此方法代替一下
upstream server_pools {
ip_hash;
server 10.0.0.7:80 max_fails=3 fail_timeout=10;
server 10.0.0.8:80 max_fails=3 fail_timeout=10;
}
- 定义最小的连接数(least_conn)
谁分配的请求少就把后来的请求多分配给这个闲置的服务
可以解决负载的问题
- 动态调度算法(fair)
根据后端节点服务器响应时间来分配请求,响应快就分配给请求,响应慢就不分配给请求!
ngx_http_proxy_module模块常用功能
- 修改反向代理后端请求头信息(proxy_set_header)
作用设置此参数后,例如有2个server虚拟主机,在输入bbs的时候就会直接去bbs,输入www就会直接去显示www,如果不设置就会那个server排在最前面就显示谁,不管是输入bbs还是www.
server {
listen 80;
server_name bbs.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
}
}
# $host 表示用户输入什么就去访问什么
- 客户端访问时显示真实客户端IP地址(X-Forwarded-For)
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。
server {
listen 80;
server_name bbs.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
说明: 会在访问日志中显示出客户端访问的真是IP地址
根据URL中的目录地址实现代理转发
- 案例
通过nginx实现动静分离,即通过nginx反向代理配置规则实现让动态资源和静态资源及其他业务分别由不同的服务器解析,以解决网站性能、安全、用户体验等重要问题
- 准备:案例配置实战
对需求进行梳理
- 当用户请求www.etiantian.org/upload/xxxx 地址时,实现由upload上传服务器池处理请求。
- 当用户请求www.etiantian.org/static/xxxx 地址时,实现由静态服务器池处理请求。
- 除此以外,对于其他访问请求,全都由默认的动态服务器池处理请求。
搭建部署
- 统一三台web服务器的nginx配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bss.log main;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_bss.log main;
}
}
可以使用scp直接传输到另外的机器上
scp -rp /application/nginx/conf/nginx.conf 172.16.1.9:/application/nginx/conf/
- 创建upstream负载信息
upstream upload_pools {
server 10.0.0.8:80;
}
upstream static_pools {
server 10.0.0.7:80;
}
upstream default_pools {
server 10.0.0.9:80;
}
- 在配置文件中如何调用upstream信息
server {
listen 80;
server_name www.etiantian.org;
location /upload/ {
proxy_pass http://upload_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /static/ {
proxy_pass http://static_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
location / {
proxy_pass http://default_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
- 创建环境
www.etiantian.org/bb.html
www.etiantian.org/upload/bb.html
www.etiantian.org/static/bb.html
## web01
mkdir -p /application/nginx/html/www/upload/
echo "web01 upload" > /application/nginx/html/www/upload/bb.html
## web02
mkdir -p /application/nginx/html/www/static
echo "web02 static" > /application/nginx/html/www/static/bb.html
## web03
mkdir -p /application/nginx/html/www/
echo "web03 default" > /application/nginx/html/www/bb.html
- 进行环境测试
root@web03:conf#curl www.etiantian.org/static/bb.html
web02 static
root@web03:conf#curl www.etiantian.org/upload/bb.html
web01 upload
root@web03:conf#curl www.etiantian.org/bb.html
web03 default
因为访问的是先通过负载均衡服务器所以要在
/etc/hosts
文件中写上负载均衡服务器的IP + 域名
这样才可以访问,在windows中一样要在hosts文件中添加.