nginx(4)

基于nginx负载均衡调度

基于uri请求调度至不同集群

好处:

  1. 每个uri后端提供的集群互相独立,耦合度较低,某个集群故障不会影响其他集群。
  2. 可以各自分担各自模块的访问请求和压力。
  3. 可以根据不同模块的请求压力,调整每个模块下对应集群的节点数量
    更加有效的充分利用其系统资源
    缺点:
  4. 需要开发将代码进行拆分
  5. 需要将代码进行独立部署
  6. 整个实现的方式相对复杂
    实验目标:
    实现以下模式:
    在这里插入图片描述
实现步骤:

1.web01提供/user 使用多端口来模拟多个节点
[root@web01 ~]# cat /etc/nginx/conf.d/agent.wenjie.com.conf
server {
	listen 8080;
	server_name agent.wenjie.com;
	root /agent/8080;

	location / {
		index index.html;
	}
}

server {
	listen 8081;
	server_name agent.wenjie.com;
	root /agent/8081;

	location / {
		index index.html;
	}
}
mkdir /agent/{8080,8081} -p
echo "user-8080" > /agent/8080/index.html
echo "user-8081" > /agent/8081/index.html
systemctl reload nginx

2.web02模拟pass,使用多端口来模拟多个节点

[root@web02 ~]# cat  /etc/nginx/conf.d/agent.wenjie.com.conf
server {
	listen 8082;
	server_name agent.wenjie.com;
	root /agent/8082;

	location / {
		index index.html;
	}
}

server {
	listen 8083;
	server_name agent.wenjie.com;
	root /agent/8083;

	location / {
		index index.html;
	}
}
mkdir /agent/{8082,8083} -p
echo "pass-8082" > /agent/8082/index.html
echo "pass-8083" > /agent/8083/index.html
systemctl reload nginx

3.配置负载均衡
upstream agent-user {
	server 172.16.1.7:8080;
	server 172.16.1.7:8081;
}
upstream agent-pass {
	server 172.16.1.8:8082;
	server 172.16.1.8:8083;
}
server {
	listen 80;
	server_name agent.wenjie.com;
	location /user {
		proxy_pass http://agent-user/;
		include proxy_params;
	}
	location /pass {
		proxy_pass http://agent-pass/;
		include proxy_params;
	}
}

基于来源的终端设备调度不同的页面

如:
我们用手机访问百度显示的是手机端的百度
我们用pc访问百度显示的是pc端的百度
要实现这个方法我们需要使用http_user_agent变量结合if语句来实现。

配置方法:

通过负载均衡将来源的终端设备调度不同的页面
	网站:
		pc: pc端百度
		手机:显示是手机端的百度



1.web01作为手机端
[root@web01 ~]# cat /etc/nginx/conf.d/useragent.wenjie.com.conf
server {
	listen 80;
	server_name useragent.wenjie.com;
	root /useragent;

	location / {
		index index.html;
	}
}
[root@web01 ~]# mkdir /useragent
[root@web01 ~]# echo "Phone..." > /useragent/index.html
[root@web01 ~]# systemctl reload nginx



2.web02作为pc端
[root@web02 ~]# cat /etc/nginx/conf.d/useragent.wenjie.com.conf
server {
	listen 80;
	server_name useragent.wenjie.com;
	root /useragent;

	location / {
		index index.html;
	}
}
[root@web02 ~]# mkdir /useragent
[root@web02 ~]# echo "PC..." > /useragent/index.html
[root@web02 ~]# systemctl reload nginx


3.负载均衡判断设备,然后调度到不同的集群。
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_useragent.wenjie.com.conf
upstream pc {
	server 172.16.1.8:80;
}

upstream sj {
	server 172.16.1.7:80;
}


server {
	listen 80;
	server_name useragent.wenjie.com;
	charset utf-8;

	location / {
		default_type text/html;     		#默认不支持将文字 打印到浏览器,所以需要调整默认的类型
		proxy_pass http://pc; 			#默认走PC
		include proxy_params;

		#判断
		if ( $http_user_agent ~* "android|iphone|ipad" ) {
			proxy_pass http://sj;
		}

		#如果开发写的代码不支持某些浏览器,还可以直接在Nginx层面拒绝他比如:MSIE
		if ( $http_user_agent ~* "Firefox|MSIE" ) {
			return 200 "你当前使用的浏览器真棒!";
		}
	}
}

proxy_pass 的两种写法:
proxy_pass http://localhost:8080;
proxy_pass http://localhost:8080/;
这两种的区别是:
加/表示nginx负载均衡到后端节点后访问的URL完全不变。
不加/表示nginx负载均衡到后端节点后访问的URL会抹去location匹配的URL。

多级代理透传真实ip

实验环境介绍:
10.0.0.1 客户端
proxy-1 10.0.0.5
proxy-2 10.0.0.7
web 10.0.0.8

实现方法:

  1. 所有的代理节点都添加x-forwarded-for头字段,如果有一个环节没有,那么就无法提取真实的ip地址。第一个ip是真实的客户机的ip。后面的ip的经过的代理服务器的ip。
    x-forwarded-for可以经过的所有代理服务器的ip地址,realip只显示上一级代理服务器的ip。
    优点:
    一定能提取到真实的ip地址。
    实现方法:
proxy-1
[root@lb01 ~]# cat   /etc/nginx/conf.d/proxy_ip.oldxu.com.conf
server {
	listen 80;
	server_name ip.oldxu.com;

	location / {
		proxy_pass http://10.0.0.7;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP  $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

proxy-2
[root@web01 ~]# cat /etc/nginx/conf.d/proxy_ip.oldxu.com.conf
server {
	listen 80;
	server_name ip.oldxu.com;

	location / {
		proxy_pass http://10.0.0.8;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP  $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}



web
[root@web02 ~]# cat /etc/nginx/conf.d/ip.oldxu.com.conf
server {
	listen 80;
	server_name ip.oldxu.com;
	root  /php;

	location /  {
		index index.php;
	}

	location ~ \.php$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include  fastcgi_params;
	}
}


web站点内容
[root@web02 ~]# mkdir /php
[root@web02 ~]# cat /php/index.php
<?php
	$ip = getenv("HTTP_X_FORWARDED_FOR");
	echo "获取X_FORWARDED_FOR的真实IP地址是: $ip";
?>

  1. 使用Nginx RealIP模块开实现地址透传。
    缺点:需要知道沿途经过的所有IP地址。
    优点:直接使用就能提取到真实IP地址。

配置方法
在web服务器的对应的nginx站点的配置文件中的server层添加如下内容:

set_real_ip_from 10.0.0.5;	
set_real_ip_from 10.0.0.7;		# 写入所有代理服务器的ip。
real_ip_header X-Forwarded-For; 
real_ip_recursive on;  # 表示排除set_real_ip_from中出现的ip,剩余的ip被认为是真实ip。

其他的与第一种方法配置相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值