Day60-Nginx反向代理与负载均衡基于URI及USER_AGENT等跳转讲解
- 9. 基于uri实现动静分离、业务模块分离调度企业案例(参考书籍)
- 10.基于user_agent及浏览器实现转发(参考书籍)
- 11.根据文件扩展名实现代理转发
- 12. Nginx负载均衡监测节点状态
- 13.proxy_next_upstream 健康检查参数
9. 基于uri实现动静分离、业务模块分离调度企业案例(参考书籍)
(12)动静分离,手机PC跳转,注册,登录分离,中文,英文分离,上传、下载、浏览分离。(location和if判断)
根据url中的目录地址实现代理转发
1)动静分离
2)不同业务分离
3)不同客户端设备
如何让网页中的图片地址和www主域名不一样?
- 购买一个和blog.etiantian.org不一样的域名oldboy.com
- img1.oldboy.com #作为图片域名
img2.oldboy.com #china cache
img3.oldboy.com #阿里云加速 - 把图片上传CDN(图片放进去)。
- 发文章,嵌入图片的URL地址。
- 发布。
blog.etiantian.org
img1.oldboy.com
方法2:企业采纳的方法
-
购买一个和blog.etiantian.org不一样的域名oldboy.com
-
img1.oldboy.com #作为图片域名
img2.oldboy.com #china cache
img3.oldboy.com #阿里云加速 -
上传服务修改,有一个静态域名列表,从本地上传后,
img1.oldboy.com/a.jpg
img2.oldboy.com/b.jpg #(wordpress 自己修改上传图片地址为你想要的域名)
http://img2.oldboy.com/wp-content/uploads/2021/07/1920-1080%E8%80%81%E7%94%B7%E5%AD%A9%E6%95%99%E8%82%B2%E8%A7%86%E9%A2%91LOGO-logoQQ%E7%BE%A4-Linux%E8%AF%BE%E7%A8%8B-v1-1024x77.png -
发布。
先进行企业案例需求梳理:
当用户请求www.etiantian.org/upload/xx地址时,实现由上传服务器池(upload_pools)处理请求。
当用户请求www.etiantian.org/static/xx地址时,实现由静态服务器池(static_pools)处理请求。
除此以外,对于其他访问请求,全都由默认的动态服务器池(default_pools)处理请求。
根据URL目录地址转发的应用场景
根据http的URL进行转发的应用情况,被称为第7层(应用层)的负载均衡,而LVS的负载均衡一般用于TCP等的转发,因此被称为第4层(传输层)的负载均衡。
在企业中,有时希望只用一个域名对外提供服务,不希望使用多个域名对应同一个产品业务,此时就需要在代理服务器上通过配置规则,使得匹配不同规则的请求会交给不同的服务器池处理。这类业务有:
1)业务的域名没有拆分或者不希望拆分,但希望实现动静分离、多业务服务分离。
2)不同的客户端设备(例如:手机和PC端)使用同一个域名访问同一个业务网站,就需要根据规则将不同设备的用户请求交给后端不同的服务器处理,以便得到最佳的用户体验。这也是非常重要的,接下来就讲解相关案例。
【动静分离】服务说明列表:
节点 | IP及端口 | 测试地址 | 字符串为代表业务 |
---|---|---|---|
web01 | 10.0.0.7:80 | http://www.etiantian.org/static/index.html | static_pools |
web02 | 10.0.0.8:80 | http://www.etiantian.org/upload/index.html | upload_pools |
web02 | 10.0.0.9:80 | http://www.etiantian.org/index.html | |
http://www.etiantian.org | default_pools |
对应核心配置:
[root@lb01 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 conf.d]# systemctl restart nginx
[root@lb01 conf.d]# cat 01_www.etiantian.org.conf
upstream static_pools {
server 10.0.0.7:80 weight=1;
}
upstream upload_pools {
server 10.0.0.8:80 weight=1;
}
upstream default_pools {
server 10.0.0.9:80 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://default_pools;
proxy_set_header Host $http_host;
}
location /static/ {
proxy_pass http://static_pools;
proxy_set_header Host $http_host;
}
location /upload/ {
proxy_pass http://upload_pools;
proxy_set_header Host $http_host;
}
}
部署web01
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# mkdir /data/www/static -p
[root@web01 conf.d]# echo static >/data/www/static/index.html
[root@web01 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.7/static/
static
[root@web01 conf.d]# cat 03_www.etiantian.org.conf
server{
listen 172.16.1.7:80;
server_name www.etiantian.org;
root /data/www;
location / {
root /data/www;
index index.php index.html;
}
}
部署web02
[root@web02 conf.d]# cat 03_www.etiantian.org.conf
server{
listen 172.16.1.8:80;
server_name www.etiantian.org;
root /data/www1;
location / {
index index.php index.html;
}
}
server{
listen 172.16.1.9:80;
server_name www.etiantian.org;
root /data/www2;
location / {
index index.php index.html;
}
}
[root@web02 conf.d]# ifconfig eth1:1 172.16.1.9 up
[root@web02 conf.d]# mkdir /data/{www1,www2}
[root@web02 conf.d]# mkdir /data/www1/upload
[root@web02 conf.d]# mkdir /data/www2/default
[root@web02 conf.d]# echo upload >/data/www1/upload/index.html
[root@web02 conf.d]# echo default >/data/www2/default/index.html
[root@web02 conf.d]# nginx -t
[root@web02 conf.d]# systemctl restart nginx
[root@web02 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.8/upload/
upload
[root@web02 conf.d]# curl -H "host:www.etiantian.org" 172.16.1.9/default/
default
LB01:检查
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/static/
static
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/default/
default
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5/upload/
upload
[root@lb01 conf.d]# grep www /etc/hosts
172.16.1.5 lb01 test.etiantian.org www.etiantian.org
[root@lb01 conf.d]# curl http://www.etiantian.org/upload/
upload
[root@lb01 conf.d]# curl http://www.etiantian.org/static/
static
[root@lb01 conf.d]# curl http://www.etiantian.org/default/
default
实践动静分离
部署01:
[root@web01 conf.d]# cat blog.etiantian.org.conf
server {
listen 172.16.1.7:80;
server_name blog.etiantian.org;
root /data/blog; #正常站点目录
access_log /var/log/nginx/mirrors.etiantian.org.access.log.gz main gzip=9 buffer=32k flush=5s;
#index index.php;
location / {
root /data/blog;
index index.php index.html;
}
location ~ \.php$ {
root /data/blog;
fastcgi_pass 127.0.0.1:9000;
# 将请求转给9000端口的应用程序处理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 告诉php我们需要被解析的文件在哪个目录,是哪个文件
include fastcgi_params;
}
}
server{
listen 172.16.1.9:80;
server_name blog.etiantian.org;
root /data/static;
location / {
index index.php index.html;
}
}
#静态和动态如果独立服务器,可以各自挂载各自的
#mount -t nfs 172.16.1.31:/data/blog /data/static
# 此处是静态和动态混杂在一台服务器上
[root@web01 conf.d]# ln -s /data/blog/wp-content/uploads /data/static
[root@web01 conf.d]# ifconfig eth1:1 172.16.1.10 up
后面配置独立服务器了。
location /uploads/ {
proxy_pass http://static/wp-content;
proxy_set_header Host $http_host;
}
1
[root@lb01 conf.d]# curl -H "host:blog.etiantian.org" 10.0.0.5/wp-content/uploads/
1
http://blog.etiantian.org/wp-content/uploads/2021/07/%E6%BD%98%E6%99%93%E5%A9%B7.jpg
/data/static/wp-content/uploads/2021/07/Origami-1.1.0.zip
/data/blog/wp-content/uploads/
【业务分离】服务说明列表:
节点 | IP及端口 | 测试地址 | 字符串为代表业务 |
---|---|---|---|
web01 | 10.0.0.10:80 | http://www.etiantian.org/register/index.html | register_pools |
web02 | 10.0.0.11:80 | http://www.etiantian.org/login/index.html | login_pools |
web02 | 10.0.0.9:80 | http://www.etiantian.org/index.html | |
http://www.etiantian.org | default_pools |
www.etiantian.org;
默认访问www首页
location / {
index index.html;
}
location /register/ {
proxy_pass http://register;
proxy_set_header Host $http_host;
}
location /login/ {
proxy_pass http://login;
proxy_set_header Host $http_host;
}
web01:
[root@web01 ~]# cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
root /data/www;
location / {
index index.html;
}
}
[root@web01 ~]# mkdir /data/www
[root@web01 ~]# echo "register_web01..." > /data/www/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx
web02:
[root@web02 ~]# vim /etc/nginx/conf.d/www.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
root /data/www;
location / {
index index.html;
}
}
[root@web02 ~]# mkdir /data/www
[root@web02 ~]# echo "login--web02.." >> /data/www/index.html
[root@web01 ~]# nginx -t
[root@web01 ~]# systemctl reload nginx
负载均衡:
[root@lb01 conf.d]# cat /etc/nginx/conf.d/www.etiantian.org.conf
upstream register {
server 172.16.1.7:80;
}
upstream login {
server 172.16.1.8:80;
}
server {
listen 80;
server_name www.etiantian.org;
location /register {
proxy_pass http://register/;
include proxy.conf;
}
location /login {
proxy_pass http://login/;
include proxy.conf;
}
}
location /login 添加/ 和不添加/ 有什么区别?
location /register/ {
proxy_pass http://backup;
include proxy.conf;
}
#相当于访问:
http://backup/register/;
#Nginx负载均衡到后端节点:http://backup/register/index.html #区别在这里
10.基于user_agent及浏览器实现转发(参考书籍)
【基于客户端设备】服务说明列表:
节点 | IP及端口 | 测试地址 | 字符串为代表业务 |
---|---|---|---|
web01 | 10.0.0.7:80 | 客户端(PC、谷歌浏览器) | pc_pools |
web02 | 10.0.0.8:80 | iphone(谷歌f12模拟或者手机访问) | phone_pools |
使用相同的域名,根据来源设备调度到不同的服务器集群
web01:pc
[root@web01 ~]# cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
root /data/agent;
location / {
index index.html;
}
}
[root@web01 ~]# mkdir /data/agent/
[root@web01 ~]# echo "PC....web01" > /data/agent/index.html
web02:
[root@web02 ~]# cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
root /data/agent;
location / {
index index.html;
}
}
[root@web02 ~]# mkdir /data/agent -p
[root@web02 ~]# echo "Phone..web02" > /data/agent/index.html
[root@web02 ~]# nginx -t
[root@web02 ~]# systemctl reload nginx
负载均衡:
[root@lb01 conf.d]# cat 01_www.etiantian.org.conf
upstream pc {
server 172.16.1.7:80;
}
upstream iphone {
server 172.16.1.8:80;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_set_header Host $Http_host;
# 判断如果来源是手机则调度到phone集群组
if ($http_user_agent ~* "iphone|android|ipad" ) {
proxy_pass http://iphone;
}
if ($http_user_agent ~* "firefox|MSIE|Chrome|Trident") {
#return 200 'Please Change Browser.....';
return 302 'http://www.oldboyedu.com';
}
# 如果来源不是手机,则调度到pc集群组
proxy_pass http://pc;
}
}
提示:可以使用curl的-A功能模拟User_agent。谷歌f12模拟iphone。
[root@lb01 conf]# curl -A "android" http://www.etiantian.org/upload/
upload server
[root@lb01 conf]# curl -A "iphone" http://www.etiantian.org/static/
static server
[root@lb01 conf.d]# curl -A "iphone" -H "host:www.etiantian.org" 10.0.0.5
iphone or android
[root@lb01 conf.d]# curl -A "android" -H "host:www.etiantian.org" 10.0.0.5
iphone or android
[root@lb01 conf.d]#
[root@lb01 conf.d]# curl -H "host:www.etiantian.org" 10.0.0.5
pc电脑或谷歌浏览器
[root@lb01 conf.d]# curl -A "Chrome" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]#
[root@lb01 conf.d]# curl -A "firefox" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]#
[root@lb01 conf.d]# curl -A "MSIE" -H "host:www.etiantian.org" 10.0.0.5
Please Change Browser.....[root@lb01 conf.d]#
11.根据文件扩展名实现代理转发
动静分离时已经实现
12. Nginx负载均衡监测节点状态
扩展作业:使用第三方模块监测 Nginx负载均衡监测节点状态
13.proxy_next_upstream 健康检查参数
当Nginx接收后端服务器返回proxy_next_upstream参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如500、502、503、504,此参数可以提升用户的访问体验,具体配置如下:
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://static_pools;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy.conf;
}