四层负载均衡,资源分离以及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;
}
}
# 访问测试