nginx负载均衡配置指令以及实现动静分离、根据用户访问软件不同显示页面

附加一份Apache的配置文件参数

在这里插入图片描述本博文的前期环境准备参考:博客《nginx简单实现负载均衡》

负载均衡配置指令详细
负载均衡模块:upstream
作用:定义可以进行负载均衡后端节点信息

配置方式参考(当前是least_conn模式)

[root@lb01 conf.d]# cat /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    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  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    #include /etc/nginx/conf.d/*.conf;
    upstream oldboy {
     least_conn;
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

}

upstream模块功能作用:(这个模块配置在HTTP模块中,一般在upstream后面还有一个HTTP的}括号)
有效定义分配负载均衡方式
1)默认采用轮询方式分配资源:平均分配
2)按比例分配资源信息(weight)配置权重信息

 upstream oldboy {
     server 10.0.0.7:80 weight=10;  
     server 10.0.0.8:80 weight=1; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

3)根据服务器连接数量分配资源 least_conn 比较闲会分配更多的资源

  upstream oldboy {
     least_conn;
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

4)根据请求处理能力分配资源: fair 根据节点处理效率

5)根据hash算法分配资源信息 ip_hash 测试效果就是一直是一个web信息,相当于一个厨师负责一个桌客人的菜,一直都是一个厨师负责。

 upstream oldboy {
     ip_hash; 
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

进行后端节点健康检查 LVS没有健康检查功能。
用户访问网站 www.oldboy.com —负载均衡 --web01 服务正常状态 正常响应

1)设置失败访问次数 给一个节点几次机会(连续) max_files默认数值为1

 upstream oldboy {
     server 10.0.0.7:80 max_fails=3;  
     server 10.0.0.8:80 max_fails=3; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

2)设置检查超时时间 多久之后再对用问题的节点进行检查
默认是10s

upstream oldboy {
     server 10.0.0.7:80 max_fails=3 fail_timeout=10s;  
     server 10.0.0.8:80 max_fails=3 fail_timeout=10s; 
     server 10.0.0.9:80; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

3)设置热备服务器 (情侣备胎)

  upstream oldboy {
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80 backup; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
  }
 }

反向代理模块:proxy_pass
1)指定调用集群信息
proxy_pass http://oldboy;
2)识别用户请求host信息
proxy_set_header host $host; —设置修改负载均衡HTTP请求报文中请求头内容
调用负载均衡HTTP请求报文中的host提取,并修改为$host (调用用户请求报文中host)

修改web节点信息:
1加载bbs网站信息 (web01 web02 web03)

   vim /etc/nginx/nginx.conf
	  include /etc/nginx/conf.d/www.conf;
      include /etc/nginx/conf.d/bbs.conf;

2 在站点目录下创建首页文件

  web01: 
	  echo  bbs01-info >/html/bbs/index.html 
	  web02
	  echo  bbs02-info >/html/bbs/index.html 
	  web03
	  echo  bbs03-info >/html/bbs/index.html 

提示:这里的bbs.conf文件内容一致;都是:

server {
  listen 80;
  server_name  bbs.oldboy.com;
  location / {
  root  /html/bbs/;
  index  index.html;
} 
}

3 访问测试过程(lb01)
注意:这个是在负载均衡服务器作为用户进行访问的。也就是没有负载均衡,用户直接网站时。一切正常。

