四层负载均衡,资源分离以及rewrite

内容概述

1.四层负载均衡
-1.1 什么是四层负载均衡
-1.2 四层负载均衡的应用场景
-1.3 四层负载均衡的特点
-1.4 四层负载均衡实践
-1.5 四层负载均衡的端口转发
2.nginx动静分离、资源分离
-2.1 一台机器动静资源分离
-2.2 多台机器动静分离
-2.3 nginx资源分离
3.nginx的rewrite重写
-3.1 什么是rewrite
-3.2 rewrite可以做什么
-3.3 如何使用rewrite
-3.4 rewrite标记flag
	1)last与break的区别
	2)redirect与permanent的区别
-3.5 rewrite的伪静态

内容详细

1.四层负载均衡

1.1 什么是四层负载均衡

	四层负载均衡又称四层交换机,主要分析ip和tcp/udp层,实现四层流量负载均衡,也就是通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
	以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。

1.2 四层负载均衡的应用场景

1.为保证负载均衡的高可用,我们选择四层+七层的方式来做负载均衡。
2.四层负载均衡可以做到端口转发。
3.四层负载均衡可以实现数据库读写分离。

1.3 四层负载均衡的特点

1.四层负载均衡只能转发tcp/udp协议,通常用来转发端口
2.四层负载均衡可以用来解决七层负载均衡的端口限制问题,(因为七层负载均衡最多使用65535个端口号)
3.我们使用四层负载均衡解决七层负载均衡的高可用问题(多台后端七层负载均衡可以同时使用)
4.四层的转发效率比七层要高得多但仅支持tcp/ip协议,不支持http和https协议
5.通常的高并发场景会选择使用在七层负载均衡前面增加四层负载

1.4 四层负载均衡实践

