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

一、理论

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

lvs(四层)

轮询(rr)

加权轮询(wrr)

最小连接(lc)

加权最小连接(wlc)

nginx(四层、七层)

轮询(rr)

最小连接(leastconn)

ip哈希(ip_hash)

haproxy(四层、七层)

轮询(roundrobin)

加权轮询(static-rr)

最小连接(leastconn)

源地址哈希(source)

调度器和代理服务器的区别

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

调度器:

NAT 客户端的请求和服务器的应答都通过代理服务器来传输。

DR 客户端的请求通过调度器传输,服务器直接应答给客户端,不经过调度器。

TUN 客户端的请求通过调度器传输,服务器直接应答给客户端,不经过调度器。

二、实践

bash 复制代码
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.xml

pattern="%{X-Real-IP}i"
相关推荐
Evan芙3 小时前
Nginx 平滑升级
数据库·nginx·ubuntu
BD_Marathon8 小时前
【JavaWeb】乱码问题_响应乱码问题
tomcat
BD_Marathon8 小时前
【JavaWeb】乱码问题_HTML_Tomcat日志_sout乱码问题
java·tomcat·html
Evan芙9 小时前
Nginx 安装教程(附Nginx编译安装脚本)
windows·nginx·postgresql
invicinble9 小时前
nginx的基本认识
运维·nginx
爆肝疯学大模型9 小时前
http转https,免费快速申请证书并实现nginx配置
nginx·http·https
qinyia9 小时前
通过 Wisdom SSH AI 助手部署和配置 Nginx Web 服务器
人工智能·nginx·ssh
嘻哈baby10 小时前
Nginx反向代理与负载均衡实战指南
运维·nginx·负载均衡
C1829818257510 小时前
Dubbo负载均衡实现原理
python·负载均衡·dubbo
qq_3482318510 小时前
Kubernetes 高级路由完整配置指南-- 云原生负载均衡架构
云原生·kubernetes·负载均衡