基于nginx负载均衡调度
基于uri请求调度至不同集群
好处:
- 每个uri后端提供的集群互相独立,耦合度较低,某个集群故障不会影响其他集群。
- 可以各自分担各自模块的访问请求和压力。
- 可以根据不同模块的请求压力,调整每个模块下对应集群的节点数量
更加有效的充分利用其系统资源
缺点: - 需要开发将代码进行拆分
- 需要将代码进行独立部署
- 整个实现的方式相对复杂
实验目标:
实现以下模式:
实现步骤:
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
实现方法:
- 所有的代理节点都添加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";
?>
- 使用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。
其他的与第一种方法配置相同。