目录
一、简介
负载均衡
对用户的访问请求进行调度管理
对用户的访问请求进行压力分担
反向代理
接收用户请求代替用户向后端访问
反向代理与数据转发的区别
实验配置信息:
HOSTNAME | IP | 说明 |
lb01 | 192.168.231.141 | Nginx主负载服务器 |
web01 | 192.168.231.142 | web01服务器 |
web02 | 192.168.231.143 | web02服务器 |
二、环境搭建
1.安装部署nginx过程:
可查看上一篇博客:
https://blog.csdn.net/yuanfangPOET/article/details/83446907
2.编写nginx配置文件(统一web服务器配置)
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_bbs.log main;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
}
}
3.统一nginx测试环境 (web文件)
在nginx/html目录下创建www,bbs目录和web文件index.html
统一规格web01 www
web01 bbs
4.测试:
[root@lb01 ~]# curl -H host:www.realxw.com 192.168.231.142
web01 www
[root@lb01 ~]# curl -H host:www.realxw.com 192.168.231.143
web02 www
[root@lb01 ~]# curl -H host:bbs.realxw.com 192.168.231.142
web01 bbs
[root@lb01 ~]# curl -H host:bbs.realxw.com 192.168.231.143
wbe02 bbs
5.配置负载服务文件:
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 192.168.231.142:80;
server 192.168.231.143:80;
}
server {
listen 80;
server_name www.realxw.com;
location / {
proxy_pass http://server_pools;
}
}
server {
listen 80;
server_name bbs.realxw.com;
location / {
proxy_pass http://server_pools;
}
}
}
6.测试:
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web01 www
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web02 www
三、配置参数实践
3.1 模块调度算法
①. 定义轮询调度算法-rr-默认调度算法
②. 定义权重调度算法-wrr
③. 定义静态调度算法-ip_hash
④. 定义最小的连接数-least_conn
3.2 nginx反向代理相关两个模块
upstream 模块 类似与一个池塘,将nginx节点放置到池塘中
proxy模块 用池塘里面的nginx节点,利用pr oxy进行调用
3.3 upstream模块核心参数简介
weight 权重
max_fails 失败的尝试次数
fail_timeout 失败的超时时间
backup 备份:所有节点凉掉后才会请求backip节点
3.3.1 weight参数实践:
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 192.168.231.142:80 weight 1;
server 192.168.231.143:80 weight 2;
}
server {
listen 80;
server_name www.realxw.com;
location / {
proxy_pass http://server_pools;
}
}
server {
listen 80;
server_name bbs.realxw.com;
location / {
proxy_pass http://server_pools;
}
}
}
3.3.2测试:
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141
web02 www
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141
web01 www
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141
web02 www
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141
web02 www
3.4.1 其他参数使用:
server 192.168.231.142:80 weight=1 max_fails=2 fail_timeout=10;
server 192.168.231.143:80 weight=2 max_fails=2 fail_timeout=10 backup;
3.4.2 测试(web02为备份节点):
[root@lb01 conf]# curl 192.168.231.141
web01 www
[root@lb01 conf]# curl 192.168.231.141
web01 www
停掉web01:
[root@lb01 conf]# curl 192.168.231.141
web02 www
[root@lb01 conf]# curl 192.168.231.141
web02 www
3.5 ip_hash参数实践
每个客户端访问,都会将客户端IP通过哈希算法算出一个值,在随后的客户端进行访问时,只要hash值相同,就会被分配到同一台服务器,该调度算法可以解决动态网页的session共享问题,但会导致请求分配不均,即无法保证1:1的负载均衡,因为在国内大多数公司都是NAT上网横式,多个客户端会对应1个外部IP ,所以,这些客户端都会被分配到同一节点服务器,从而导致请求分配不均。
修改nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream server_pools{
ip_hash;
server 192.168.231.142:80;
server 192.168.231.143:80;
}
server {
listen 80;
server_name www.realxw.com;
location / {
proxy_pass http://server_pools;
}
}
}
测试:
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web01 www
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web01 www
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web01 www
[root@lb01 conf]# curl -H host:bbs.realxw.com 192.168.231.141
web01 www
3.6 nginx负载均衡相关重要参数
Nginx反向代理重要参敎 | 解释说明 |
proxy.pass http://server_pools; | 通过proxy_pass功能把用户的清求转向到反向代理定义的upstream服务器池 |
proxy_set_header Host $host | 在代理向后端服务器发送的 http请求头中加入 host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机。这是节点服务器多虚拟主机时的关键配置 |
proxy_set_header X-ForwardedFor $remote_addr; | 在代理向后端服务器发送的 http请求头中加入 X-Forward-For字段信息,用于后端服务器程序、日志等接收记录真实用户的 IP ,而不是代理服务器的 IP这是反向代理时,节点服务器获取用户真实 IP的必要功能配置 |
3.7 proxy_set_header Host $host;参数实践:
当后端服务器配置有多个虚拟主机时,添加proxy_set_header Host $host;
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 192.168.231.142:80;
server 192.168.231.143:80;
}
server {
listen 80;
server_name www.realxw.com;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
}
}
server {
listen 80;
server_name bbs.realxw.com;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
}
}
}
3.8 proxy_set_header X-ForwardedFor $remote_addr;参数实践:
没添加之前:
客户端进行访问(需要在hosts文件中添加解析):
web01服务器access_www.log日志:
192.168.231.141 - - [26/Oct/2018:03:08:23 +0800] "GET / HTTP/1.0" 200 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0" "-"
添加参数后:
server {
listen 80;
server_name www.realxw.com;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
添加之后:
192.168.231.141 - - [26/Oct/2018:03:17:23 +0800] "GET / HTTP/1.0" 20 0 10 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.231.1"
3.9 相关参数:
http proxy 模块相关参数 | 说明 |
proxy_set_header | 设置http请求header项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址 |
client_body_buffer_size | 用于指定客户端请求主体缓冲区大小 |
proxy_connect_timeout | 表示反向代理后端节点服务器连接的超时时间,即发起握手等候响应的超时时间 |
proxy_send_timeout | 表示代理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完所有数据,否则nginx将断开这个连接 |
proxy_read_timeout | 设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx已经进入后端的排队之中等候处理的时间 |
proxy_buffer_size | 设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小 |
proxy_buffers | 设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会设置到缓冲区 |
proxy_busy_buffers_size | 用于设置相同很忙时可以使用的proxy_buffers大小,官方推荐的大小为 proxy_buffers * 2 |
proxy_trmp_file_write_size | 指定proxy缓存临时文件的大小 |
4.根据URI目录地址转发的应用场景:
基于目录进行转发-网站动静结合:
目录(uri) | ip | 服务器目录 |
/upload | 192.168.231.142 | html/www/upload |
/static | 192.168.231.143 | html/www/static |
在相应的服务器目录中创建相应目录和index.html文件
创建/设置upstream负载信息
upstream upload_pools{
server 192.168.231.142;
}
upstream static_pools{
server 192.168.231.143;
}
调用upstream信息
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;
}
修改nginx.conf
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"';
#access_log logs/access.log main;
upstream upload_pools{
server 192.168.231.142;
}
upstream static_pools{
server 192.168.231.143;
}
server {
listen 80;
server_name www.realxw.com;
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;
}
access_log logs/access.log main;
}
}
测试:
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141/static/
web02 static
[root@lb01 conf]# curl -H host:www.realxw.com 192.168.231.141/upload/
web01 upload