[root@lb01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.7
web01-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.7
bbs01-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.8
bbs02-info
[root@lb01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.9
bbs03-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com  10.0.0.9
web03-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com  10.0.0.8
web02-info
[root@lb01 conf.d]# curl -H host:www.oldboy.com  10.0.0.7
web01-info

如果是用户经过负载均衡在访问网站时:(在web服务器作为用户,访问负载服务器)

[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:www.oldboy.com  10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:www.oldboy.com  10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:www.oldboy.com  10.0.0.31

出现了问题:怎么访问bbs出现www的页面???
原因:因为两个网址都符合四层的匹配条件,然后因为在主配置文件中的文件加载顺序的原因,导致访问不同域名仍然出现同一个服务器内容。最直接的原因是因为post头部携带的信息发生了改变,不再是一开始指定的www.oldboy.com信息(默认修改为了oldboy信息)

nginx.conf中include位置越靠前越优先加载
如果include是*.conf,则根据字母顺序优先级匹配

而负载均衡的识别host头部信息的作用就可以解决这个问题

负载均衡配置:

    upstream oldboy {
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80 backup; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
    proxy_set_header host $host;
  }
 }

再次测试:

[root@web01 conf.d]# curl -H host:www.oldboy.com  10.0.0.31
web01-info
[root@web01 conf.d]# curl -H host:www.oldboy.com  10.0.0.31
web02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
bbs01-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
bbs02-info
[root@web01 conf.d]# curl -H host:bbs.oldboy.com  10.0.0.31
bbs01-info

一切正常。利用负载均衡可以加载不同网站页面。

3)识别用户真实IP地址信息
$http_x_forwarded for —日志格式变量用于记录真实用户IP地址

	 用户访问  --- 负载均衡(记录用户IP地址)  --- web服务器(查看用户IP地址)
	                HTTP请求报文(IP地址信息)  --> 识别真实用户地址 

proxy_set_header —设置负载均衡请求头的信息
proxy_set_header X-Forwarded-For $remoe_addr;

负载均衡配置:

   upstream oldboy {
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80 backup; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
    proxy_set_header host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
 }

这个配置好以后在日志中查看真实的IP地址。
注意:如图所示,访问负载均衡,负载均衡将访问给到了第一台web01服务器,那么在web01的服务器上查看日志才能看到真实IP地址,不能是在负载均衡的服务器上查看日志。那样是看不到的。
在这里插入图片描述
日志信息如下:

10.0.0.31 - - [17/Feb/2020:09:31:09 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"
10.0.0.31 - - [17/Feb/2020:09:31:09 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"
10.0.0.31 - - [17/Feb/2020:09:35:00 -0500] "GET / HTTP/1.0" 200 11 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" "10.0.0.1"

4)负载均衡健康检查并不能对页面信息做检测检查,如何处理
实现对网站页面进行健康检查
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429

解决:监控网站页面是否正常,负载均衡只返回用户正确页面。
如下的配置中:
如果页面出现403的错误,那么负载就不会将请求发送给他,保证用户看不到出错页面。

负载配置信息:

    upstream oldboy {
     server 10.0.0.7:80;  
     server 10.0.0.8:80; 
     server 10.0.0.9:80 backup; 
 }
    server {
    listen 80;
    server_name localhost;
    location / {
    proxy_pass  http://oldboy;
    proxy_set_header host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_next_upstream  error  timeout invalid_header  http_403;
  }
 }

负载均衡企业中实际应用
1)实现网站动静分离过程
动静分离的架构 --URI信息不同
访问URI信息 静态资源 —静态集群
访问URI信息 动态资源 ----动态集群

架构环境规划:
	   用户请求(URI)	处理请求服务器	                 站点目录	        功能
       /upload	        10.0.0.8:80 (upload)	         html/www/upload	upload服务器
       /static	        10.0.0.7:80 (static)	         html/www/static	static静态服务器
       /             	10.0.0.9:80 (默认)	             html/www	        默认

第一个历程:在后端节点上创建不同集群节点资源
· 上传集群节点配置: 10.0.0.8
编写nginx.conf / 修改站点目录
www - server 站点目录 /html/www/upload

   mkdir /html/www/upload -p
         echo upload-page > /html/www/upload/index.html
   · 静态集群节点配置: 10.0.0.7
     编写nginx.conf / 修改站点目录
	 www - server  站点目录 /html/www/static/
 mkdir /html/www/static
         echo static-page >/html/www/static/index.html

第二个历程:修改负载均衡j节点的配置文件

    upstream  upload {
    server  10.0.0.8:80;
}
    upstream   static { 
    server  10.0.0.7:80;
}
    upstream   default {
    server   10.0.0.9:80;
}
    server  { 
    listen  80;
    server_name  localhost;
    location  /upload { 
    proxy_pass    http://upload;
    proxy_set_header host  $host;
    proxy_set_header X-Forwarded-For  $remote_addr;   
}
    location /static {
    proxy_pass    http://static;
    proxy_set_header  host  $host;
    proxy_set_header X-Forwarded-For  $remote_addr;   
    proxy_next_upstream  error timeout invalid_header  http_403;   
}
    location / {
              proxy_pass    http://default;
              proxy_set_header host $host;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_next_upstream  error timeout invalid_header  http_403;
          }
}
}

第三历程:其实没有第三个历程了,但是容易出错,就把和这个给放到这儿吧。
web01的www.conf配置文件

[root@web01 static]# cat /etc/nginx/conf.d/www.conf 
server {
  listen 80;
  server_name  www.oldboy.com;
  location / {
  root  /html/www/;
  index  index.html;
} 
}

web02的www.conf配置文件

server {
  listen 80;
  server_name  www.oldboy.com;
  location / {
  root  /html/www/;
  index  index.html;
} 
}

注意新添加的文件后属主属组是否和/html/www下面一样。
注意:单点配置IP地址以及动态静态划分和负载主配置文件中指定的是否一样

2)实现根据用户端不同显示不同页面

   架构环境规划
   手机端集群  iphone   10.0.0.7    显示页面信息  iphone-page
   电脑端集群  PC       10.0.0.8    显示页面信息  PC-page

第一个历程:配置负载均衡节点信息

   iphone集群中的节点: 10.0.0.7
   echo iphone-page > /html/www/index.html

   PC集群中的节点: 10.0.0.8
   echo PC-page > /html/www/index.html 	 

第二个历程:负载均衡配置信息

   upstream PC {
          server 10.0.0.8:80;
   }
   upstream iphone {
      server 10.0.0.7:80;
   }
   
   server {
      listen        80;
      server_name   localhost;
      location / {
          if ($http_user_agent ~* "iphone|Android") {
             proxy_pass    http://iphone;
          }
          if ($http_user_agent ~* "chrome") {
             proxy_pass    http://PC;
          }
          proxy_set_header host $host;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_next_upstream  error timeout invalid_header  http_403;
      }
   }
发布了183 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42506599/article/details/104364751
今日推荐