1.环境准备
两台七层负载均衡以及一台四层负载均衡
2.我们已经提前搭建好了一台lb01七层负载均衡现在搭建lb02七层负载均衡
3.搭建lb02七层负载均衡
配置yum源
安装
配置nginx,配置负载均衡
创建用户
启动
4.将lb01配置同步到lb02
 scp /etc/nginx/conf.d/* 172.16.1.6:/etc/nginx/conf.d/
scp /etc/nginx/proxy_params 172.16.1.6:/etc/nginx/
5.测试lb02负载均衡
nginx-t
systemctl restart nginx
访问测试
6.搭建四层负载均衡lb4
	1)四层负载均衡的配置语法
Syntax: stream { ... }
Default:    —
Context:    main
	2)编译安装nginx
下载源码包
wget https://nginx.org/download/nginx-1.20.1.tar.gz
解压:
tar -xf nginx-1.20.1.tar.gz
进入nginx源码包中编译安装
cd nginx-1.20.1
./configure --with-stream --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=www --group=www
编译安装
make && make install 
	3)配置nginx主配置文件
# 注释掉http层的所有内容
user  www;
worker_processes  auto;
error_log  /var/log/nginx/error.log  info;
pid        /run/nginx.pid;
events {
    worker_connections  1024;
}
stream {
    upstream lbtcp {
    	server 172.16.1.5:80;
    	server 172.16.1.6:80;
    }
    server {
    	listen 80;
    	proxy_pass lbtcp;			# 转发的链接池
    	proxy_connect_timeout 1s;	 # 连接池中的IP链接的超时时间
         proxy_timeout 3s;			# 返回数据的超时时间
    }
}
	4)增加systemctl管理配置
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server !
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStopPost=/usr/bin/rm -f /root/nginx
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
	5)启动
systemctl daemon-reload
systemctl enable --now nginx
7.访问测试

# 四层负载均衡是没有access日志的,因为在nginx.conf的配置中,access的日志格式是配置在http下的,而四层负载均衡配置是在http以外的
如果我们需要日志的话,需要配置在stream下面
stream {
	log_format  proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
		'"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
	access_log /var/log/nginx/proxy.log proxy;
	
    upstream lbtcp {
    	server 172.16.1.5:80;
    	server 172.16.1.6:80;
    }
    server {
    	listen 80;
    	proxy_pass lbtcp;			# 转发的链接池
    	proxy_connect_timeout 1s;	 # 连接池中的IP链接的超时时间
         proxy_timeout 3s;			# 返回数据的超时时间
    }
}
# 查看所有web服务器的日志
tail -f /var/log/nginx/access.log

1.5 四层负载均衡的端口转发

1.请求负载均衡的5555端口,跳转到web01的22端口
配置
stream {
    upstream ssh_7 {
        server 10.0.0.7:22;
    }
 
    server {
        listen 5555;
        proxy_pass ssh_7;
    }
}

2.请求负载均衡的6666端口,跳转至172.16.1.51:3306
stream {
    upstream db_51 {
        server 172.16.1.51:3306;
    }
 
    server {
        listen 6666;
        proxy_pass db_51;
    }
}

2. Nginx动静分离、资源分离

什么是动静分离?

动静分离,通过中间件将动态请求和静态请求进行分离。
# 为什么要动静分离?
	通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时。
一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。

2.1 一台机器动静资源分离

修改web机器的配置文件即可
server {
    listen 80;
    server_name www.lty007.com;
 
    location / {
        root /code/wordpress;
        index index.php;
    }
 
    location ~* \.(jpg|png|gif)$ {		# 静态文件location
        root /code/wordpress;
    }
 
    location ~* \.php$ {		# 动态文件location
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /code/wordpress/$fastcgi_script_name;
        include fastcgi_params;
    }
}

2.2 多台机器动静分离

我们根据眼下所学的知识以及拥有的环境,选择了一种能模拟出多台机器实现动静分离的方案。
在这个方案中我们需要
# 配置好两台七层负载均衡的静态资源配置文件
upstream web {
    server 192.168.174.7:80;
    server 192.168.174.8:80;
    server 192.168.174.9:80;
    }
server {
	listen 80;
	server_name www.lty.com;
    }
 
    location ~* \.(jpg|png|gif)$ {		# 静态文件location
        root /opt/static
    }
 
    location ~* \.php$ {		# 动态文件location
        proxy_pass http://web;
        include proxy_params;
    }
}
# 将web服务器上的静态文件都推送至七层负载均衡服务器指定目录下,同一用户并授权
# 在七层负载均衡服务器上安装nfs-utils以及rpcbind
# 在nfs服务器上创建挂载点
# 将七层负载均衡服务器上静态文件目录挂载至nfs
# 重启n七层负载均衡服务器nginx服务,并访问测试。

这样可以实现当用户访问静态资源时,请求先经过四层负载均衡转发至七层负载均衡,而静态文件都存放在七层负载均衡的静态资源目录下并通过nfs共享,这样就可以直接把资源返回给用户,而不需要再将请求转发给web服务器,从而减少了一层网络转发,提升了访问速度。

2.3 Nginx 资源分离

1.环境准备
lb01负载均衡一台,三台web服务器,分别为Android页面,Phone页面,PC端页面
2.配置web01
server {
    listen 80;
    server_name www.test.com;
    charset utf8;
 
    location / {
        root /code/android;
        index index.html;
    }
}
systemctl restart nginx
mkdir  -p /code/android
echo "这是android页面!" >> /code/android/index.html
chown -R www.www /code/android/
访问测试

3.配置web02服务器
server {
    listen 80;
    server_name www.test.com;
    charset utf8;
 
    location / {
        root /code/iphone;
        index index.html;
    }
}
systemctl restart nginx
mkdir -p /code/iphone
echo "这是Iphone页面!" >> /code/iphone/index.html
chown -R www.www /code/iphone/
访问测试

4.配置web03服务器
server {
    listen 80;
    server_name www.test.com;
    charset utf8;
 
    location / {
        root /code/pc;
        index index.html;
    }
}
systemctl restart nginx
mkdir -p /code/pc
echo "这是pc端!" >> /code/pc/index.html
chown -R www.www /code/
访问测试

5.配置负载均衡
upstream android {
    server 172.16.1.7;
}
 
upstream iphone {
    server 172.16.1.8;
}
 
upstream pc {
    server 172.16.1.9;
}
 
server {
    listen 80;
    server_name www.test.com;
 
    location / {
        if ($http_user_agent ~* "Android") { # 判断如果是安卓端
            proxy_pass http://android;       # 则代理到android虚拟主机池
        }
        if ($http_user_agent ~* "iPhone") {  # 判断如果是苹果端
            proxy_pass http://iphone;        # 则代理到iphone虚拟主机池
        }
        if ($http_user_agent ~* "WOW64") { # 判断如果是IE浏览器
            return 403;                    # 则直接返回403
        }
        proxy_pass http://pc;               # 如果没有匹配到以上内容,默认都代理到pc虚拟主机池
        include proxy_params;
    }
}
重启nginx并访问测试

3. Nginx的rewrite重写

3.1 什么是rewrite

Rewrite主要实现地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程

3.2 rewrite可以做什么

1.地址跳转,用户访问到某个URL时,将其重定向至一个新的域名
2.协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
3.伪静态,将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时建立动态URL地址对外暴露过多的参数,提升更高的安全性。
4.搜索引擎,SEO优化依赖于URL路径,好记的URL便于搜索引擎录入

3.3 如何使用rewrite

rewrite语法
Syntax: rewrite regex replacement [flag];
Default:    —
Context:    server, location, if
 
rewrite         # 模块命令
regex           # 请求的链接(支持正则表达式)
replacement     # 跳转的链接
[flag];         # 标签
 
location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
    return  403;
}

3.4 rewrite标记flag

rewrite指令根据表达式来重定向URL,或者修改字符串,可以应用于server,location,if环境下,每行rewrite指令最后跟一个flag标记,支持的flag标记如下表:
flag 作用
last 本条匹配规则匹配完成后,停止匹配,不在匹配后面的规则
break 本条匹配规则匹配完成后,停止匹配,不在匹配后面的规则
redirect 返回302临时重定向,地址栏会显示跳转后的地址
permanent 返回301永久重定向,地址栏会显示跳转后的地址

3.4.1 last与break的区别

break只要匹配到规则,就会去本地配置路径的目录中寻找请求的文件;但last只要匹配到规则,会对其所在的server(...)标签重新发起请求。
配置
server {
    listen 80;
    server_name linux.rewrite.com;
    root /code;
 
    location ~ ^/break {
        rewrite ^/break /test/ break;
    }
    location ~ ^/last {
        rewrite ^/last /test/ last;
    }
    location /test/ {
        default_type application/json;
        return 200 "ok";
    }   
}
break请求:
1.请求linux.rewrite.com/break
2.匹配 location ~^/break 会跳转到 linux.rewrite.com/test
3.请求跳转后,回去查找本地站点目录下的 /test
4.如果找到了,则返回/code/test/index.html的内容;
5.如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403
 
last请求:
1.请求linux.rewrite.com/last
2.匹配 location ~ ^/last 会跳转到 linux.rewrite.com/test
3.如果找到了,则返回/code/test/index.html的内容;
4.如果没有找到,会重新对当前server发起请求,这个时候访问地址就变成 linux.rewrite.com/test
5.重新请求server会匹配到 location /test/ 直接返回该location的内容
6.如果也没有location匹配,再返回404;

3.4.2 redirect与permanent的区别

server {
    listen 80;
    server_name linux.rewrite.com;
    root /code;
 
    location /test {
        rewrite ^(.*)$ https://www.baidu.com redirect;
        #rewrite ^(.*)$ https://www.baidu.com permanent;
    }
}
访问测试
# 关闭nginx访问测试
1.配置redirect时,访问失败,直接拒绝访问
2.配置permanent时,访问成功,继续进行跳转,清楚缓存后访问失败
结论:
1.redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
2.permanent: 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。

3.5 rewrite的伪静态

1.搭建wordpress	# 默认已安装nginx和php
创建站点目录
mkdir /code
下载代码包
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
解压
tar -xf latest-zh_CN.tar.gz
授权站点目录
chown -R www.www wordpress
编写配置文件
server {
    listen 80;
    server_name www.test.com;
    location / {
        root /code/wordpress/;
		index index.html index.php;
    }
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
systemctl restart nginx
根据页面提示操作
需要创建数据库
# 建库
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.00 sec)
# 授权用户
MariaDB [(none)]> grant all on discuz.* to discuz@'172.16.1.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

# 配置伪静态
vim /etc/nginx/conf.d/www.lty006.com.conf
server {
    listen 80;
    server_name linux.discuz.com;
    root /code/discuz/upload;
 
    location / {
        root /code/discuz/upload;
        index index.php;
 
        rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
        rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
        rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
        rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
        rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
        rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
        rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
        rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/archiver/index.php?action=$2&value=$3 last;
        rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
        if (!-e $request_filename) {
                return 404;
        }
    }
 
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
# 访问测试
posted @ 2021-08-20 20:15  堇雪月寒风  阅读(150)  评论(0编辑  收藏  举报
Live2D