当前位置: 首页 > news >正文

nginx+tomcat动静分离、负载均衡

一、理论
nginx用于处理静态页面以及做调度器,tomcat用于处理动态页面

lvs(四层)
轮询(rr)
加权轮询(wrr)
最小连接(lc)
加权最小连接(wlc)

nginx(四层、七层)
轮询(rr)
最小连接(leastconn)
ip哈希(ip_hash)

haproxy(四层、七层)
轮询(roundrobin)
加权轮询(static-rr)
最小连接(leastconn)
源地址哈希(source)

调度器和代理服务器的区别
代理服务器:客户端的请求和服务器的应答都通过代理服务器来传输。

调度器:
    NAT  客户端的请求和服务器的应答都通过代理服务器来传输。
    DR   客户端的请求通过调度器传输,服务器直接应答给客户端,不经过调度器。
    TUN  客户端的请求通过调度器传输,服务器直接应答给客户端,不经过调度器。
 

二、实践

1、实验环境
tomcat1 192.168.10.101
tomcat2 192.168.10.102
nginx 	192.168.10.103
2、过程
[root@tomcat1 ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.8.tar.gz  jdk-8u102-linux-x64.rpm
[root@tomcat1 ~]# java -version
-bash: java: 未找到命令
[root@tomcat1 ~]# dnf -y install jdk-8u102-linux-x64.rpm 
[root@tomcat1 ~]# java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
[root@tomcat1 ~]# tar xf apache-tomcat-9.0.8.tar.gz 
[root@tomcat1 ~]# mv apache-tomcat-9.0.8/ /usr/local/tomcat9
[root@tomcat1 ~]# /usr/local/tomcat9/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat9
Using CATALINA_HOME:   /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 ~]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      2401/java   
[root@tomcat1 ~]# mkdir -pv /web/webapp1
mkdir: 已创建目录 '/web'
mkdir: 已创建目录 '/web/webapp1'
[root@tomcat1 ~]# cat /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<title>JSP test1 page</title> </head>
<body>
<% out.println("动态页面1,http://www.ooos.com");%> </body>
<body>
<div>静态页面的图片1 </div><br><img src="logo.png">
</body></html>[root@tomcat1 ~]# vim /usr/local/tomcat9/conf/server.xml<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">……略<Context docBase="/web/webapp1" path="" reloadable="false"></Context></Host>
[root@tomcat1 ~]# /usr/local/tomcat9/bin/shutdown.sh
[root@tomcat1 ~]# /usr/local/tomcat9/bin/startup.sh[root@tomcat2 ~]# ls
anaconda-ks.cfg  apache-tomcat-9.0.8.tar.gz  jdk-8u102-linux-x64.rpm
[root@tomcat2 ~]# java -version
-bash: java: 未找到命令
[root@tomcat2 ~]# dnf -y install jdk-8u102-linux-x64.rpm 
[root@tomcat2 ~]# java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
[root@tomcat2 ~]# tar xf apache-tomcat-9.0.8.tar.gz 
[root@tomcat2 ~]# mv apache-tomcat-9.0.8/ /usr/local/tomcat9
[root@tomcat2 ~]# /usr/local/tomcat9/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat9
Using CATALINA_HOME:   /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat2 ~]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      2401/java   
[root@tomcat2 ~]# mkdir -pv /web/webapp1
mkdir: 已创建目录 '/web'
mkdir: 已创建目录 '/web/webapp1'
[root@tomcat2 ~]# cat /web/webapp1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<title>JSP test2 page</title> </head>
<body>
<% out.println("动态页面2,http://www.sooo.com");%> </body>
<body>
<div>静态页面的图片2 </div><br><img src="logo.png">
</body></html>[root@tomcat2 ~]# vim /usr/local/tomcat9/conf/server.xml<Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">……略<Context docBase="/web/webapp1" path="" reloadable="false"></Context></Host>
[root@tomcat2 ~]# /usr/local/tomcat9/bin/shutdown.sh
[root@tomcat2 ~]# /usr/local/tomcat9/bin/startup.sh[root@nginx ~]# dnf -y install gcc* make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker
[root@nginx ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# ls
anaconda-ks.cfg  logo.png  nginx-1.26.3.tar.gz
[root@localhost ~]# tar zxf nginx-1.26.3.tar.gz 
[root@localhost ~]# cd nginx-1.26.3
[root@localhost nginx-1.26.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre
[root@localhost nginx-1.26.3]# make -j$(nproc) && make install[root@localhost nginx-1.26.3]# cat /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>静态页面</title>
<style>
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是个静态页面</p>
</body>
</html>
[root@localhost nginx-1.26.3]# vim /usr/local/nginx/conf/nginx.conf
http {……略
upstream tomcat_server {server 192.168.10.101:8080 weight=1;server 192.168.10.102:8080 weight=1;
}server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location ~.*.jsp$ {proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Client-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://tomcat_server;}注: 	~是匹配规则 用于正则url前,表示url包含正则表达式,区分大小写。.*两者组合表示匹配任意个字符串, .表示匹配除换行外任意一个字符串,*表示匹配0个或多个字符串。. 表示匹配除换行外任意一个字符串。jsp$ 表示匹配以jsp结尾的。proxy_set_header HOST $host;+ proxy_set_header表示设置请求头,HOST是变量名,$host是变量值,$host是nginx内置的函数,用于表示请求的虚拟主机。该值会封装在请求头中,用于请求tomcat中的具体虚拟主机。(该参数仅在后端服务器是tomcat时添加,因为tomcat中使用<Host></Host>标签符来表示虚拟主机,传递给tomcat时,tomcat通过该请求头就能知道客户端请求的是哪个虚拟主机,给它提供服务。如果不添加,访问网站会显示400 bad request。)proxy_set_header X-Real-IP $remote_addr; proxy_set_header表示设置请求头,X-Real-IP是变量名, $remote_addr是变量值,$remote_addr是nginx内置的函数,用于表示客户端的ip地址。 该值用于传递给tomcat使用,客户端通过代理访问tomcat,在tomcat上更改日志设置,即可在tomcat的访问日志中会显示客户端的真实IP地址。proxy_set_header Client-IP $remote_addr;  proxy_set_header表示设置请求头,Client-ip是变量名 $remote_addr是变量值,$remote_addr是nginx内置的函数,用于表示客户端的IP地址。该值会封装在请求头中,交给代理服务器使用。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header表示设置请求头,X-Forwarded-For是变量名,$proxy_add_x_forwarded_for是变量值,$proxy_add_x_forwarded_for是nginx内置的函数,用于将客户端的ip地址传递给后端真实服务器。在多层代理中(例如,nginx01代理四层,nginx02代理七层,nginx01将请求发送给nginx02,nginx02再将请求发送给后端真实服务器)需要获取客户端的真实ip,就加上该参数即可。该参数会逐级传递客户端的真实ip。location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {root /usr/local/nginx/html/img;expires 30d;}注:expires 设置缓存,30d表示缓存30天。location / {root   html;index  index.html index.htm;}
}
}[root@localhost ~]# mkdir /usr/local/nginx/html/img
[root@localhost ~]# cp logo.png /usr/local/nginx/html/img/
[root@localhost ~]# /usr/local/nginx/sbin/nginx 
[root@localhost sbin]# curl 192.168.10.103
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>静态页面</title>
<style>
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是个静态页面</p>
</body>
</html>
[root@localhost sbin]# curl 192.168.10.103/index.jsp<html>
<head>
<title>JSP test1 page</title> </head>
<body>
动态页面1,http://www.ooos.com</body>
<body>
<div>静态页面的图片1 </div><br><img src="logo.png">
</body></html>[root@localhost sbin]# curl 192.168.10.103/index.jsp<html>
<head>
<title>JSP test1 page</title> </head>
<body>
动态页面2,http://www.sooo.com</body>
<body>
<div>静态页面的图片2 </div><br><img src="logo.png">
</body></html>tomcat server.xmlpattern="%{X-Real-IP}i"

http://www.xdnf.cn/news/779869.html

相关文章:

  • JavaScript性能优化实战:从核心原理到工程实践的全流程解析
  • 【大模型:知识图谱】--1.py2neo连接图数据库neo4j
  • Neo4j 数据建模:原理、技术与实践指南
  • Java详解LeetCode 热题 100(25):LeetCode 141. 环形链表(Linked List Cycle)详解
  • JVM—垃圾收集算法和HotSpot算法实现细节
  • Kerberos面试内容整理-Kerberos 的配置与排障
  • 力扣每日一题——分发糖果
  • React Native图片预加载:让你的应用图片预览像德芙一样丝滑
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题
  • Python趣学篇:从零打造智能AI井字棋游戏(Python + Tkinter + Minimax算法)
  • 编译 Linux openssl
  • 黑客利用GitHub现成工具通过DevOps API发起加密货币挖矿攻击
  • C++语法系列之类型转换
  • Catboost算法原理及应用场景
  • 生成对抗网络(GAN)基础原理深度解析:从直观理解到形式化表达
  • C语言学习—数据类型20250603
  • NLP学习路线图(二十):FastText
  • K8S上使用helm部署 Prometheus + Grafana
  • Grafana-State timeline状态时间线
  • 乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(六):图片上传功能
  • Linux(线程概念)
  • 《深入解析SPI协议及其FPGA高效实现》-- 第三篇:FPGA实现关键技术与优化
  • Docker 安装 Centos
  • Python与数据分析期末复习笔记
  • Web3如何重塑数据隐私的未来
  • LeetCode 139. 单词拆分(Word Break) - 动态规划深度解析
  • SVM详解
  • GROM快速上手
  • Java线程状态及其流转