01.四层负载概念
02.四层实现对端口转发
1.克隆一台10.0.0.4
2.安装部署nginx服务
[root@lb:~]#
scp 10.0.0.7:/etc/yum.repos.d/nginx.repo /etc/yum.repos.d/
[root@lb:~]#yum -y install nginx
3.配置nginx四层负载
[root@lb:~]#rm -rf /etc/nginx/conf.d/default.conf
# 删除默认七层配置
[root@lb:~]#cd /etc/nginx/
[root@lb:nginx]#vim nginx.conf
...
events {
worker_connections 1024;
}
include /etc/nginx/conf.c/*.conf;
# 添加一行配置包含引用conf.c下的所有conf文件
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
...
[root@lb:nginx]#mkdir conf.c
[root@lb:nginx]#cd conf.c
[root@lb:conf.c]#cat lb.conf
stream {
upstream lb {
server 172.16.1.7:22;
}
server {
listen 2222;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass lb;
}
}
检测语法重启服务
[root@lb:conf.c]#nginx -t
[root@lb:conf.c]#systemctl restart nginx
4.xshell远程连接10.0.0.4的2222端口
[c:\~]$ ssh 10.0.0.4 2222
查看连接是否为web01
[root@web01:~]#
转发3333端口连接后端服务器172.16.1.8:22端口
[root@lb:conf.c]#cat lb.conf
stream {
upstream lb {
server 172.16.1.7:22;
}
server {
listen 2222;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass lb;
}
upstream web02 {
server 172.16.1.8:22;
}
server {
listen 3333;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass web02;
}
}
检测语法重启服务
[root@lb:conf.c]#nginx -t
[root@lb:conf.c]#systemctl restart nginx
[c:\~]$ ssh 10.0.0.4 3333
[root@web02:~]#
03.业务四层转发
[root@lb:conf.c]#cat lb.conf
stream {
upstream lb {
server 172.16.1.5:80;
server 172.16.1.5:80;
}
server {
listen 80;
proxy_connect_timeout 3s;
proxy_timeout 3s;
proxy_pass lb;
}
}
hosts解析
10.0.0.4 www.wp.com www.zh.com www.she.com www.admin.com
面试题:
LVS的几种模式
1.DR模式 修改目标地址
2.NAT模式 代理
3.TUN模式 隧道模式
4.FULL NAT模式
04.单台实现动静分离
1.部署java
[root@web01:~]#yum -y install java
2.部署tomcat服务
官网: https://tomcat.apache.org
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.28/bin/apache-tomcat-10.1.28.tar.gz
解压代码:
[root@web01:~]#tar xf apache-tomcat-10.1.28.tar.gz -C /usr/local/
启动tomcat服务
[root@web01:~]#/usr/local/apache-tomcat-10.1.28/bin/startup.sh
停止tomcat服务
[root@web01:~]#/usr/local/apache-tomcat-10.1.28/bin/shutdown.sh
查看tomcat是否启动:
[root@web01:~]#netstat -tnulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1061/php-fpm: maste
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3581/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1064/sshd: /usr/sbi
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 7795/java
tcp6 0 0 :::8080 :::* LISTEN 7795/java
tomcat的代码目录
[root@web01:~]#ll /usr/local/apache-tomcat-10.1.28/webapps/ROOT/
total 164
-rw-r----- 1 root root 27235 Aug 2 23:14 asf-logo-wide.svg
-rw-r----- 1 root root 713 Aug 2 23:14 bg-button.png
-rw-r----- 1 root root 1918 Aug 2 23:14 bg-middle.png
-rw-r----- 1 root root 1401 Aug 2 23:14 bg-nav.png
-rw-r----- 1 root root 3103 Aug 2 23:14 bg-upper.png
-rw-r----- 1 root root 21630 Aug 2 23:14 favicon.ico
-rw-r----- 1 root root 12241 Aug 2 23:14 index.jsp
-rw-r----- 1 root root 6776 Aug 2 23:14 RELEASE-NOTES.txt
-rw-r----- 1 root root 5584 Aug 2 23:14 tomcat.css
-rw-r----- 1 root root 67795 Aug 2 23:14 tomcat.svg
drwxr-x--- 2 root root 21 Aug 13 10:13 WEB-INF
3.配置nginx代理tomcat服务
[root@web01:conf.d]#cat tomcat.conf
server {
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
[root@web01:conf.d]#nginx -t
[root@web01:conf.d]#systemctl restart nginx
windows的hosts解析
10.0.0.7 www.tomcat.com
静态文件拆分:
[root@web01:conf.d]#cat tomcat.conf
server {
listen 80;
server_name www.tomcat.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
location ~ \.(svg|png|jpg|jpeg)$ {
root /code;
}
}
[root@web01: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@web01:conf.d]#systemctl restart nginx
将tomcat下的图片拷贝到/code目录
[root@web01:conf.d]#cp /usr/local/apache-tomcat-10.1.28/webapps/ROOT/tomcat.svg /code/
[root@web01:conf.d]#ll /code/
total 92
drwxr-xr-x 13 root root 4096 Aug 9 11:57 admin
drwxr-xr-x 2 root root 138 Aug 12 14:59 index
-rw-r--r-- 1 root root 17 Aug 9 09:39 index.html
-rw-r--r-- 1 root root 331 Aug 6 15:37 mysql.php
drwxr-xr-x 7 www www 336 Aug 7 11:45 she
-rw-r----- 1 root root 67795 Aug 13 10:29 tomcat.svg # tom猫的图片
修改文件的权限: 因为使用的是nginx代理,所以nginx运行用户www需要对tomcat.svg有读的权限
[root@web01:~]#ll /code/tomcat.svg
-rw-r----- 1 root root 67795 Aug 13 10:29 /code/tomcat.svg
[root@web01:~]#chown www.www /code/tomcat.svg
[root@web01:~]#ll /code/tomcat.svg
-rw-r----- 1 www www 67795 Aug 13 10:29 /code/tomcat.svg
05.动静分离实战
系统 作用 服务 地址
麒麟 负载均衡 nginx proxy 10.0.0.5
麒麟 静态资源 nginx static 10.0.0.7
麒麟 动态资源 tomcat server 10.0.0.8
1.WEB02准备静态资源
[root@web01:conf.d]#cat static.conf
server {
listen 80;
server_name pic.lzy.com;
root /code;
index index.html;
location ~* .*\.(jpg|png|gif)$ {
root /code/images;
}
}
[root@web01:conf.d]#echo web01.... > /code/index.html
上传一张图片到/code/iamges下
[root@web01:conf.d]#mkdir /code/images
[root@web01:conf.d]#mv 4.png /code/images/
[root@web01:conf.d]#nginx -t
[root@web01:conf.d]#systemctl restart nginx
hosts解析
10.0.0.7 pic.lzy.com
pic.lzy.com/4.png
WEB02准备动态资源
安装java运行环境
[root@web02:~]#yum -y install java
[root@web02:~]#scp -r 10.0.0.7:/usr/local/apache-tomcat-10.1.28/ /usr/local/
[root@web02:~]#cd /usr/local/
[root@web02:local]#ln -s apache-tomcat-10.1.28/ tomcat
[root@web02:~]#cat /usr/local/tomcat/webapps/ROOT/java.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<HTML>
<HEAD>
<TITLE>oldboy JSP Page</TITLE>
</HEAD>
<BODY>
<%
Random rand = new Random();
out.println("<h1>oldboy随机数:<h1>");
out.println(rand.nextInt(99)+100);
%>
</BODY>
</HTML>
启动tomcat
[root@web02:~]#/usr/local/tomcat/bin/startup.sh
负载均衡实现调度:
[root@lb01:~]#cd /etc/nginx/conf.d/
[root@lb01:conf.d]#cat ds.conf
upstream static {
server 172.16.1.7:80;
}
upstream java {
server 172.16.1.8:8080;
}
server {
listen 80;
server_name pic.lzy.com;
location ~* \.(jpg|png|gif)$ {
proxy_pass http://static;
proxy_set_header Host $http_host;
}
location ~ \.jsp {
proxy_pass http://java;
proxy_set_header Host $http_host;
}
}
[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
通过负载均衡可以访问动态
通过负载均衡可以访问静态
将动态页面和静态页面集成到负载均衡的index.html的首页中。
里面配置的是接口。
[root@lb01:conf.d]#cat ds.conf
upstream static {
server 172.16.1.7:80;
}
upstream java {
server 172.16.1.8:8080;
}
server {
listen 80;
server_name pic.lzy.com;
root /code; # 指定默认的代码目录
index index.html; # 返回默认的页面
location ~* \.(jpg|png|gif)$ {
proxy_pass http://static;
proxy_set_header Host $http_host;
}
location ~ \.jsp {
proxy_pass http://java;
proxy_set_header Host $http_host;
}
}
[root@lb01:conf.d]#nginx -t
[root@lb01:conf.d]#systemctl restart nginx
创建代码文件:
[root@lb01:~]#mkdir /code
[root@lb01:~]#vim /code/index.html
[root@lb01:~]#cat /code/index.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>测试ajax和跨域访问</title>
<script src="http://libs.baidu.com/jquery/
2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://pic.lzy.com/java.jsp",
success: function(data){
$("#get_data").html(data)
},
error: function() {
alert("哎呦喂,失败了,回去检查你服务去~");
}
});
});
</script>
<body>
<h1>测试动静分离</h1>
<img src="http://pic.lzy.com/4.png">
<div id="get_data"></div>
</body>
</html>
访问测试首页:
10.0.0.5 pic.lzy.com
测试动静分离:
1.停止静态资源访问动态
WEB01:
[root@web01:~]#systemctl stop nginx
访问主页:
pic.lzy.com
测试完成后启动 nginx
[root@web01:~]#systemctl start nginx
2.停止动态资源访问静态
[root@web02:~]#/usr/local/tomcat/bin/shutdown.sh
06.按照客户端转发到不同业务
系统版本 主机角色 外网IP 内网IP 提供端口
麒麟 负载均衡 10.0.0.5 172.16.1.5 80
麒麟 提供Android页面 172.16.1.7 9090
麒麟 提供Iphone页面 172.16.1.7 9091
麒麟 提供pc页面 172.16.1.7 9092
WEB01配置基于多端口实现不同的业务:
[root@web01:~]#cd /etc/nginx/conf.d/
[root@web01:conf.d]#
[root@web01:conf.d]#cat m.conf
server {
listen 9090;
server_name _;
location / {
root /code/m/android;
index index.html;
}
}
[root@web01:conf.d]#mkdir /code/m/android -p
echo 您是使用的Android操作系统 > /code/m/android/index.html
[root@web01:conf.d]#nginx -t
[root@web01:conf.d]#systemctl restart nginx
中文乱码问题:
[root@web01:conf.d]#grep charset ../nginx.conf
charset utf-8,gbk; # 主配置文件增加字符集
[root@web01:conf.d]#systemctl restart nginx
整体配置:
[root@web01:conf.d]#cat m.conf
server {
listen 9090;
server_name _;
location / {
root /code/m/android;
index index.html;
}
}
server {
listen 9091;
server_name _;
location / {
root /code/m/iphone;
index index.html;
}
}
server {
listen 9092;
server_name _;
location / {
root /code/m/pc;
index index.html;
}
}
[root@web01:conf.d]#mkdir /code/m/{iphone,pc}
[root@web01:conf.d]#echo 您是使用的是iphone访问的 > /code/m/iphone/index.html
[root@web01:conf.d]#echo 您是使用的是pc浏览器访问的 > /code/m/pc/index.html
[root@web01:conf.d]#nginx -t
[root@web01:conf.d]#systemctl restart nginx
Nginx根据客户端UA的信息来决定转发到具体的业务
[root@lb01:conf.d]#cat m.conf
upstream android {
server 172.16.1.7:9090;
}
upstream iphone {
server 172.16.1.7:9091;
}
upstream pc {
server 172.16.1.7:9092;
}
server {
listen 80;
server_name sj.lzy.com;
charset 'utf-8';
location / {
#如果客户端来源是Android则跳转到Android的资源;
if ($http_user_agent ~* "Android") {
proxy_pass http://android;
}
#如果客户端来源是Iphone则跳转到Iphone的资源;
if ($http_user_agent ~* "Iphone") {
proxy_pass http://iphone;
}
#如果客户端是IE浏览器则返回403错误;
if ($http_user_agent ~* "MSIE") {
return 403;
}
#默认跳转pc资源;
proxy_pass http://pc;
}
}
[root@lb01:conf.d]#nginx -t
[root@lb01:conf.d]#systemctl restart nginx
hosts解析
10.0.0.5 sj.lzy.com
06.作业:
1.四层转发
2222--->172.16.1.7:22
3333--->172.16.1.8:22
4444--->172.16.1.51:3306 # 测试
web01安装mysql: mysql -h 10.0.0.4 -p4444 -ulzy -plzy123.com
www.wp.com--->四层--->七层 172.16.1.5 172.16.1.6
2.单台实现动静分离
部署java
部署tomcat
通过nginx反向代理到tomcat
使用location拆分图片 tomcat首页图片
3.集群实现动静分离
准备静态资源
准备动态资源
负载均衡集成动态和静态为一个页面
4.通过UA判断客户端,转发到不同的业务。
07.四层负载均衡和七层负载均衡
四层负载均衡(L4)
适用场景:
TCP 应用:
数据库服务:
当你需要负载均衡数据库连接(如 MySQL、PostgreSQL)时,使用四层负载均衡。
数据库通常使用 TCP 连接,四层负载均衡可以处理这些连接的分发。
示例: 你有一个高流量的 MySQL 数据库集群,
使用四层负载均衡可以将数据库请求分发到多个数据库实例,
提高处理能力和容错性。
自定义协议:
专有协议: 如果你的应用使用自定义的网络协议而不是 HTTP,
四层负载均衡是合适的。
它能够处理不同于 HTTP 的数据流,如自定义的 TCP 协议。
示例: 你在使用一个自定义的消息队列服务,
该服务基于 TCP 协议进行通信。
四层负载均衡可以将消息流量均匀地分配到多个消息队列服务器。
高性能要求:
需要低延迟: 四层负载均衡处理的层次较低,
通常在性能要求较高的场景下使用,
因为它直接转发 TCP 连接,减少了处理延迟。
示例: 你有一个金融交易系统,
需要快速处理大量的实时交易数据。
四层负载均衡可以提供低延迟的连接分发。
七层负载均衡(L7)
适用场景:
Web 应用:
HTTP/HTTPS 服务: 七层负载均衡适用于 Web 应用,
它可以根据 HTTP 请求的内容(如 URL 路径、主机名、请求头)来决定如何路由请求。
示例:
你有一个电商网站,
需要根据不同的请求路径将流量分发到不同的微服务(如产品服务、支付服务)。
七层负载均衡可以根据请求的 URL 路径将流量转发到相应的服务。
内容路由:
基于内容的路由:
如果你需要根据请求的具体内容(如请求头、参数)来决定请求的路由,
七层负载均衡可以进行内容解析和分发。
示例:
你有一个视频流服务,根据用户请求的区域或语言将视频流分发到不同的服务器群组。
七层负载均衡可以基于请求的内容来做出这些决策。
应用层优化:
缓存和压缩:
七层负载均衡支持应用层的优化,
如缓存、压缩和内容替换,提升应用的性能和响应速度。
示例:
你有一个高流量的新闻网站,
使用七层负载均衡来缓存静态内容(如图片、文章),
减少服务器的负载并加快页面加载速度。
安全和认证:
SSL/TLS 终止: 七层负载均衡可以在负载均衡器处终止 SSL/TLS 连接,
简化后端服务器的安全管理。
示例: 你有一个需要处理大量 HTTPS 请求的在线服务,
七层负载均衡器可以处理 SSL/TLS 解密,
然后将解密后的流量发送到内部服务器。
总结
四层负载均衡(L4): 适用于处理低层次的网络流量,
如 TCP 连接,通常用于数据库、消息队列等需要高性能和低延迟的场景。
七层负载均衡(L7):
适用于处理基于 HTTP 的应用流量,支持更复杂的路由和内容处理,
通常用于 Web 应用、内容分发和应用层优化。
选择合适的负载均衡类型可以帮助你优化应用性能、
提升用户体验,并确保系统的高可用性和可扩展性。
08.nginx 参数
proxy_pass http://my_app;:将请求转发到 my_app。
proxy_set_header Host $host;:传递原始请求中的 Host 头。
proxy_set_header X-Real-IP $remote_addr;:设置客户端的实际 IP 地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:将客户端 IP 地址添加到 X-Forwarded-For 头部,支持链式代理。
proxy_set_header X-Forwarded-Proto $scheme;:传递原始请求的协议(http 或 https)。